SSH 是 Linux 服务器运维中最常用的远程管理协议,也是攻击者最常扫描和尝试爆破的入口之一。默认配置下的 SSH 服务暴露在公网时,每天可能收到成千上万次暴力破解尝试。本文从端口调整、密钥认证和登录限制三个层面,系统性地介绍 SSH 安全加固的实操方法。
一、更改默认端口
SSH 默认监听 22 端口,自动化扫描工具会优先探测该端口。将 SSH 迁移到非标准端口虽然不能从根本上阻止有针对性的攻击,但可以过滤掉绝大多数无差别扫描,显著降低日志噪音和爆破压力。
编辑 /etc/ssh/sshd_config:
Port 22222
选择端口时注意避开已占用端口(可通过 ss -tlnp 查看),并确保防火墙放行新端口后再重启 SSH 服务。如果使用 SELinux,还需要注册新端口:
semanage port -a -t ssh_port_t -p tcp 22222
防火墙配置示例(firewalld):
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --reload
注意:修改端口后不要立即关闭当前 SSH 会话,应新开一个终端验证新端口可以正常登录,确认无误后再关闭旧会话,避免把自己锁在服务器外。
二、禁用密码登录,启用密钥认证
密码认证是 SSH 最薄弱的环节——弱密码可以被字典攻击命中,密码还可能因撞库而泄露。密钥认证基于非对称加密,私钥不离开客户端,安全性远高于密码。
2.1 生成密钥对
在本地客户端执行:
ssh-keygen -t ed25519 -C "admin@example.com"
推荐使用 Ed25519 算法,它比 RSA 更短、更快且安全性相当。如果必须使用 RSA,密钥长度至少 4096 位。
2.2 分发公钥
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server -p 22222
该命令将公钥追加到服务器端的 ~/.ssh/authorized_keys。需确保权限正确:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
2.3 关闭密码认证
在 sshd_config 中设置:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin prohibit-password
PermitRootLogin 建议设为 prohibit-password 或 no,禁止 root 用户通过密码直接登录。日常运维应使用普通用户登录后再 sudo 提权。
2.4 使用 ssh-agent 管理私钥
为避免每次登录输入私钥密码,可使用 ssh-agent:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
三、登录限制与访问控制
即使启用了密钥认证,仍建议叠加多层访问控制,缩小攻击面。
3.1 限制用户和来源 IP
在 sshd_config 中精确控制允许登录的用户:
AllowUsers deploy admin
AllowGroups ssh-users
如果服务器有固定出口 IP,可通过防火墙限制来源:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" port port="22222" protocol="tcp" accept'
3.2 限制认证尝试次数
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
MaxAuthTries 控制单次连接允许的认证失败次数,LoginGraceTime 限制完成认证的时间窗口,两者结合可以有效延缓暴力破解。
3.3 使用 Fail2ban 自动封禁
Fail2ban 通过监控日志,自动封禁多次认证失败的 IP:
dnf install fail2ban
创建 /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 22222
maxretry = 3
bantime = 3600
findtime = 600
启动并设为开机自启:
systemctl enable --now fail2ban
3.4 配置空闲超时
ClientAliveInterval 300
ClientAliveCountMax 2
这会让 SSH 在客户端无响应约 10 分钟后自动断开,减少被劫持的会话长期驻留的风险。
四、其他加固建议
- 禁用不必要的功能:
X11Forwarding no、AllowAgentForwarding no、PermitTunnel no,除非确有需要。 - 使用 SSH 证书或硬件密钥:大规模环境中可用 SSH CA 签发短期证书;高安全场景可选用 YubiKey 等 FIDO2 硬件密钥。
- 定期审计日志:关注
/var/log/secure(RHEL 系)或/var/log/auth.log(Debian 系),可用lastb查看失败登录记录。 - 保持 OpenSSH 更新:及时修补已知漏洞,如 RegreSSHion(CVE-2024-6387)。
五、验证配置
每次修改 sshd_config 后,先用以下命令检查语法:
sshd -t
确认无误后再重载:
systemctl reload sshd
小结
SSH 加固的核心思路是:减少暴露面(改端口、限来源)、提升认证强度(密钥认证、禁用密码)、增加纵深防御(Fail2ban、超时控制)。这三层措施相互独立又彼此补充,即使某一层被绕过,其他层仍能提供保护。建议在测试环境中先验证完整流程,再逐步应用到生产服务器,避免因配置失误导致失联。
未经允许不得转载:任鹏个人博客 » Linux SSH 安全加固:端口、密钥与登录限制


朋友圈点赞图在线生成源码