ssh安全加固需三步:1. 修改默认22端口(如2222)并确认监听;2. 禁用密码登录(passwordauthentication no)和root直登(permitrootlogin no),强制密钥认证;3. 部署fail2ban限制暴力破解,同时排查密钥权限、selinux等常见失效原因。

SSH 默认端口暴露在公网等于开门揖盗
22 端口是 SSH 的默认监听端口,也是扫描器和爆破工具第一眼盯上的目标。只要服务器有公网 IP 且 sshd 监听 0.0.0.0:22,几小时内就会出现在暴力破解日志里。
改端口不能防高级攻击,但能过滤掉 90% 以上的自动化扫描——这不是“掩耳盗铃”,而是降低攻击面的最低成本操作。
- 编辑
/etc/ssh/sshd_config,取消注释并修改Port行,比如设为Port 2222 - 确保防火墙放行新端口(
ufw allow 2222或iptables -A input -p tcp --dport 2222 -j ACCEPT) - 重启服务前,务必用
sshd -t检查配置语法,再开一个备用 SSH 连接验证新端口可用,最后才systemctl restart sshd - 别只改
Port就以为万事大吉:如果ListenAddress仍为0.0.0.0,旧端口可能还在监听;用ss -tlnp | grep :22和ss -tlnp | grep :2222双重确认
密码登录必须关掉,除非你真需要它
密码认证是 SSH 最脆弱的一环。即使用了强密码,也扛不住字典爆破或键盘记录。禁用后,所有登录必须走密钥——这是生产环境的硬性门槛。
注意:PermitRootLogin 和 PasswordAuthentication 是两回事。前者控制 root 能否直登,后者才是全局密码开关。很多人只关了 root 密码登录,却留着普通用户密码登录,等于白干。
- 在
/etc/ssh/sshd_config中设置PasswordAuthentication no和PermitRootLogin no - 确保你的密钥已正确部署到
~/.ssh/authorized_keys,且权限严格:chmod 700 ~/.ssh、chmod 600 ~/.ssh/authorized_keys - 如果使用非默认密钥路径(如
id_rsa_admin),客户端需显式指定:ssh -i ~/.ssh/id_rsa_admin user@host - 测试时别直接退出当前会话——先开新终端连一次,成功后再关闭旧连接
Fail2ban 不是万能的,但没它是真扛不住
光靠关密码、改端口,只能挡住脚本小子。一旦有人手动试几个密码或换 IP 继续扫,sshd 日志里就全是无效登录。Fail2ban 的作用是自动识别这类行为,并临时封 IP。
它不是防火墙替代品,而是日志驱动的响应层。配置不当反而会导致自己被锁在外面。
- 安装后默认启用
sshdjail,但检查/etc/fail2ban/jail.local中的maxretry(建议 3–5)、bantime(建议 1h 起,别设太长) - 确保
backend = systemd(而非auto或pyinotify),否则日志抓取可能延迟或漏判 - 封禁动作默认走
iptables,若用ufw,需在jail.local里设banaction = ufw - 用
fail2ban-client status sshd查当前封禁数,fail2ban-client set sshd unbanip 1.2.3.4解封误伤 IP
PubkeyAuthentication 开启但密钥不生效?先看这三处
很多人配完密钥还是被要求输密码,不是密钥错了,而是 SSH 服务端或客户端某处卡住了验证链。常见原因高度集中在这三个位置。
-
sshd_config中PubkeyAuthentication yes必须存在且未被注释;AuthorizedKeysFile默认是.ssh/authorized_keys,若改过路径,客户端密钥必须放到对应位置 - 用户主目录和
.ssh目录权限不能太宽松:/home/user不能是 777,.ssh不能是 755,authorized_keys不能是 644——OpenSSH 会直接拒绝读取 - 客户端用
ssh -v user@host看调试输出,重点找Offering public key和Server accepts key这两行;如果卡在Next authentication method: password,说明服务端根本没接受密钥
最常被忽略的是 SELinux:centos/RHEL 上若启用,~/.ssh/authorized_keys 的上下文可能被重置,导致 SSH 拒绝读取。用 restorecon -Rv ~/.ssh 修复即可。这事不报错,只静默失败。