文章目录
- OpenSSH 服务管理
- OpenSSH 服务介绍
- SSH 协议概述
- SSH 建立连接的过程
- 加密类型
- 双向加密过程
- 使用 ssh 访问远端CLI
- ssh 工具演示
- ssh工具配置文件
- SSH 密钥认证配置
- 配置过程
- 排故
- SSH 服务安全加固
- 配置文件基础说明
- 加固配置项
- 1. 禁止 root 密码登录
- 2. 禁止 root 登录
- 3. 禁止密码登录
- 4. 只允许特定用户登录
OpenSSH 服务管理
OpenSSH 服务介绍
SSH 协议概述
SSH(Secure Shell)是一种工作在应用层的安全远程协议,专为远程登录、文件传输等网络服务提供加密保护。传统的 Telnet、FTP、rlogin 等工具均以明文传输数据,存在极高的信息泄露风险;OpenSSH 作为其主流实现,通过对传输数据全程加密,替代了这些不安全的传统服务,成为当前远程管理服务器的标准工具。
SSH 建立连接的过程
- SSH 连接的建立分为 5 个核心阶段:
- 协议版本协商阶段:目前主流使用 SSH2 版本,相比 SSH1 修复了大量安全漏洞。
- 加密算法协商阶段:客户端与服务器根据双方支持的加密、哈希算法进行协商,确定本次会话使用的算法组合。
- 双向身份认证阶段:服务器和客户端分别向对方验证身份,是 SSH 安全的核心环节。
- 会话请求阶段:客户端向服务器发送会话请求,如数据压缩、伪终端申请、端口转发、认证代理等。
- 交互会话阶段:会话建立完成后,双方可进行 Shell 命令交互、文件传输等数据通信。
加密类型
对称加密,加密和解密都使用一个钥匙。确保数据的完整性、速度快。
非对称加密,一对钥匙。公钥用来加密数据。私钥用来解密数据。确保数据的安全性。
SSH 协议结合了对称加密与非对称加密的优势,两者特性对比见下表:
| 对比项 | 对称加密 | 非对称加密 |
|---|---|---|
| 核心原理 | 加密和解密使用同一个密钥 | 采用一对公钥 / 私钥:公钥加密、私钥解密 |
| 典型场景 | 会话数据加密(SSH 会话建立后使用) | 密钥交换、身份认证(如 TLS 握手、公钥登录) |
| 优点 | 加密效率高、计算速度快,适合大量数据传输 | 无需提前分发密钥,安全性强,支持身份验证 |
| 缺点 | 密钥分发困难,一旦泄露则数据完全暴露 | 计算效率较低,密钥长度更长,占用更多资源 |
| 用例 | 数据加密传输、PII 数据脱敏 | 身份认证、密钥交换、数字签名 |
双向加密过程
SSH协议是基于非对称加密方法的,服务器和客户端都会生成自己的公钥和私钥。
- 公钥用来加密数据。
- 私钥用来解密数据。
双向加密过程:
- 服务器创建密钥对。远程服务器会在/etc/ssh目录下生成一个名为多个密钥对,例如ecdsa类型的密钥对:ssh_host_ecdsa_key.pub 公钥和 ssh_host_ecdsa_key 私钥。之后每回启动sshd服务的时候,系统会自动在此路径下查找公钥。
客户端请求连接。服务器接到请求后,把公钥传给客户端使用。
- 客户端记录服务器公钥并计算自己的公私钥。客户端将服务器传来的公钥记录在**~/.ssh/known_hosts** 中,若是已经记录有该服务器公钥,则比对是否一致,一致后就计算客户端自己的公私钥。
```bash [laoma@client ~ 10:16:36]$ ssh server The authenticity of host ‘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 to continue connecting (yes/no)?
# 作用: # 1. 接收server提供的公钥,使用这个公钥加密数据发送给对方。 # 2. 校验对方的公钥是否正确。(如果本地以及提前存储过对方的公钥了) ```
- 客户端使用服务器的公钥加密自己的公钥并发送给服务器。服务器端拥有客户端公钥+自己私钥,客户端拥有服务器公钥+自己私钥,组成了非对称加密系统。
- 双向加解密。服务器发送数据:用客户端公钥加密,客户端收到数据后用自己私钥解密。客户端发送数据:用服务器公钥加密,服务器收到数据后用自己私钥解密。
使用 ssh 访问远端CLI
ssh 工具演示
方式一:只指定IP或主机名
# 通过IP地址[myz@client ~10:38:08]$ssh10.1.8.10 myz@10.1.8.10's password: Last login: Thu Jul 23 10:34:15 2026 from client.myz.cloud [myz@server ~ 10:38:35]$ # 通过主机名称 [myz@client ~ 10:17:19]$ ssh server The authenticity of host 'server(10.1.8.10)' can't be established. ECDSA key fingerprint is SHA256:TBjfYNKltjlgh78oZe2XmxAhxd0PGRA8axQz+qSRawM. ECDSA key fingerprint is MD5:0a:95:db:0d:da:7f:a4:a4:89:23:a8:60:e9:74:e5:ae. Are you sure you want tocontinueconnecting(yes/no)?yesWarning: Permanently added'server,10.1.8.10'(ECDSA)to the list of known hosts. myz@server's password: Last failed login: Thu Jul2310:17:37 CST2026from client.myz.cloud on ssh:notty There was1failed login attempt since the last successful login. Last login: Thu Jul2310:16:332026from10.1.8.1方式二:额外指定用户名
# 指定root用户登录[myz@client ~10:34:51]$sshroot@server root@server's password: Last login: Thu Jul 23 10:34:40 2026 from client.myz.cloud # 或者 [myz@client ~ 10:34:18]$ ssh -l root server root@server's password: Last failed login: Thu Jul2310:34:38 CST2026from client.myz.cloud on ssh:notty There was1failed login attempt since the last successful login. Last login: Wed Jul2215:53:422026方式三:额外指定命令
# 同时指定用户和命令[myz@server ~10:38:50]$sshmyz@serverhostnameThe authenticity ofhost'server (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:TBjfYNKltjlgh78oZe2XmxAhxd0PGRA8axQz+qSRawM. ECDSA key fingerprint is MD5:0a:95:db:0d:da:7f:a4:a4:89:23:a8:60:e9:74:e5:ae. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'server,10.1.8.10' (ECDSA) to the list of known hosts. myz@server's password: server.myz.cloud# shell提示符,仍然是本机。[myz@server ~10:39:17]$[myz@client ~10:35:07]$sshroot@server'hostname;id'root@server's password: server.myz.clouduid=0(root)gid=0(root)groups=0(root)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023ssh工具配置文件
参考SSH_CONFIG(5)。
[root@client ~]# man ssh_config- ~/.ssh/config,用户自己的配置,优先级高于全局配置。文件权限不得高于644。
- /etc/ssh/ssh_config,全局配置,应用于所有用户。
示例:
[myz@client ~]$mkdir.ssh[myz@client ~10:53:24]$chmod700.ssh[myz@client ~10:53:37]$vim~/.ssh/config Host * StrictHostKeyChecking no User root PreferredAuthentications password[myz@client ~10:54:37]$chmod600.ssh/config# 清空其他主机秘钥[myz@client ~10:54:48]$>.ssh/known_hosts# 再次登录不会提示主机key是否校验,验证用户也是root[myz@client ~]$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,指定私钥位置。
配置文件权限:建议设置为只能用户自己读写。
[myz@client ~]$sshserver Bad owner or permissions on /home/myz/.ssh/config[myz@client ~11:34:21]$chmod600.ssh/config[myz@client ~11:34:30]$sshserver root@server's password:SSH 密钥认证配置
使用密钥登录,避免输入密码,更安全。
配置过程
# 客户端生成密钥对[myz@client ~11:15:29]$ ssh-keygen Generating public/private rsa key pair.# 私钥保存位置Enterfileinwhichto save the key(/home/laoma/.ssh/id_rsa):`回车`# 私钥加密密码,回车表示不加密Enter passphrase(emptyforno passphrase):`回车`# 再次回车Enter same passphrase again:`回车`Your identification has been savedin/home/myz/.ssh/id_rsa. Your public key has been savedin/home/myz/.ssh/id_rsa.pub. The key fingerprint is: SHA256:MtOAidL9RsXIP8zp2kWCgkuwTc6rJ3+pPMiEFoQFDuI myz@client.myz.cloud The key's randomart image is: +---[RSA 2048]----+ |=o. . o. | |Bo.o oo.. | |oEo.+ o= . | |.o* .o.oB . | |...o .*.S+ | |.oo . +. . | |+o . o . | |+oo o . . | | +++ | +----[SHA256]-----+ # 查看生成的文件 [myz@client ~ 11:16:21]$ ls .ssh config id_rsa id_rsa.pub known_hosts # 将公钥推动给目标服务器上的目标用户 [myz@client ~ 11:16:33]$ ssh-copy-id myz@server /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/myz/.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 myz@server's password: Number of key(s)added:1Now try logging into the machine, with:"ssh 'myz@server'"and check tomakesure that only the key(s)you wanted were added.# 验证[myz@client ~11:22:09]$sshmyz@serverhostnameserver.myz.cloud# 推送公钥相当于:# 将公钥内容保存到目标服务器上目标用户家目录下.ssh/authorized_keys中[myz@client ~11:22:24]$cat.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCy9QFLLojvQ1gqAZOcjJDW3E9dXLVu09vwUYE7YqHjuB3RbStganGnUMKoj34FfFCtpDJj+cILgTwIhvaqMIlUkD2Vh8B3134p+hxO+O/Ycix4nCqlbZIFzmy6KX7OAfVQ4tTlxy8NdItOQX5j+qtNkCJ050PiAmo/3Gd4Gdl5ajRRdzkpWz0oo7Kvce3m8tWSvgeQEo+CUxUD/lx3X48veyP0wjzLcFIzWR7JxnGV+/SKQjWsN7Z/xP7qFWB/aO0H4iscLENSBOkaJ2hOBemNF4I5fO49TE9lDPVLnD/bgio0/lddEP725hzZpB7jwrjRTr+zfZ42IhDaELWcUJt9 myz@client.myz.cloud# 在server端查看[myz@server ~11:27:52]$cat.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCy9QFLLojvQ1gqAZOcjJDW3E9dXLVu09vwUYE7YqHjuB3RbStganGnUMKoj34FfFCtpDJj+cILgTwIhvaqMIlUkD2Vh8B3134p+hxO+O/Ycix4nCqlbZIFzmy6KX7OAfVQ4tTlxy8NdItOQX5j+qtNkCJ050PiAmo/3Gd4Gdl5ajRRdzkpWz0oo7Kvce3m8tWSvgeQEo+CUxUD/lx3X48veyP0wjzLcFIzWR7JxnGV+/SKQjWsN7Z/xP7qFWB/aO0H4iscLENSBOkaJ2hOBemNF4I5fO49TE9lDPVLnD/bgio0/lddEP725hzZpB7jwrjRTr+zfZ42IhDaELWcUJt9 myz@client.myz.cloud# 推给目标主机root用户[root@server ~]# mkdir -m 700 .ssh[root@server ~]# cp ~myz/.ssh/authorized_keys .ssh# 客户端验证[myz@client ~11:29:26]$sshroot@serverhostnameserver.myz.cloud以非交互方式生成密钥对
[myz@client ~]$ ssh-keygen-trsa-N''-fid_rsa_new[myz@client ~11:30:15]$ls*new* id_rsa_new id_rsa_new.pub其他选项
# -i 指定私钥位置[myz@client ~11:35:43]$mv.ssh/id_rsa /tmp[myz@client ~11:35:53]$ssh-i/tmp/id_rsa root@serverhostnameserver.myz.cloud# 如果找不到密钥,则使用密码登录# -p 选项指定目标服务器 sshd 服务端口号,默认22[myz@client ~]$ssh-lroot-p1022serverhostnameroot@server's password: server.laoma.cloud排故
故障:配置密钥登录后,远程登录仍要需要输入密码验证。
[root@client ~]# ssh 'root@10.1.8.10' hostnameroot@10.1.8.10's password:模拟:将目标主机上目标用户的家目录的权限改为777。
[root@server ~]# chmod 777 /root处理过程:
- 查看日志
bash # 客户端登录的时候,监控服务端日志 [root@server ~]# tail -f /var/log/secure ...... Jul 31 16:13:41 server sshd[3693]: Authentication refused: bad ownership or modes for directory /root ......发现提示:文件权限有问题。
- 查找文件权限。
```bash [root@server ~]# ls -ld /root drwxrwxrwx. 3 root root 4096 Jul 31 16: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@server ~]# vim /etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin prohibit-password# 重启服务[root@server ~]# systemctl reload sshd连接测试
# 即使使用正确的密码,也无法远程登录[myz@client ~14:49:11]$sshroot@serverhostnameroot@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).# 如果配置了秘钥登录,则需要使用选项强制密码认证[myz@client ~]$ssh-oPreferredAuthentications=password root@server2. 禁止 root 登录
环境准备:
[myz@server ~15:26:09]$sudovim/etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin no# 重启服务[root@server ~]# systemctl reload sshd连接测试:不管是密码还是秘钥都无法登录
# 即使配置了免密登录,也无法远程登录[myz@client ~14:49:50]$sshroot@serverhostnameroot@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用户[myz@client ~]$sshmyz@server[myz@server ~]$su-[root@server ~]#3. 禁止密码登录
环境准备:
[myz@server ~15:26:09]$sudovim/etc/ssh/sshd_config# 注释原有行#PasswordAuthentication yes# 添加新行,设置为noPasswordAuthentication no# 重启服务[root@server ~]# systemctl reload sshd连接测试:秘钥可以登录
# myz账户未配置密钥登录,直接拒绝[myz@client ~]$ssh-oPreferredAuthentications=password myz@server Permission denied(publickey,gssapi-keyex,gssapi-with-mic).# 秘钥登录,仍然支持[myz@client ~]$sshmyz@server Last login: Thu Jul2316:10:052026from10.1.8.114. 只允许特定用户登录
环境准备:laowang用户也可以秘钥登录。
[root@server ~]# useradd laowang[root@server ~16:21:25]# passwd laowangChanging passwordforuser laowang. New password: BAD PASSWORD: The password is shorter than8characters Retype new password: passwd: all authentication tokens updated successfully.[root@server ~]# mkdir -m 700 /home/laowang/.ssh/[root@server ~]# cp .ssh/authorized_keys /home/laowang/.ssh/[root@server ~]# chown -R laowang:laowang /home/laowang/.ssh/配置sshd服务
[root@server ~]# vim /etc/ssh/sshd_config# 最后添加一行AllowUsers laoma# 重启服务[root@server ~]# systemctl reload sshd添加后如下图:
测试连接:laoma 可以通过秘钥认证登录;laowang不管通过什么方式认证都不可以登录。
[myz@client ~]$sshlaowang@serverhostnamePermission denied(publickey,gssapi-keyex,gssapi-with-mic).[myz@client ~]$sshmyz@serverhostnameserver.myz.cloud