给远程连接加层加密铠甲,OpenSSH 全攻略

Linux OpenSSH 服务管理

环境准备

准备两台虚拟机:

  • server 虚拟机,并设置ip地址为10.1.8.10/24。
  • client 虚拟机,并设置ip地址为 10.1.8.11/24。

设置主机名称和名称解析,以client为例:

# 永久设置主机名# hostnamectl set-hostname client.cyw# 临时设置# hostname client.cyw# 验证# hostnameclient.cyw# 准备名称解析[cyw@client ~17:34:50]# echo "10.1.8.10 server.cyw server10.1.8.11 client.cyw client">>/etc/hosts

IP地址通过图形化配置(nmtui),过程省略。

OpenSSH 服务介绍

SSH 介绍

SSH 全称是Secure Shell,SSH协议是基于应用层的协议,为远程登录会话和其他网络服务提供安全性的协议。

实现此功能的传统方式,如 telnet (终端仿真协议)、 rcp、ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH 提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。

SSH 建立连接的过程

主要分为下面几个阶段:

  1. SSH协议版本协商阶段,SSH目前包括SSH1和SSH2两个大版本。
  2. 密钥和算法协商阶段,SSH支持多种加密算法,双方根据自己和对端支持的算法进行协商,最终决定要使用的算法。
  3. 认证阶段,服务器和客户端互相进行身份验证。
  4. 会话请求阶段,客户端会向服务器端发送会话请求。会话请求分为这样几类:申请对数据传送进行压缩、申请伪终端、启动 X11、TCP/IP 端口转发、启动认证代理等。
  5. 交互会话阶段,会话请求通过后,服务器端和客户端进行信息的交互。例如运行 shell、执行命令、传递文件。

加密类型

  • 对称加密,加密和解密都使用一个钥匙。确保数据的完整性、速度快。
  • 非对称加密,一对钥匙。公钥用来加密数据。私钥用来解密数据。确保数据的安全性。

双向加密过程

SSH协议是基于非对称加密方法的,服务器和客户端都会生成自己的公钥和私钥。

  • 公钥用来加密数据。
  • 私钥用来解密数据。

双向加密过程:

  1. 服务器创建密钥对。远程服务器会在/etc/ssh目录下生成一个名为多个密钥对,例如ecdsa类型的密钥对:ssh_host_ecdsa_key.pub 公钥和 ssh_host_ecdsa_key 私钥。之后每回启动sshd服务的时候,系统会自动在此路径下查找公钥。

客户端请求连接。服务器接到请求后,把公钥传给客户端使用。

  1. 客户端记录服务器公钥并计算自己的公私钥。客户端将服务器传来的公钥记录在**~/.ssh/known_hosts** 中,若是已经记录有该服务器公钥,则比对是否一致,一致后就计算客户端自己的公私钥。
[cyw@client ~10:16:37]$sshserver The authenticity ofhost'server (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:7dcpZSnly4R+ZDtj6CwujeLrZCiEeHOuuABgRrgtP4w. ECDSA key fingerprint is MD5:67:19:cb:52:c7:4f:fc:25:e6:c3:ec:22:c3:61:73:ce. Are you sure you want tocontinueconnecting(yes/no)?yes# 作用:# 1. 接收server提供的公钥,使用这个公钥加密数据发送给对方。# 2. 校验对方的公钥是否正确。(如果本地已经提前存储过对方的公钥了)
  1. 客户端使用服务器的公钥加密自己的公钥并发送给服务器。服务器端拥有客户端公钥+自己私钥,客户端拥有服务器公钥+自己私钥,组成了非对称加密系统。
  2. 双向加解密。服务器发送数据:用客户端公钥加密,客户端收到数据后用自己私钥解密。客户端发送数据:用服务器公钥加密,服务器收到数据后用自己私钥解密。

使用 ssh 访问远端CLI

ssh 工具演示

方式一:只指定IP或主机名

# 通过IP地址[cyw@client ~10:34:01]$ssh10.1.8.10 cyw@10.1.8.10's password: Last login: Thu Jul 23 10:20:37 2026 from client.cyw [cyw@server ~ 10:34:13]$ # 通过主机名称 [cyw@client ~ 10:20:24]$ ssh server cyw@server's password: Last login: Thu Jul2309:39:422026from10.1.8.1[cyw@server ~10:20:37]$

方式二:额外指定用户名

# 指定root用户登录[cyw@client ~10:34:50]$sshroot@server root@server's password: Last login: Wed Jul 22 17:12:57 2026 [root@server ~ 10:35:11]# #或者 [cyw@client ~ 10:35:24]$ ssh -l root server root@server's password: Last login: Thu Jul2310:35:112026from client.cyw[root@server ~10:35:38]#

方式三:额外指定命令

# 同时指定用户和命令[cyw@client ~10:35:46]$sshcyw@serverhostnamecyw@server's password: server.cyw # 注意:shell提示符仍然是本机。 [cyw@client ~ 10:36:12]$ [cyw@client ~ 10:36:26]$ ssh root@server 'hostname;id' #多个命令要加引号,代表是个整体,两个命令之间用分号隔开 root@server's password: server.cywuid=0(root)gid=0(root)=0(root)环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[cyw@client ~10:37:16]$

ssh工具配置文件

参考SSH_CONFIG(5)

[cyw@client ~10:40:39]$manssh_config
  • ~/.ssh/config,用户自己的配置,优先级高于全局配置。文件权限不得高于644。
  • /etc/ssh/ssh_config,全局配置,应用于所有用户。

示例:

[cyw@client ~18:56:56]$mkdir-m700.ssh[cyw@client ~18:57:47]$vim~/.ssh/config[cyw@client ~18:59:15]$>.ssh/known_hosts Host * StrictHostKeyChecking no User root PreferredAuthentications passwordssh[cyw@client ~19:00:50]$chmod600.ssh/config# 清空其他主机秘钥[cyw@client ~19:01:19]$>.ssh/known_hosts# 再次登录不会提示主机key是否校验,验证用户也是root[cyw@client ~19:01:31]$sshserver Warning: Permanently added'server,10.1.8.10'(ECDSA)to the list of known hosts. root@server's password: Last login: Thu Jul2318:55:202026from server.cyw[root@server ~19:01:40]#

参数说明:

  • Host*,匹配所有目标服务器。
  • StrictHostKeyChecking no,连接目标服务器不校验主机key,直接接受。
  • User root,连接目标服务器默认使用cyw账户。
  • PreferredAuthentications password,连接目标服务器使用密码认证。
  • IdentityFile,指定私钥位置。

配置文件权限:建议设置为只能用户自己读写。

[cyw@client ~11:15:10]$chmod777~/.ssh/config[cyw@client ~11:15:51]$sshserver Bad owner or permissions on /home/cyw/.ssh/config[cyw@client ~11:15:59]$chmod600~/.ssh/config[cyw@client ~11:16:09]$sshserver root@server's password: Last login: Thu Jul2311:09:262026from client.cyw

配置 ssh 密钥认证

使用密钥登录,避免输入密码,更安全。

配置过程

#配置前需要先 [cyw@client ~ 19:16:28]$ vim ~/.ssh/config#将'PreferredAuthentications password'屏蔽:# PreferredAuthentications password# 客户端生成密钥对[cyw@client ~11:18:15]$ ssh-keygen Generating public/private rsa key pair.# 私钥保存位置Enterfileinwhichto save the key(/home/cyw/.ssh/id_rsa):`回车`# 私钥加密密码,回车表示不加密Enter passphrase(emptyforno passphrase):`回车# 再次回车Enter same passphrase again:`回车 Your identification has been savedin/home/cyw/.ssh/id_rsa. Your public key has been savedin/home/cyw/.ssh/id_rsa.pub. The key fingerprint is: SHA256:yTAIHeiJsRR1SYdLsuTudEiMh2gPhd5JDtHt19NpnLM cyw@client.cyw The key's randomart image is: +---[RSA 2048]----+ | oB+++o. | |.+.Bo*. | |+=%.B + . o o | |+*oX o = + B | |. * . . S o o | | = . E | | o . | | . | | | +----[SHA256]-----+ # 查看生成的文件 [cyw@client ~ 11:28:10]$ ls .ssh config id_rsa id_rsa.pub known_hosts # 将公钥推动给目标服务器上的目标用户 [cyw@client ~ 11:30:27]$ ssh-copy-id cyw@server /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/cyw/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys cyw@server's password: Number of key(s)added:1Now try logging into the machine, with:"ssh 'cyw@server'"and check tomakesure that only the key(s)you wanted were added.# 验证[cyw@client ~11:31:08]$sshcyw@serverhostnameserver.cyw[cyw@client ~11:32:03]$# 推送公钥相当于:# 将公钥内容保存到目标服务器上目标用户家目录下.ssh/authorized_keys中[cyw@client ~11:32:08]$cat.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDaOT3w1XW8kNGQFALSzlw6UF5BWdqXsgNmXIrhJnBI8tqrOQXiZ/6LU1zkgdKM2NL/IpQ0sy2/WIVlCOAuCDeh1tPJL9oExI4w+51SAp5hcD+Nw5L2yDDEScogdQTeLB6PhasUgYWkznQGq7oZ1NeTlDdOA4iFEBFMqik1j0+wM2tnhS/Q/DC/7yJyIgGvNrIIq4lvGqRAyUKJR+8wyClFbYYLE6WII6BZtatPl7CLJZ751lmKOYFrQ8RZjkCRxK/Mf1+tLfvo5HYCz0m14xyk7zFLL2eTjL6ZNv2oxBG7MquDbpySJ349yH/wEFqbKKtHIfE6epYN0TQc7eCJz//x cyw@client.cyw# 在server端查看[cyw@server ~11:33:59]$cat.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDaOT3w1XW8kNGQFALSzlw6UF5BWdqXsgNmXIrhJnBI8tqrOQXiZ/6LU1zkgdKM2NL/IpQ0sy2/WIVlCOAuCDeh1tPJL9oExI4w+51SAp5hcD+Nw5L2yDDEScogdQTeLB6PhasUgYWkznQGq7oZ1NeTlDdOA4iFEBFMqik1j0+wM2tnhS/Q/DC/7yJyIgGvNrIIq4lvGqRAyUKJR+8wyClFbYYLE6WII6BZtatPl7CLJZ751lmKOYFrQ8RZjkCRxK/Mf1+tLfvo5HYCz0m14xyk7zFLL2eTjL6ZNv2oxBG7MquDbpySJ349yH/wEFqbKKtHIfE6epYN0TQc7eCJz//x cyw@client.cyw# 推给目标主机root用户[root@server ~11:33:44]# mkdir -m 700 .ssh[root@server ~11:33:59]# cp ~cyw/.ssh/authorized_keys .ssh# 客户端验证[cyw@client ~11:33:17]$sshroot@serverhostnameserver.cyw

以非交互方式生成密钥对

[cyw@client ~11:35:54]$ ssh-keygen-trsa-N''-fid_rsa_new Generating public/private rsa key pair. Your identification has been savedinid_rsa_new. Your public key has been savedinid_rsa_new.pub. The key fingerprint is: SHA256:tnb0a0rhEom1dwgncgDEFEYvfkQf5ZpQtSD/cVHTmf0 cyw@client.cyw The key's randomart image is: +---[RSA2048]----+|=Bo+ +oo..o.+||..o * +..+o||.=B=..||.o * X + E||.o S *.||..* +||+ +.||.+..||.o.|+----[SHA256]-----+[cyw@client ~11:37:52]$ls*new* id_rsa_new id_rsa_new.pub

其他选项

# -i 指定私钥位置[cyw@client ~11:38:08]$mv.ssh/id_rsa /tmp/[cyw@client ~11:38:46]$ssh-i/tmp/id_rsa root@serverhostnameserver.cyw# 如果找不到密钥,则使用密码登录# -p 选项指定目标服务器 sshd 服务端口号,默认22[cyw@client ~11:40:21]$ssh-lroot-p1022serverhostnameroot@server's password: server.cyw

控制工具的执行行为有两种方式:

  1. 工具选项
  2. 工具的配置文件(默认)

排故

故障:配置密钥登录后,远程登录仍要需要输入密码验证。

[cyw@client ~13:49:43]$sshroot@serverhostnameroot@server's password:

模拟:将目标主机上目标用户的家目录的权限改为777。

[root@server ~13:53:01]# chmod 777 /root

处理过程:

  1. 查看日志

    # 客户端登录的时候,监控服务端日志[root@server ~13:59:49]# tail -f /var/log/secure......Jul3116:13:41 server sshd[3693]:Authentication refused: bad ownership or modesfordirectory /root......
  2. 发现提示:文件权限有问题。

    查找文件权限

    [root@server ~14:00:44]# ls -ld /rootdrwxrwxrwx.15root root409672313:54 /root#更改权限[root@server ~14:02:42]# chmod 550 /root[root@server ~14:04:04]# ls -ld /rootdr-xr-x---.15root root409672313:54 /root

加固 SSH 服务

补充:

  1. 客户端工具修改完配置文件后,下次执行客户端工具,立刻生效。ssh 工具 /etc/ssh/ssh_config或者~/.ssh/config
  2. 服务器修改完配置文件后,服务程序一直在运行,systemctl reload/restart sshd

配置文件

sshd服务配置文件:/etc/ssh/sshd_config。帮助sshd_config(5)

常见配置:

  • PermitRootLogin prohibit-password,禁止root用户通过密码登录。
  • PermitRootLogin no,禁止 root 用户登录。
  • root用户权限不受限制。
  • root用户存在每个linux系统,只需要猜密码就可以。
  • 从审计角度来看,很难跟踪哪个授权用户以root身份登录并进行了更改。 如果用户必须以普通用户身份登录并切换到root帐户,则会生成一个日志事件,可用于帮助提供问责制。
  • PasswordAuthentication no,禁止用户使用密码登录。
  • AllowUsers exampleuser,允许特定用户登录,该用户可以提权为root。
  • UseDNS no,客户端连接服务器的时候,服务器不需要反向解析服务端IP地址,提高连接速度。

1. 禁止 root 密码登录

环境准备:提前配置好 root 秘钥登录。

[root@server ~17:10:48]# vim /etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin prohibit-password#禁止root用密码登录#重启服务[root@server ~17:12:34]# systemctl reload sshd

连接测试

# 即使使用正确的密码,也无法远程登录[cyw@client ~17:07:50]$sshroot@server Permission denied, please try again. root@server's password: Permission denied, please try again. root@server's password: Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password).# 如果配置了秘钥登录,则需要使用选项强制密码认证[cyw@client ~17:14:49]$ssh-oPreferredAuthentications=password root@server

2. 禁止 root 登录

环境准备:

[root@server ~17:12:37]# vim /etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin no# 重启服务[root@server ~17:15:42]# systemctl reload sshd

连接测试:不管是密码还是秘钥都无法登录

# 即使配置了免密登录,也无法远程登录[cyw@client ~17:14:56]$sshroot@server root@server's password: Permission denied, please try again. root@server's password: Permission denied, please try again. root@server's password: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). # 但是可以使用普通用户登录,然后提权为root用户 [cyw@client ~ 17:18:34]$ ssh cyw@server cyw@server's password: Last login: Thu Jul2317:18:312026from client.cyw[cyw@server ~17:18:40]$su-lroot 密码:[root@server ~17:20:51]#

3. 禁止密码登录

环境准备:

[root@server ~17:16:40]# vim /etc/ssh/sshd_config# 注释原有行#PasswordAuthentication yes# 添加新行,设置为noPasswordAuthentication no[root@server ~17:23:05]# systemctl reload sshd

连接测试:秘钥可以登录

# cyw账户未配置密钥登录,直接拒绝[cyw@client ~17:26:55]$ssh-oPreferredAuthentications=password cyw@server Permission denied(publickey,gssapi-keyex,gssapi-with-mic).# 秘钥登录,仍然支持[cyw@client ~17:28:18]$sshroot@server Last login: Thu Jul2317:20:502026

4. 只允许特定用户登录

环境准备:laowang用户也可以秘钥登录。

[root@server ~19:41:11]# useradd laowang[root@server ~19:42:31]# echo 123 | passwd --stdin laowang更改用户 laowang 的密码 。 passwd:所有的身份验证令牌已经成功更新。[root@server ~19:42:51]# mkdir -m 700 /home/laowang/.ssh[root@server ~19:43:37]# cp .ssh/authorized_keys /home/laowang/.ssh/[root@server ~19:44:01]# chown -R laowang:laowang /home/laowang/.ssh/

配置sshd服务

root@server ~ 19:44:43]# vim /etc/ssh/sshd_config # 最后添加一行 AllowUsers cyw [root@server ~ 19:45:55]# systemctl reload sshd

测试连接:cyw 可以通过秘钥认证登录;laowang不管通过什么方式认证都不可以登录。

[cyw@client ~19:41:43]$sshlaowang@serverhostnamePermission denied(publickey,gssapi-keyex,gssapi-with-mic).[cyw@client ~19:46:54]$sshcyw@serverhostnameserver.cyw