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登录。

  • AllowUsersAllowGroupssshd_config中使用这些指令明确指定谁可以连接。
    AllowUsers admin user1
    AllowGroups sshusers
    
  • DenyUsersDenyGroups 或者,使用这些指令阻止特定用户或组。

4. 禁用root登录

应禁用通过SSH直接root登录,以防止攻击者立即针对最高权限账户。用户应使用自己的账户登录,并通过sudo执行管理任务。

  • 方法:sshd_config中设置PermitRootLogin no

5. 配置空闲超时和保活

防止无人值守的活动SSH会话无限期保持打开状态。

  • ClientAliveIntervalClientAliveCountMax 这些服务端设置定期向客户端发送空包以检查连接是否仍然存活。如果客户端在ClientAliveCountMax次尝试后未响应,服务器将断开会话。
    ClientAliveInterval 300  # 每5分钟发送一个包
    ClientAliveCountMax 2    # 在2次未响应后断开(10分钟)
    

6. 加固主机密钥

确保服务器的主机密钥受到保护并妥善管理。

  • 权限: 验证主机密钥文件(例如/etc/ssh/ssh_host_rsa_key)具有严格的权限(例如600)并由root拥有。
  • 算法: 当客户端支持时,优先使用现代主机密钥,如Ed25519。不要在没有计划的情况下删除现有主机密钥,因为客户端会将其视为主机身份变更。
  • 轮换: 有意识地轮换主机密钥,并通过可信渠道公布新的指纹。

客户端安全最佳实践

保护客户端机器和SSH密钥与服务端加固同样重要。

1. 保护私钥

你的SSH私钥是通往服务器的门户。请极其谨慎地对待它。

  • 权限: 确保私钥文件(例如~/.ssh/id_rsa)具有严格的权限(例如600400),只有你能读取。
    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 fail2bansudo yum install fail2ban)。
  • 配置:/etc/fail2ban/jail.local中配置监控SSH日志的监狱,并定义封禁时间和阈值。

3. 防火墙配置

使用防火墙(如ufwfirewalldiptables)限制对SSH端口(无论是默认还是自定义)的访问,仅允许来自可信IP地址或范围的流量。

  • 示例(ufw):
    sudo ufw allow from trusted_ip to any port 22
    sudo ufw enable
    

总结

保护SSH安全是一个持续的习惯。使用基于密钥的认证,禁用直接root登录,限制谁可以连接,保护私钥,并验证主机指纹。然后根据风险程度,添加防火墙限制、MFA和暴力破解防护。