在 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. 生成并安装密钥
- 生成密钥对(在您的本地客户端机器上):
bash ssh-keygen -t ed25519 -C "[email protected]" - 复制公钥(到服务器):
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
警告:需要调整防火墙
如果您更改端口,则 必须 更新您的防火墙(例如
iptables、firewalld或 AWS 安全组)以允许在新端口上的流量。否则将导致立即连接中断。
使用 firewalld 的示例 (CentOS/RHEL):
sudo firewall-cmd --permanent --add-port=22222/tcp
sudo firewall-cmd --reload
4. 限制特定用户和组的访问
为了强制执行严格的访问控制,您应该明确定义哪些用户或组被允许通过 SSH 连接。即使帐户被泄露或未使用,这也能限制潜在的入口点。
配置指令
在 sshd_config 中使用以下一个或两个指令:
- 允许特定用户:
config AllowUsers alice bob - 允许特定组:
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 地址。
安装和配置(通用步骤)
-
安装 Fail2Ban:
```bash
# Debian/Ubuntu
sudo apt update && sudo apt install fail2banRHEL/CentOS/Fedora
sudo dnf install fail2ban
`` 2. **配置 SSH 监狱 (Jail):** Fail2Ban 使用称为 'jails' 的配置。默认的sshdjail 在监控/var/log/auth.log`(或等效文件)中 SSH 服务的重复失败并自动应用临时封禁方面非常有效。 -
确保服务正在运行:
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 强化标准:
- [ ] 在进行更改前备份
sshd_config。 - [ ] 设置
PermitRootLogin no。 - [ ] 设置
PasswordAuthentication no(密钥设置后)。 - [ ] 将
Port更改为非标准值。 - [ ] 更新防火墙以允许新端口。
- [ ] 使用
AllowUsers或AllowGroups限制访问。 - [ ] 设置
Protocol 2。 - [ ] 安装并配置 Fail2Ban。
- [ ] 在重启前使用
sshd -t检查配置。
通过实施这些最佳实践,您可以将 SSH 从潜在的隐患转变为高度安全的远程管理通道。