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

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

39 浏览量

在 Linux 服务器上强化 SSH 安全性的最佳实践

安全外壳 (SSH) 几乎是所有 Linux 服务器远程管理的基石。虽然它功能强大且开箱即用通常很安全,但 SSH 也是恶意攻击者的主要目标,他们试图通过暴力破解、字典攻击和凭证填充来获取未经授权的访问权限。

强化您的 SSH 配置,可以说是保护新 Linux 部署最关键的一步。通过实施一些核心最佳实践——超越简单的用户名和密码认证——您可以大幅减少攻击面,最大限度地减少日志中的噪音,并确保只有使用安全方法的授权用户才能访问您的系统。

本指南概述了在任何 Linux 发行版上保护 SSH 服务的必要且可操作的步骤,重点关注主要配置文件:/etc/ssh/sshd_config


先决条件:备份配置

在对 SSH 守护进程配置 (sshd_config) 进行任何更改之前,创建备份至关重要。不正确的配置可能会导致您无法访问服务器。务必彻底测试更改。

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

编辑文件后,在重启服务之前检查语法:

sudo sshd -t

如果测试通过,您可以安全地重启 SSH 服务(命令因发行版而异):

# 对于使用 systemd 的系统(大多数现代发行版)
sudo systemctl restart sshd

1. 禁用 Root 登录

允许直接以 root 用户身份登录是最大的安全风险之一。如果攻击者成功暴力破解密码,他们将立即获得系统的完全控制权。相反,非 root 用户应首先登录,然后使用 sudo 提升权限。

配置步骤

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

# 之前:
# PermitRootLogin yes

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

重要提示

在禁用 root 登录 之前,请确保您已经创建并配置了至少一个具有 sudo 权限的标准用户。否则,您将无法获得管理访问权限。

2. 实施强制基于密钥的认证

密码认证容易受到暴力破解和字典攻击。SSH 密钥由公钥(在服务器上)和私钥(在客户端上)组成,由于其极高的复杂性和长度,提供了显著更强的安全性。

A. 生成并安装密钥

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

B. 禁用密码认证

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

# 禁用密码
PasswordAuthentication no

# 确保密钥已启用
PubkeyAuthentication yes

最佳实践: 使用 Ed25519 或 RSA 4096 位等强密钥类型。始终使用强密码保护私钥。

3. 更改默认 SSH 端口(纵深防御)

默认 SSH 端口(TCP 端口 22)不断被自动化机器人扫描。将端口更改为较高的非标准数字(例如 2222、22222 或 30000+)可以显著减少服务器日志中的噪音,并使您对普通扫描器不可见。

配置步骤

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

# 之前:
# Port 22

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

警告:需要调整防火墙

如果您更改端口,则 必须 更新您的防火墙(例如 iptablesfirewalld 或 AWS 安全组)以允许在新端口上的流量。否则将导致立即连接中断。

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

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

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

为了强制执行严格的访问控制,您应该明确定义哪些用户或组被允许通过 SSH 连接。即使帐户被泄露或未使用,这也能限制潜在的入口点。

配置指令

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

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

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

5. 强制使用更强的协议和加密算法

确保您正在使用现代且安全的 SSH 协议 2,并强制使用强大的加密算法和消息认证码 (MACs)。

配置步骤

验证是否禁用了较旧、易受攻击的协议:

Protocol 2

# 拒绝不安全的传统认证方法
HostbasedAuthentication no
IgnoreRhosts yes

虽然现代 SSH 实现通常默认配置良好,但明确定义强大的加密算法和 MACs 可以防止降级攻击。推荐的最低设置包括:

Ciphers [email protected],[email protected]
MACs hmac-sha2-512,hmac-sha2-256

6. 实施速率限制和入侵检测 (Fail2Ban)

即使使用基于密钥的认证,机器人持续的探测也会消耗资源并使日志混乱。Fail2Ban 是一个关键工具,它监控日志中的失败登录尝试(或其他可疑活动),并动态调整防火墙以临时或永久封禁源 IP 地址。

安装和配置(通用步骤)

  1. 安装 Fail2Ban:
    ```bash
    # Debian/Ubuntu
    sudo apt update && sudo apt install fail2ban

    RHEL/CentOS/Fedora

    sudo dnf install fail2ban
    `` 2. **配置 SSH 监狱 (Jail):** Fail2Ban 使用称为 'jails' 的配置。默认的sshdjail 在监控/var/log/auth.log`(或等效文件)中 SSH 服务的重复失败并自动应用临时封禁方面非常有效。

  2. 确保服务正在运行:
    bash sudo systemctl enable fail2ban sudo systemctl start fail2ban

Fail2Ban 显著缓解了自动化的暴力破解尝试,对于面向互联网的服务器来说是强制性的。

7. 其他重要的 SSH 强化指令

这些细微调整有助于管理会话并减少潜在的攻击窗口:

指令 推荐值 目的
ClientAliveInterval 300 每 300 秒(5 分钟)发送一个空数据包以保持会话活跃。
ClientAliveCountMax 3 断开连接前最大失败的“活动”检查次数(总空闲时间 15 分钟)。
UsePAM yes 启用可插拔认证模块 (PAM) 以实现额外的本地系统安全策略。
PermitEmptyPasswords no 禁止空密码用户登录(默认应为 no)。

强化清单总结

使用此清单确保您的服务器符合基本的 SSH 强化标准:

  1. [ ] 在进行更改前备份 sshd_config
  2. [ ] 设置 PermitRootLogin no
  3. [ ] 设置 PasswordAuthentication no(密钥设置后)。
  4. [ ] 将 Port 更改为非标准值。
  5. [ ] 更新防火墙以允许新端口。
  6. [ ] 使用 AllowUsersAllowGroups 限制访问。
  7. [ ] 设置 Protocol 2
  8. [ ] 安装并配置 Fail2Ban
  9. [ ] 在重启前使用 sshd -t 检查配置。

通过实施这些最佳实践,您可以将 SSH 从潜在的隐患转变为高度安全的远程管理通道。