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密钥更难猜测,更容易轮换,并且在保护私钥密码的情况下,日常管理更安全。
生成并安装密钥
- 在本地机器上生成密钥对:
ssh-keygen -t ed25519 -C "[email protected]" - 将公钥复制到服务器:
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中使用以下一个或两个指令:
- 允许特定用户:
AllowUsers alice bob - 允许特定组:
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监视身份验证日志,并在重复失败后添加临时防火墙禁令。
安装Fail2Ban:
# Debian/Ubuntu sudo apt update && sudo apt install fail2ban # RHEL/CentOS/Fedora sudo dnf install fail2ban启用
sshd监狱。许多系统附带默认配置,但您应该将本地覆盖放在/etc/fail2ban/jail.local或/etc/fail2ban/jail.d/下的文件中。[sshd] enabled = true port = 22222 maxretry = 5 bantime = 1h启动服务:
sudo systemctl enable --now fail2ban
如果您更改了SSH端口,请确保Fail2Ban监狱匹配新端口。
7. 调整会话和身份验证设置
这些设置有助于关闭空闲会话并移除弱身份验证路径:
| 指令 | 推荐值 | 目的 |
|---|---|---|
ClientAliveInterval |
300 | 每300秒发送一次服务器端保活检查。 |
ClientAliveCountMax |
3 | 在三次未响应检查后断开连接。 |
UsePAM |
yes | 启用可插拔身份验证模块(PAM)以增强本地系统安全策略。 |
PermitEmptyPasswords |
no | 阻止空密码账户登录。 |
MaxAuthTries |
3 | 限制每次连接的身份验证尝试次数。 |
X11Forwarding |
no | 除非实际使用,否则禁用X11转发。 |
加固检查清单
使用此检查清单确保您的服务器满足基本SSH加固标准:
- 在更改前备份
sshd_config。 - 设置**
PermitRootLogin no**。 - 设置**
PasswordAuthentication no**(在密钥设置后)。 - 将**
Port**更改为非标准值。 - 更新防火墙以允许新端口。
- 使用**
AllowUsers或AllowGroups**限制访问。 - 禁用旧信任方法,例如
HostbasedAuthentication。 - 安装并配置Fail2Ban。
- 在重启前使用**
sshd -t**检查配置。
加固SSH安全最好作为分层防御。密钥阻止密码猜测,用户限制减少可以连接的人,防火墙规则限制连接来源,Fail2Ban减慢重复探测。在测试时保持一个工作会话打开,然后为操作服务器的任何人记录新端口和登录方法。