SSH 是管理 Linux 服务器最常用的远程登录协议,也是攻击者最常扫描的服务之一。合理的配置可以大幅降低被入侵的风险,同时不影响正常使用。以下配置主要针对 OpenSSH 服务器端,配置文件通常位于 /etc/ssh/sshd_config,每次修改后需要重启 sshd 服务生效(sudo systemctl restart sshd)。
1. 禁用 root 用户直接远程登录
root 用户拥有系统最高权限,一旦密码被猜解或密钥泄露,攻击者将获得完全控制权。最佳实践是先以普通用户登录,必要时通过 sudo 或 su 提升权限。
PermitRootLogin no
如果必须保留某些自动化脚本使用 root 的权限,可考虑使用 PermitRootLogin prohibit-password(只允许密钥登录,禁止密码)。
2. 使用密钥认证代替密码认证
密码容易受到暴力破解、撞库和键盘记录等威胁。密钥对(私钥+公钥)的安全性远高于短密码,且可以方便地管理授权。
PubkeyAuthentication yes
PasswordAuthentication no
部署前务必先在服务器上添加好自己账户的公钥(通常是 ~/.ssh/authorized_keys),并确保本地私钥可用,否则关闭密码认证后可能将自己锁在门外。
3. 限制可登录用户与组
仅允许少数需要远程管理的账户使用 SSH,进一步缩小攻击面。
AllowUsers alice bob
AllowGroups sshusers
AllowUsers 和 AllowGroups 可以同时使用,白名单之外的用户即使有正确密钥或密码也无法登录。
4. 更换默认端口(可选,但有用)
将 SSH 从默认的 22 端口迁移到一个高位端口(如 2222),可以过滤掉绝大多数自动化扫描和僵尸网络的攻击尝试。注意这并非真正的安全措施,仅降低噪音。
Port 2222
更改后,客户端连接时需要指定端口:ssh -p 2222 user@host。务必在防火墙中放行新端口再重启服务,并确认 SELinux 或 AppArmor 策略允许该端口(或许需通过 semanage port -a -t ssh_port_t -p tcp 2222 添加标签)。
5. 禁用不安全的协议和算法
确保只使用 SSH 协议第 2 版(版本 1 有严重安全缺陷),并限制加密算法列表,避免过时或不安全的选项。
Protocol 2
Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group18-sha512
现代 OpenSSH 版本默认配置通常已足够安全,但对于企业合规环境,显式限定强加密套件是常见做法。
6. 配置空闲超时和连接数限制
防止已登录的会话因遗忘退出而被滥用,同时降低资源耗尽攻击的风险。
ClientAliveInterval 300
ClientAliveCountMax 2
MaxSessions 10
MaxAuthTries 3
ClientAliveInterval 300:服务器每 300 秒向客户端发送一个探测包,如果没有收到响应,则按ClientAliveCountMax次数重试后断开连接(此例中超时时间约为 300×(2+1)=900 秒即 15 分钟)。MaxSessions 10:限制单个网络连接允许的最大会话数,避免低效的资源消耗。MaxAuthTries 3:限制认证失败尝试次数,有效阻挡暴力猜解脚本。
7. 结合 TCP Wrappers 或防火墙进一步限制来源 IP
如果管理需求允许,可以限定仅特定 IP 段可以访问 SSH 端口。例如使用 iptables:
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
或使用 /etc/hosts.allow 和 /etc/hosts.deny(根据发行版支持情况)。这种网络层的白名单策略能显著减少触达 SSH 服务的恶意流量。
8. 记录日志与监控
保持登录日志并定期检查异常,结合 fail2ban 等工具自动封禁暴力破解 IP,构成主动防御。
LogLevel VERBOSE
SyslogFacility AUTH
验证日志通常记录在 /var/log/secure(RHEL 系)或 /var/log/auth.log(Debian 系)。配置 fail2ban 监听这些日志,可以动态在防火墙中屏蔽多次失败的源 IP,大幅提升安全等级。
重要提醒
在应用任何 SSH 配置变更前,保持一个已开启的现有会话,直到通过新会话验证配置无误。错误的配置可能导致无法再次远程连接,需要物理控制台介入。逐步修改、逐项测试是最稳妥的流程。