linux ssh 安全需分层加固:禁用 root 密码登录、强制密钥认证并限制密钥权限;改非标端口配合防火墙限流;启用详细日志与 fail2ban 自动封禁失败登录,实现可追溯、快响应、密钥生命周期管理。

Linux SSH 安全不是“开个防火墙+改端口”就完事,而是要分层加固:从连接入口、身份认证、会话控制,到日志审计和持续防护。关键在切断攻击链路,而非只堵一个漏洞。
关掉默认登录,禁用 root 远程直连
root 直连是攻击者首选目标,一旦密码弱或被爆破,系统即失守。必须禁止 root 通过 SSH 密码登录,仅保留密钥方式(且需单独授权)。
- 编辑 /etc/ssh/sshd_config,设 PermitRootLogin no
- 确保 PasswordAuthentication no(关闭所有密码登录,强制密钥)
- 新增普通用户(如 admin),用 usermod -aG sudo admin 赋权
- 用 ssh-copy-id admin@server 部署密钥后,再重启 sshd:sudo systemctl restart sshd
用非标端口 + 主机级防火墙双过滤
改端口不能防扫描,但能过滤掉 90% 的自动化脚本攻击;配合防火墙可精准控流,避免误伤合法连接。
- 在 sshd_config 中改 Port 2222(避开 22,别用太冷门如 65535,易被策略拦截)
- 用 ufw 限制来源 IP:sudo ufw allow from 192.168.1.100 to any port 2222
- 启用连接速率限制(防暴力尝试):sudo ufw limit 2222/tcp
- 确认规则生效:sudo ufw status verbose
密钥必须强管控:禁用空密码、限制用途、定期轮换
私钥丢了=服务器裸奔。生成时就要设密码,部署后还要限制可登录的命令和路径。
- 生成带密码的密钥:ssh-keygen -t ed25519 -a 100 -C “admin@prod”(-a 指定密钥派生轮数)
- 服务端 ~/.ssh/authorized_keys 中,为每条公钥加限制前缀:
command=”/bin/false”,no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA… - 设置密钥过期时间(靠文件权限+人工流程):生成时记日志,6个月后强制重签,旧密钥从 authorized_keys 删除
开启登录审计 + 失败自动封禁
不记录谁连过、怎么连的,等于没监控;不自动封 IP,等于给攻击者无限试错机会。
- 确保 LogLevel VERBOSE 和 MaxAuthTries 3 在 sshd_config 中启用
- 用 fail2ban 监控 /var/log/auth.log:
创建 /etc/fail2ban/jail.local,加入:
[sshd]
enabled = true
maxretry = 3
bantime = 1h
findtime = 10m - 重启服务:sudo systemctl restart fail2ban,用 fail2ban-client status sshd 查实时状态
基本上就这些。真正安全不是堆配置,而是让每次登录都有据可查、每次失败都立即响应、每个密钥都有生命周期。做扎实了,SSH 就不是漏洞入口,而是可信通道。