Linux 服务器上加强 SSH 安全的最佳实践

立即掌握这些基本的 SSH 加固技术,保护您的 Linux 服务器安全。本专家指南提供了可操作的步骤,重点是修改 `sshd_config` 中的配置。了解如何禁用高风险的 root 登录、实施强制性的基于密钥的身份验证以消除弱密码、更改默认端口,以及安装 Fail2Ban 以有效限制暴力破解攻击的速率。通过将 SSH 转化为强大、安全的通道来保护您的系统。

Linux服务器SSH安全加固最佳实践

SSH通常是您在Linux服务器上打开的第一扇门,因此在将主机暴露给互联网之前,应该先加固SSH安全。机器人会不断尝试弱密码、重复使用的凭据以及端口22上的默认账户。

目标很简单:保持远程访问对您可用,对攻击者则痛苦。从第二个终端会话开始,保持当前SSH会话打开,并在重启守护进程之前测试每个更改。

首先备份并测试配置

在编辑/etc/ssh/sshd_config之前,请先备份。一个拼写错误可能会将您锁在服务器之外。

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak_$(date +%F)

编辑后,检查语法:

sudo sshd -t

如果测试通过,重新加载或重启SSH。服务名称在RHEL风格系统上通常是sshd,在Debian/Ubuntu上是ssh

sudo systemctl restart sshd
# 或
sudo systemctl restart ssh

1. 禁用root登录

直接root登录会让攻击者一开始就获得最有价值的用户名。使用普通用户账户,然后在需要管理权限时通过sudo提升权限。

配置步骤

打开/etc/ssh/sshd_config并找到PermitRootLogin指令。将其值更改为no

# 之前:
# PermitRootLogin yes

# 之后(最佳实践):
PermitRootLogin no

在重启SSH之前,确认您可以使用具有sudo权限的标准用户登录。

2. 要求基于密钥的身份验证

密码身份验证很容易受到大规模攻击。SSH密钥更难猜测,更容易轮换,并且在保护私钥密码的情况下,日常管理更安全。

生成并安装密钥

  1. 在本地机器上生成密钥对:
    ssh-keygen -t ed25519 -C "[email protected]"
    
  2. 将公钥复制到服务器:
    ssh-copy-id -i ~/.ssh/id_ed25519 user@your_server_ip
    

禁用密码身份验证

一旦确认可以使用SSH密钥成功登录,请完全禁用密码身份验证。

# 禁用密码
PasswordAuthentication no

# 确保启用密钥
PubkeyAuthentication yes

Ed25519是新密钥的良好默认选择。如果需要与旧系统兼容RSA,请使用大密钥,例如4096位。

3. 考虑更改默认SSH端口

将SSH从TCP端口22更改为非标准端口可以减少嘈杂的自动扫描。这不能替代密钥、访问控制或速率限制,因为任何人都可以通过扫描发现开放端口。

配置步骤

/etc/ssh/sshd_config中,更改Port指令:

# 之前:
# Port 22

# 之后(示例非标准端口):
Port 22222

在重启SSH之前更新防火墙和任何云安全组。否则,新的SSH守护进程可能正在监听您无法访问的端口。

使用firewalld的示例(CentOS/RHEL):

sudo firewall-cmd --permanent --add-port=22222/tcp
sudo firewall-cmd --reload

4. 限制对特定用户和组的访问

如果只有少数人应该使用SSH,请在sshd_config中明确说明。这可以防止被遗忘的本地账户成为远程入口点。

配置指令

sshd_config中使用以下一个或两个指令:

  1. 允许特定用户:
    AllowUsers alice bob
    
  2. 允许特定组:
    AllowGroups sshaccess admins
    

如果存在这些指令,任何未明确列出的用户或组都将被拒绝访问。

5. 保持现代SSH默认设置并禁用旧方法

当前的OpenSSH版本已经使用SSH协议2;现代OpenSSH已移除对旧协议1的支持。避免复制包含不受支持的Protocol指令或过时密码列表的旧加固片段。这些可能在升级后破坏SSH。

除非您知道需要,否则专注于禁用旧信任机制:

HostbasedAuthentication no
IgnoreRhosts yes
PermitEmptyPasswords no

如果您的组织需要自定义密码、MAC或密钥交换策略,请在更改之前检查已安装服务器支持的内容:

sshd -T | grep -E '^(ciphers|macs|kexalgorithms) '

然后仅应用与您的客户端基础匹配的经过测试的策略。过于严格的列表可能会锁定较旧的自动化主机。

6. 使用Fail2Ban添加速率限制

即使使用基于密钥的身份验证,重复探测也会浪费资源并混乱日志。Fail2Ban监视身份验证日志,并在重复失败后添加临时防火墙禁令。

  1. 安装Fail2Ban:

    # Debian/Ubuntu
    sudo apt update && sudo apt install fail2ban
    
    # RHEL/CentOS/Fedora
    sudo dnf install fail2ban
    
  2. 启用sshd监狱。许多系统附带默认配置,但您应该将本地覆盖放在/etc/fail2ban/jail.local/etc/fail2ban/jail.d/下的文件中。

    [sshd]
    enabled = true
    port = 22222
    maxretry = 5
    bantime = 1h
    
  3. 启动服务:

    sudo systemctl enable --now fail2ban
    

如果您更改了SSH端口,请确保Fail2Ban监狱匹配新端口。

7. 调整会话和身份验证设置

这些设置有助于关闭空闲会话并移除弱身份验证路径:

指令 推荐值 目的
ClientAliveInterval 300 每300秒发送一次服务器端保活检查。
ClientAliveCountMax 3 在三次未响应检查后断开连接。
UsePAM yes 启用可插拔身份验证模块(PAM)以增强本地系统安全策略。
PermitEmptyPasswords no 阻止空密码账户登录。
MaxAuthTries 3 限制每次连接的身份验证尝试次数。
X11Forwarding no 除非实际使用,否则禁用X11转发。

加固检查清单

使用此检查清单确保您的服务器满足基本SSH加固标准:

  1. 在更改前备份sshd_config
  2. 设置**PermitRootLogin no**。
  3. 设置**PasswordAuthentication no**(在密钥设置后)。
  4. 将**Port**更改为非标准值。
  5. 更新防火墙以允许新端口。
  6. 使用**AllowUsersAllowGroups**限制访问。
  7. 禁用旧信任方法,例如HostbasedAuthentication
  8. 安装并配置Fail2Ban
  9. 在重启前使用**sshd -t**检查配置。

加固SSH安全最好作为分层防御。密钥阻止密码猜测,用户限制减少可以连接的人,防火墙规则限制连接来源,Fail2Ban减慢重复探测。在测试时保持一个工作会话打开,然后为操作服务器的任何人记录新端口和登录方法。