引言:SSH是运维的生命线,也是最常被盯上的入口
IDC机房的服务器每天都在被扫描和爆破。默认22端口、弱密码、root直登,任何一个疏漏都可能在某个深夜被脚本小子攻破。SSH加固不是可选项,而是服务器上架前的第一道安全基线。这一篇从密钥认证、sshd_config加固、Fail2ban防爆破到防火墙收敛,给出一套可以直接落地的完整方案。
一、先评估暴露面:你的SSH到底有多危险
加固之前先看清楚现状,别在盲区里操作。登录服务器后执行:
# 查看当前监听端口和来源
ss -tlnp | grep sshd
# 查看近期登录失败记录(爆破痕迹)
grep "Failed password" /var/log/secure | tail -20
# 统计失败次数最多的IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10如果失败记录一抓一大把,说明你的IP早就暴露在公网扫描下,加固刻不容缓。
二、密钥认证:把密码登录彻底关掉
密码可以被爆破,密钥几乎不能。先在本地生成密钥对:
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519然后把公钥分发到服务器(服务器上先保留密码登录用于应急):
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@服务器IP分发完成后,在服务器上验证密钥登录可用,再执行下一步收紧配置。注意:ed25519 比 RSA 更短更安全,新环境优先用 ed25519;老设备不兼容时再用 RSA 4096。
三、sshd_config 核心加固参数
编辑 /etc/ssh/sshd_config,逐项核对以下配置:
# 端口改高位,避开扫描洪流(1-65535,避开常用端口)
Port 22222
# 禁止root直接登录,用普通用户+sudo
PermitRootLogin no
# 只允许密钥认证
PasswordAuthentication no
PubkeyAuthentication yes
# 禁止空密码账户
PermitEmptyPasswords no
# 登录等待和重试限制
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 10
# 空闲断开,防止挂机会话被劫持
ClientAliveInterval 300
ClientAliveCountMax 2
# 白名单机制:只允许指定用户登录
AllowUsers opsadmin改完后一定要先测配置再重载,否则可能把自己锁在门外:
sshd -t # 语法检查,输出为空就是没问题
systemctl reload sshd # 或者 service sshd reload
# 关键:不要关闭当前终端!新开一个窗口验证能登录,再关旧的防锁死铁律:任何时候改SSH配置,都要保持一个已建立的会话不退出,用第二个会话验证成功后再收尾。IDC环境最怕的就是远程改配置把自己关在门外,只能叫机房小哥上KVM。
四、Fail2ban:暴力破解的自动反击
即使关了密码登录,Fail2ban 依然值得装——它能在异常行为出现时自动封禁来源IP,是纵深防御的重要一环。
# CentOS/Rocky
yum install fail2ban -y
# Debian/Ubuntu
apt install fail2ban -y配置 /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/secure # Debian系改为 /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600启动并验证:
systemctl enable --now fail2ban
fail2ban-client status sshd如果看到 banned IP 列表在增长,说明它在干活了。注意:云厂商的安全组、机房防火墙是更前置的防线,Fail2ban 只是服务器侧的兜底,两层一起用效果最好。
五、别忘了这些细节
- 防火墙收敛端口:firewalld/iptables 里只放行新的SSH端口和必要业务端口,其他一律DROP。
- 限制登录来源:如果服务器只给固定办公网/跳板机访问,sshd_config 里用 Match Address 或者防火墙直接限定源IP,比任何密码策略都有效。
- 普通用户+sudo:日常操作走普通用户,需要root时 sudo 提权,并开启 sudo 日志审计。
- 日志监控:把 /var/log/secure 里的 Failed password、Accepted 记录接入监控告警,登录成功也告警,防止已失陷的账户被滥用。
- 定期轮换密钥:员工离职、跳板机被攻破后,第一时间吊销对应密钥并更新 authorized_keys。
六、验证与回滚
加固完成后做一次完整的自我验证:
# 1. 用新端口+密钥登录,确认正常
ssh -p 22222 opsadmin@服务器IP
# 2. 故意用密码登录,确认被拒绝
ssh -p 22222 root@服务器IP # 应提示 Permission denied (publickey)
# 3. 检查服务状态
systemctl status sshd
# 4. 查看Fail2ban是否在拦截
fail2ban-client status sshd万一改坏了连不上,应急通道按优先级:机房KVM/带外管理(iDRAC/iLO/IPMI)→ 云厂商VNC控制台 → 让机房同事插网线本地登录。这也是为什么上一篇讲带外管理那么重要——SSH把自己锁死时,BMC是你最后的救命稻草。
结语
SSH加固是一场持续的战斗,不是一次性动作。密钥认证、端口收敛、Fail2ban、来源限制、日志审计,每一层都在提高攻击者的成本。上线前做基线加固,上线后定期审计登录日志和密钥清单,才能让服务器在公网洪流里安稳运行。
评论