一文吃透 OpenSSH:远程 CLI 连接、密钥免密登录、服务安全配置教程

OpenSSH 服务管理

OpenSSH 服务介绍

SSH 介绍

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

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

SSH 建立连接的过程

主要分为下面几个阶段:

  1. SSH协议版本协商阶段,SSH目前包括SSH1SSH2两个大版本。

  2. 密钥和算法协商阶段,SSH支持多种加密算法,双方根据自己和对端支持的算法进行协商,最终决定要使用的算法。

  3. 认证阶段,服务器和客户端互相进行身份验证。

  4. 会话请求阶段,客户端会向服务器端发送会话请求。会话请求分为这样几类:申请对数据传送进行压缩、申请伪终端、启动 X11、TCP/IP 端口转发、启动认证代理等。

  5. 交互会话阶段,会话请求通过后,服务器端和客户端进行信息的交互。例如运行 shell、执行命令、传递文件。

加密类型

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

  • 非对称加密,一对钥匙。公钥用来加密数据。私钥用来解密数据。确保数据的安全性。

双向加密过程

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

  • 公钥用来加密数据。

  • 私钥用来解密数据。

双向加密过程:

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

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

  3. 客户端记录服务器公钥并计算自己的公私钥。客户端将服务器传来的公钥记录在**~/.ssh/known_hosts** 中,若是已经记录有该服务器公钥,则比对是否一致,一致后就计算客户端自己的公私钥。

    [deng@client ~19:16:36]$sshserver The authenticity ofhost'server (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:KTP3/4VydNwCIpOUzpd0C5IhvjfirH+y1U8IHIt8ZdM. ECDSA key fingerprint is MD5:33:24:9b:48:f7:d2:c5:73:3e:40:d0:38:0e:a7:da:7c. Are you sure you want tocontinueconnecting(yes/no)?# 作用:# 1. 接收server提供的公钥,使用这个公钥加密数据发送给对方。# 2. 校验对方的公钥是否正确。(如果本地已经提前存储过对方的公钥了)
  4. 客户端使用服务器的公钥加密自己的公钥并发送给服务器。服务器端拥有客户端公钥+自己私钥,客户端拥有服务器公钥+自己私钥,组成了非对称加密系统。

  5. 双向加解密。服务器发送数据:用客户端公钥加密,客户端收到数据后用自己私钥解密。客户端发送数据:用服务器公钥加密,服务器收到数据后用自己私钥解密。

使用 ssh 访问远端CLI

ssh 工具演示

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

# 通过IP地址[deng@centos7 ~19:40:12]$ssh10.1.8.10 The authenticity ofhost'10.1.8.10 (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:pplZ4EZPQ8M/f7qvKaAffxbf+vKYJg9HCojrmqctkck. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.1.8.10' (ECDSA) to the list of known hosts. deng@10.1.8.10's password: redhat Activate the web console with: systemctlenable--nowcockpit.socket Last login: Wed Jul2319:40:122026from10.1.8.1[deng@centos7 ~]$# 通过主机名称[deng@centos7 ~19:40:28]$sshserver The authenticity ofhost'server (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:pplZ4EZPQ8M/f7qvKaAffxbf+vKYJg9HCojrmqctkck. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'server,10.1.8.10' (ECDSA) to the list of known hosts. deng@server's password: redhat Activate the web console with: systemctlenable--nowcockpit.socket Last login: Wed Jul2319:40:282026from10.1.8.1

方式二:额外指定用户名

# 指定root用户登录[deng@centos7 ~19:40:45]$sshroot@server# 或者[deng@centos7 ~19:40:58]$ssh-lroot server

方式三:额外指定命令

# 同时指定用户和命令[deng@centos7 ~19:41:12]$sshdeng@serverhostnamedeng@server's password: redhat server.laoma.cloud # shell提示符,仍然是本机。 [deng@centos7 ~ 19:41:28]$ [deng@centos7 ~ 19:41:41]$ ssh root@server 'hostname;id' root@server's password: redhat server.laoma.clouduid=0(root)gid=0(root)=0(root)环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

ssh工具配置文件

[root@centos7 ~19:41:58]$manssh_config
  • ~/.ssh/config,用户自己的配置,优先级高于全局配置。文件权限不得高于644。

  • /etc/ssh/ssh_config,全局配置,应用于所有用户。

示例:

[deng@centos7 ~19:42:15]$mkdir.ssh[deng@centos7 ~19:42:28]$chmod700.ssh[deng@centos7 ~19:42:41]$vim~/.ssh/config Host * StrictHostKeyChecking no User root PreferredAuthentications Pubkey[deng@centos7 ~19:42:54]$chmod600.ssh/config# 清空其他主机秘钥[deng@centos7 ~19:43:07]$>.ssh/known_hosts# 再次登录不会提示主机key是否校验,验证用户也是root[deng@centos7 ~19:43:20]$sshserver Warning: Permanently added'server,10.1.8.10'(ECDSA)to the list of known hosts. root@server's password:

参数说明:

  • Host*,匹配所有目标服务器。

  • StrictHostKeyChecking no,连接目标服务器不校验主机key,直接接受。

  • User root,连接目标服务器默认使用laoma账户。

  • PreferredAuthentications password,连接目标服务器使用密码认证。

  • IdentityFile,指定私钥位置。

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

[deng@centos7 ~19:43:33]$sshserver Bad owner or permissions on /home/deng/.ssh/config[deng@centos7 ~19:43:46]$chmod600.ssh/config[deng@centos7 ~19:43:59]$sshserver root@server's password:

配置 ssh 密钥认证

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

配置过程

# 客户端生成密钥对[deng@centos7 ~19:44:15]$ ssh-keygen Generating public/private rsa key pair.# 私钥保存位置Enterfileinwhichto save the key(/home/deng/.ssh/id_rsa): 回车# 私钥加密密码,回车表示不加密Enter passphrase(emptyforno passphrase): 回车# 再次回车Enter same passphrase again: 回车 Your identification has been savedin/home/deng/.ssh/id_rsa. Your public key has been savedin/home/deng/.ssh/id_rsa.pub. The key fingerprint is: SHA256:OAfLyL6KIXr44DV7vhpystqqXwsbFl2tGP6HZP4GLR4 deng@server.laoma.cloud The key's randomart image is: +---[RSA2048]----+|||.||.o.||+ *=||.* O.S||o=E+.||+++=o.++.||=*B=++.o.||OB*+*o...|+----[SHA256]-----+# 查看生成的文件[deng@centos7 ~19:44:32]$ls.ssh/ config id_rsa id_rsa.pub known_hosts# 将公钥推动给目标服务器上的目标用户[deng@centos7 ~19:44:45]$ ssh-copy-id deng@server# 验证[deng@centos7 ~19:44:58]$sshdeng@serverhostnameserver.laoma.cloud# 推送公钥相当于:# 将公钥内容保存到目标服务器上目标用户家目录下.ssh/authorized_keys中[deng@centos7 ~19:45:11]$cat.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtFoo/sD+pB1uBw9XMuXLcO//RgghgHeYjdibXMCtw5UUf/H5lYcP4ZjCbQTdmH7n0ZkxYriIU+Q6atY0Jel3+sWzCD3K9DSU8g5Ux2wjCrVhFJGTtsMXeI+XqQW0MqY2Gn9KtC098JKlzikUz+SbDe61vyqCYHVeBNmWtTtZORhywHlN4HxLIGOlGvnPrXI8+uhdgBqV6Sxo0XkpOvB2y+0Kjxb0SQUCYpdkT/cJqUz2Bm/diPEDmHPvlVn3/chD7Uvt++wQhGCFEPGBawQIsb7sT73UpIQ20vaxjs8okQ1XZNzHW1KnLBhYskrtWU7HIHHTWObpw5mwoXj64wcPX deng@centos7.laoma.cloud# 在server端查看[deng@server ~19:45:24]$cat.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtFoo/sD+pB1uBw9XMuXLcO//RgghgHeYjdibXMCtw5UUf/H5lYcP4ZjCbQTdmH7n0ZkxYriIU+Q6atY0Jel3+sWzCD3K9DSU8g5Ux2wjCrVhFJGTtsMXeI+XqQW0MqY2Gn9KtC098JKlzikUz+SbDe61vyqCYHVeBNmWtTtZORhywHlN4HxLIGOlGvnPrXI8+uhdgBqV6Sxo0XkpOvB2y+0Kjxb0SQUCYpdkT/cJqUz2Bm/diPEDmHPvlVn3/chD7Uvt++wQhGCFEPGBawQIsb7sT73UpIQ20vaxjs8okQ1XZNzHW1KnLBhYskrtWU7HIHHTWObpw5mwoXj64wcPX deng@centos7.laoma.cloud# 推给目标主机root用户[root@server ~19:45:37]$mkdir-m700.ssh[root@server ~19:45:50]$cp~deng/.ssh/authorized_keys .ssh# 客户端验证[deng@centos7 ~19:46:03]$sshroot@serverhostnameserver.laoma.cloud

以非交互方式生成密钥对

[deng@centos7 ~19:46:16]$ ssh-keygen-trsa-N''-fid_rsa_new[deng@centos7 ~19:46:29]$ls*new* id_rsa_new id_rsa_new.pub

其他选项

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

排故

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

[root@centos7 ~19:47:21]$ssh'root@10.1.8.10'hostnameroot@10.1.8.10's password:

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

[root@server ~19:47:34]$chmod777/root

处理过程:

  1. 查看日志
# 客户端登录的时候,监控服务端日志[root@server ~19:47:47]$tail-f/var/log/secure......Jul2316:13:41 server sshd[3693]: Authentication refused: bad ownership or modesfordirectory /root......

发现提示:文件权限有问题。

  1. 查找文件权限。
[root@server ~]# ls -ld /rootdrwxrwxrwx.3root root4096Jul2316:09 /root# 更改权限[root@server ~]# chmod 700 /root

加固 SSH 服务

配置文件

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@centos7 ~19:48:03]$vim/etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin prohibit-password# 重启服务[root@centos7 ~19:48:16]$ systemctl reload sshd

连接测试

# 即使使用正确的密码,也无法远程登录[deng@centos7 ~19:48:29]$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).# 如果配置了秘钥登录,则需要使用选项强制密码认证[deng@centos7 ~19:48:42]$ssh-oPreferredAuthentications=password root@server

2. 禁止 root 登录

环境准备:

[root@centos7 ~19:48:55]$vim/etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin no# 重启服务[root@centos7 ~19:49:08]$ systemctl reload sshd

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

# 即使配置了免密登录,也无法远程登录[deng@centos7 ~19:49:21]$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用户[deng@centos7 ~19:49:34]$sshdeng@server[deng@server ~]$su-[root@server ~]#

3. 禁止密码登录

环境准备:

[root@centos7 ~19:49:47]$vim/etc/ssh/sshd_config# 注释原有行#PasswordAuthentication yes# 添加新行,设置为noPasswordAuthentication no# 重启服务[root@centos7 ~19:50:00]$ systemctl reload sshd

连接测试:秘钥可以登录

# deng账户未配置密钥登录,直接拒绝[deng@centos7 ~19:50:13]$ssh-oPreferredAuthentications=password deng@server Permission denied(publickey,gssapi-keyex,gssapi-with-mic).# 秘钥登录,仍然支持[deng@centos7 ~19:50:26]$sshdeng@server Last login: Thu Jul2310:35:052026from10.1.8.11

4. 只允许特定用户登录

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

[root@centos7 ~19:50:39]$useraddlaowang[root@centos7 ~19:50:52]$echo123|passwd--stdinlaowang[root@centos7 ~19:51:05]$mkdir-m700/home/laowang/.ssh/[root@centos7 ~19:51:18]$cp.ssh/authorized_keys /home/laowang/.ssh/[root@centos7 ~19:51:31]$chown-Rlaowang:laowang /home/laowang/.ssh/

配置sshd服务

[root@centos7 ~19:51:44]$vim/etc/ssh/sshd_config# 最后添加一行AllowUsers deng# 重启服务[root@centos7 ~19:51:57]$ systemctl reload sshd

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

[deng@centos7 ~19:52:10]$sshlaowang@serverhostnamePermission denied(publickey,gssapi-keyex,gssapi-with-mic).[deng@centos7 ~19:52:23]$sshdeng@serverhostnameserver.laoma.cloud