SSH 安全最佳实践:加固您的服务器和客户端
通过密钥认证、最小权限访问、更安全的客户端习惯、防火墙规则、多因素认证和暴力破解防护来加固SSH。
SSH安全最佳实践:加固服务器与客户端
SSH安全最佳实践至关重要,因为SSH通常是服务器的门户。一个脆弱的SSH配置可能让一个被猜中的密码、被盗的密钥或受信任主机的错误,演变为完整的shell访问权限。
你不需要复杂的设置就能有效加固SSH。从基于密钥的登录、受限用户、禁止直接root登录、谨慎的客户端行为以及能及时警示异常的日志开始。
服务端安全加固
你的SSH服务器配置(sshd_config)决定了客户端如何连接和认证。
1. 禁用密码认证
密码认证天生容易受到暴力破解攻击。用SSH密钥认证替代密码认证是最有效的安全增强措施之一。
原因: SSH密钥远比密码复杂,难以通过暴力破解方法猜测或破解。它们提供了更强的认证形式。
方法: 编辑你的
sshd_config文件(通常位于/etc/ssh/sshd_config),设置PasswordAuthentication no。修改后,重启SSH服务:sudo sshd -t sudo systemctl reload sshd重要: 在禁用密码认证之前,请确保已成功设置并测试了SSH密钥认证,以免将自己锁在系统外。
在某些发行版中,服务名称为ssh而非sshd。请使用系统提供的服务名称,并在测试新登录时保持现有会话开启。
2. 将端口更改视为减少噪音
将默认SSH端口从22更改可以减少自动扫描的噪音。但这不能替代密钥、补丁和访问控制。
方法: 在
sshd_config中,更改Port指令。例如,使用端口2222:Port 2222记得更新防火墙规则以允许新端口的流量,并在客户端连接时指定端口:
ssh -p 2222 user@your_server_ip
3. 限制用户和组访问
控制哪些用户和组可以通过SSH登录。
AllowUsers和AllowGroups: 在sshd_config中使用这些指令明确指定谁可以连接。AllowUsers admin user1 AllowGroups sshusersDenyUsers和DenyGroups: 或者,使用这些指令阻止特定用户或组。
4. 禁用root登录
应禁用通过SSH直接root登录,以防止攻击者立即针对最高权限账户。用户应使用自己的账户登录,并通过sudo执行管理任务。
- 方法: 在
sshd_config中设置PermitRootLogin no。
5. 配置空闲超时和保活
防止无人值守的活动SSH会话无限期保持打开状态。
ClientAliveInterval和ClientAliveCountMax: 这些服务端设置定期向客户端发送空包以检查连接是否仍然存活。如果客户端在ClientAliveCountMax次尝试后未响应,服务器将断开会话。ClientAliveInterval 300 # 每5分钟发送一个包 ClientAliveCountMax 2 # 在2次未响应后断开(10分钟)
6. 加固主机密钥
确保服务器的主机密钥受到保护并妥善管理。
- 权限: 验证主机密钥文件(例如
/etc/ssh/ssh_host_rsa_key)具有严格的权限(例如600)并由root拥有。 - 算法: 当客户端支持时,优先使用现代主机密钥,如Ed25519。不要在没有计划的情况下删除现有主机密钥,因为客户端会将其视为主机身份变更。
- 轮换: 有意识地轮换主机密钥,并通过可信渠道公布新的指纹。
客户端安全最佳实践
保护客户端机器和SSH密钥与服务端加固同样重要。
1. 保护私钥
你的SSH私钥是通往服务器的门户。请极其谨慎地对待它。
- 权限: 确保私钥文件(例如
~/.ssh/id_rsa)具有严格的权限(例如600或400),只有你能读取。chmod 600 ~/.ssh/id_rsa - 密码短语: 始终使用强密码短语加密私钥。这增加了一层额外的安全保护,即使密钥文件被泄露,也需要密码短语。
- 避免复制: 不要与任何人共享私钥,也不要将其存储在不安全的位置。
2. 谨慎使用SSH代理转发
SSH代理转发允许你使用本地SSH密钥认证远程服务器,而无需将私钥复制到这些服务器。虽然方便,但如果远程服务器被攻破,这可能带来安全风险。
- 启用:
ssh -A user@your_server_ip - 最佳实践: 默认禁用代理转发。仅在你信任的主机上使用,并优先选择部署密钥、堡垒机
ProxyJump或短期凭证等替代方案(如果它们适合你的工作流程)。
3. 验证主机密钥指纹
当你首次连接到SSH服务器时,客户端会提示你验证服务器的主机密钥指纹。这有助于防止中间人攻击。
- 方法: 始终根据可信来源(如云控制台、配置日志或管理员)验证指纹。如果指纹意外更改,请停止并调查后再接受。
4. 保持SSH客户端软件更新
确保你的SSH客户端软件(OpenSSH、PuTTY等)保持最新,以受益于最新的安全补丁和功能。
高级安全措施
除了基本步骤,考虑以下高级技术:
1. 多因素认证
在环境支持的情况下,为人工SSH访问添加MFA。这通常将SSH密钥与一次性代码、推送批准或硬件支持的认证相结合。
- 工具: PAM模块、Duo、认证器应用和硬件安全密钥都可以成为SSH MFA设计的一部分。
2. Fail2ban
Fail2ban扫描日志中重复的失败认证尝试,并可以为源IP添加临时防火墙阻止。日志路径因发行版而异;Debian和Ubuntu通常使用/var/log/auth.log,而许多RHEL系列系统通过journald或/var/log/secure记录日志。
- 安装: 通常可通过包管理器获得(
sudo apt install fail2ban或sudo yum install fail2ban)。 - 配置: 在
/etc/fail2ban/jail.local中配置监控SSH日志的监狱,并定义封禁时间和阈值。
3. 防火墙配置
使用防火墙(如ufw、firewalld或iptables)限制对SSH端口(无论是默认还是自定义)的访问,仅允许来自可信IP地址或范围的流量。
- 示例(ufw):
sudo ufw allow from trusted_ip to any port 22 sudo ufw enable
总结
保护SSH安全是一个持续的习惯。使用基于密钥的认证,禁用直接root登录,限制谁可以连接,保护私钥,并验证主机指纹。然后根据风险程度,添加防火墙限制、MFA和暴力破解防护。