Linux 服务器 SSH 安全加固详解
SSH(Secure Shell)是目前 Linux 服务器最主要的远程管理方式,同时也是黑客最喜欢攻击的入口之一。 全球每天都有数以亿计的 SSH 暴力破解尝试在扫描公网 IP,而绝大多数服务器被攻破的最初一步,都是从 SSH 开始的。
本文将从最基础到相对进阶的层面,系统讲解生产环境中 SSH 安全加固的完整思路与推荐配置。目标不是追求绝对安全(不存在),而是把攻击成本和成功概率提升到让绝大多数自动化脚本和低水平攻击者知难而退。
一、SSH 安全威胁的主要攻击路径
- 弱口令 / 默认口令暴力破解(占比最高,>70%)
- root 账号直接登录 + 弱口令
- 已知漏洞利用(历史版本 OpenSSH < 9.8 的 CVE、配置不当导致的权限提升)
- 私钥泄露 / 密钥对被窃取(尤其是 ~/.ssh/authorized_keys 权限过松)
- 中间人攻击(极少见,但 MITM 工具在某些场景仍有威胁)
- 横向移动(拿到一台服务器后利用 SSH 免密登录跳板到其他机器)
因此,加固的核心思路是:层层设卡,哪一层都让攻击者付出高昂代价。
二、SSH 加固分层清单(从必须做到推荐做)
第一层(必须做,收益最高)
彻底禁用 root 远程登录 这是性价比最高的一条,几乎所有暴力破解脚本都默认尝试 root 账号。
Bash# /etc/ssh/sshd_config PermitRootLogin no # 或更严格的 PermitRootLogin prohibit-password禁用密码登录,只允许公钥认证 暴力破解的终结者。
BashPasswordAuthentication no PubkeyAuthentication yes ChallengeResponseAuthentication no UsePAM no # 如果不使用其他 PAM 模块,可关闭把 SSH 端口改到高端口(1024–65535 之间) 虽然不能彻底防御,但能过滤掉 95% 以上的低质量扫描脚本。
BashPort 5522 # 推荐 20000–60000 之间任意未占用端口限制允许登录的用户名 只允许特定的运维账号登录。
BashAllowUsers ops@你的公司IP段/24 devops@特定IP # 或只允许特定用户 AllowUsers ops devops
第二层(强烈推荐,极大降低噪音)
安装并配置 fail2ban / crowdsec / sshguard 自动封禁多次登录失败的 IP(目前 crowdsec 社区活跃度更高,规则更智能)。
crowdsec 典型配置(2026 年推荐):
- 安装 crowdsec + crowdsec-firewall-bouncer-iptables
- 启用 ssh 场景(crowdsec 已内置)
- 添加自定义 ban 时间梯度(默认 4h → 1d → 7d → permanent)
使用更现代的密钥算法 禁用老旧、不安全的算法。
Bash# 只允许这些现代、安全的算法 HostKeyAlgorithms ssh-ed25519,sk-ssh-ed25519@openssh.com PubkeyAcceptedKeyTypes ssh-ed25519,sk-ssh-ed25519@openssh.com Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org启用基于主机的访问控制(可选但有效)
Bash# 只允许公司出口 IP 或 VPN IP 段登录 Match Address 192.168.1.0/24,10.8.0.0/16,203.0.113.0/24 PasswordAuthentication no Match All DenyUsers *
第三层(进阶加固,针对有针对性攻击)
使用证书认证代替传统公钥(OpenSSH 8.2+ 支持) 优点:可以集中吊销、设置有效期、统一管理。
需要 CA 签发用户证书,配置:
BashTrustedUserCAKeys /etc/ssh/ca.pub启用强制双因素认证(MFA) Google Authenticator / Yubikey / DUO 等。
最简单方式:Google Authenticator(PAM 模块)
Bash# /etc/pam.d/sshd auth required pam_google_authenticator.so然后在用户家目录放置 .google_authenticator 文件。
限制登录时间段与频率 使用 pam_time 或 fail2ban 高级规则。
开启日志审计与实时告警
- rsyslog / journald 记录所有登录尝试
- crowdsec / fail2ban 告警到企业微信/钉钉/Slack
- auditd 监控 authorized_keys 文件变化
三、2026 年生产环境推荐配置模板
# /etc/ssh/sshd_config 核心部分(精简版)
Port 5522
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM no
# 现代加密套件
HostKeyAlgorithms ssh-ed25519,sk-ssh-ed25519@openssh.com
PubkeyAcceptedKeyTypes ssh-ed25519,sk-ssh-ed25519@openssh.com
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
# 限制登录用户与来源(根据实际替换)
AllowUsers ops@203.0.113.0/24 devops@10.8.0.0/16
# 防暴力破解辅助
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 5
ClientAliveInterval 300
ClientAliveCountMax 0
# 其他安全选项
PermitTunnel no
AllowTcpForwarding no # 除非明确需要跳板
X11Forwarding no
PrintMotd no
PrintLastLog no
TCPKeepAlive yes修改后验证配置:
sshd -t # 检查语法
systemctl restart sshd四、常见问题与应对
- 改端口后自己连不上了 先用控制台/云厂商 VNC/救援模式登录修改回去,或预留一个备用端口。
- 密钥登录突然失效 检查 authorized_keys 权限(600)、.ssh 目录权限(700)、SELinux 上下文(restorecon -Rv ~/.ssh)。
- MFA 配置后把自己锁外面 永远保留一个不开启 MFA 的备用账号,或先测试好再正式启用。
- 日志中出现大量 invalid user 尝试 正常现象,说明 fail2ban/crowdsec 在工作;关注是否出现同一个 IP 反复被 ban 后仍尝试(说明有针对性攻击)。
五、总结:SSH 加固的优先级与收益排序
优先级最高 → 最低:
- 禁用 root + 只允许公钥(收益:★★★★★)
- 改端口 + fail2ban/crowdsec(收益:★★★★☆)
- 限制 AllowUsers / 来源 IP(收益:★★★★)
- 现代加密套件 + 禁用老旧算法(收益:★★★☆)
- MFA / 证书认证(收益:★★★)
- 登录时间限制 + 详细审计(收益:★★)
一句话总结: 把 SSH 变成“只有拿着正确私钥 + 来自正确 IP 的人才能进来”的门,其他人哪怕猜到密码也进不来。
生产环境中,SSH 是第一道门,也是最容易被忽视的一道门。 做好以上配置后,你的服务器至少能免疫 98% 以上的自动化脚本攻击,把精力真正放到业务安全和代码审计上。
