Linux SSH 安全配置与强化方法

1次阅读

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

Linux SSH 安全配置与强化方法

SSH 默认端口暴露在公网等于开门揖盗

22 端口是 SSH 的默认监听端口,也是扫描器和爆破工具第一眼盯上的目标。只要服务器有公网 IP 且 sshd 监听 0.0.0.0:22,几小时内就会出现在暴力破解日志里。

改端口不能防高级攻击,但能过滤掉 90% 以上的自动化扫描——这不是“掩耳盗铃”,而是降低攻击面的最低成本操作。

  • 编辑 /etc/ssh/sshd_config,取消注释并修改 Port 行,比如设为 Port 2222
  • 确保防火墙放行新端口(ufw allow 2222iptables -A input -p tcp --dport 2222 -j ACCEPT
  • 重启服务前,务必用 sshd -t 检查配置语法,再开一个备用 SSH 连接验证新端口可用,最后才 systemctl restart sshd
  • 别只改 Port 就以为万事大吉:如果 ListenAddress 仍为 0.0.0.0,旧端口可能还在监听;用 ss -tlnp | grep :22ss -tlnp | grep :2222 双重确认

密码登录必须关掉,除非你真需要它

密码认证是 SSH 最脆弱的一环。即使用了强密码,也扛不住字典爆破或键盘记录。禁用后,所有登录必须走密钥——这是生产环境的硬性门槛。

注意:PermitRootLoginPasswordAuthentication 是两回事。前者控制 root 能否直登,后者才是全局密码开关。很多人只关了 root 密码登录,却留着普通用户密码登录,等于白干。

  • /etc/ssh/sshd_config 中设置 PasswordAuthentication noPermitRootLogin no
  • 确保你的密钥已正确部署到 ~/.ssh/authorized_keys,且权限严格:chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys
  • 如果使用非默认密钥路径(如 id_rsa_admin),客户端需显式指定:ssh -i ~/.ssh/id_rsa_admin user@host
  • 测试时别直接退出当前会话——先开新终端连一次,成功后再关闭旧连接

Fail2ban 不是万能的,但没它是真扛不住

光靠关密码、改端口,只能挡住脚本小子。一旦有人手动试几个密码或换 IP 继续扫,sshd 日志里就全是无效登录。Fail2ban 的作用是自动识别这类行为,并临时封 IP。

它不是防火墙替代品,而是日志驱动的响应层。配置不当反而会导致自己被锁在外面。

  • 安装后默认启用 sshd jail,但检查 /etc/fail2ban/jail.local 中的 maxretry(建议 3–5)、bantime(建议 1h 起,别设太长)
  • 确保 backend = systemd(而非 autopyinotify),否则日志抓取可能延迟或漏判
  • 封禁动作默认走 iptables,若用 ufw,需在 jail.local 里设 banaction = ufw
  • fail2ban-client status sshd 查当前封禁数,fail2ban-client set sshd unbanip 1.2.3.4 解封误伤 IP

PubkeyAuthentication 开启但密钥不生效?先看这三处

很多人配完密钥还是被要求输密码,不是密钥错了,而是 SSH 服务端或客户端某处卡住了验证链。常见原因高度集中在这三个位置。

  • sshd_configPubkeyAuthentication yes 必须存在且未被注释;AuthorizedKeysFile 默认是 .ssh/authorized_keys,若改过路径,客户端密钥必须放到对应位置
  • 用户主目录和 .ssh 目录权限不能太宽松:/home/user 不能是 777,.ssh 不能是 755,authorized_keys 不能是 644——OpenSSH 会直接拒绝读取
  • 客户端用 ssh -v user@host 看调试输出,重点找 Offering public keyServer accepts key 这两行;如果卡在 Next authentication method: password,说明服务端根本没接受密钥

最常被忽略的是 SELinux:centos/RHEL 上若启用,~/.ssh/authorized_keys 的上下文可能被重置,导致 SSH 拒绝读取。用 restorecon -Rv ~/.ssh 修复即可。这事不报错,只静默失败。

text=ZqhQzanResources