必须禁用 root 远程登录和密码认证,仅允许普通用户密钥登录;限制 SSH 监听地址与访问源 IP;启用 Fail2ban 防暴力破解;定期轮换密钥并审计登录行为。

禁用 root 远程登录和密码认证
直接允许 root 通过 SSH 登录,等于把系统最高权限暴露在公网端口上;而密码认证在暴力破解面前几乎形同虚设。必须关闭这两项,默认只允许普通用户密钥登录。
实操建议:
- 编辑
/etc/ssh/sshd_config,确认以下配置已生效:PermitRootLogin noPasswordAuthentication noPubkeyAuthentication yes - 新增普通用户(如
deploy),用ssh-keygen生成密钥对,将公钥追加到该用户的~/.ssh/authorized_keys - 重启服务前,务必用新用户+密钥另开一个 SSH 会话测试连通性,避免锁死
- 若需临时提权,用
sudo,而非开放root登录
限制 SSH 访问源 IP 和端口
SSH 服务默认监听所有接口的 22 端口,这在云服务器或边界设备上风险极高。缩小攻击面最直接的方式是收敛入口。
实操建议:
- 修改
sshd_config中的ListenAddress,例如只监听内网 IP:ListenAddress 192.168.10.5,或明确绑定到某张网卡 - 用防火墙(
iptables或nftables)限制访问源:iptables -A INPUT -p tcp --dport 22 -s 203.0.113.42 -j ACCEPTiptables -A INPUT -p tcp --dport 22 -j DROP - 如非必要,不要改 SSH 端口——它不能防扫描,反而干扰日志分析和自动化工具识别
启用 Fail2ban 防暴力破解
即使关了密码登录,仍有扫描器持续尝试连接、探测服务版本或触发认证流程。Fail2ban 能基于 sshd 日志自动封禁异常 IP。
实操建议:
- 安装后确保
sshd的 jail 已启用:enabled = true在/etc/fail2ban/jail.local对应段落中 - 检查日志路径是否匹配:Debian/Ubuntu 默认为
/var/log/auth.log,RHEL/CentOS 是/var/log/secure,需在[sshd]段中设logpath - 调低触发阈值(如
maxretry = 3)和封禁时长(bantime = 3600),避免误伤;生产环境可配合ignoreip加白名单 - 运行
fail2ban-client status sshd验证规则加载,并用iptables -L -n | grep f2b查看实际封禁链
定期轮换密钥与审计登录行为
SSH 密钥一旦泄露,就等同于长期有效的通行证。而没人会天天翻 auth.log,但异常登录往往早有痕迹。
实操建议:
- 禁止使用空密码或弱密码保护私钥;私钥文件权限必须为
600,~/.ssh目录为700 - 每 90 天轮换一次部署密钥,旧密钥从所有服务器的
authorized_keys中删除;可用脚本批量分发新密钥 - 每天用
last -i | head -20快速查看最近登录,重点关注非预期 IP 或时间;更严谨的做法是配置rsyslog将auth.log推送到集中日志系统 - 禁用未使用的用户账号(如
test、ftpuser),它们常被忽略却保留在/etc/passwd中
密钥轮换和登录审计不是“做一次就完事”的操作,而是需要嵌入运维节奏里的常规动作——漏掉一次,可能就让一条隐蔽通道多存活三个月。










