2.6.4 SSH安全加固与最佳实践

SSH安全加固的核心目标是降低暴露面、增强认证强度、细化访问控制与审计能力。本节给出可落地的基线方案、示例配置、安装与排错流程,并配套练习。

原理草图:SSH加固关键点

文章图片

1. 最小暴露与攻击面缩减(示例+命令解释)
- 变更默认端口(减少低质量扫描)
- 禁止 root 远程登录、空密码
- 仅允许协议 2

# 文件路径:/etc/ssh/sshd_config
# 关键参数说明:
# Port            修改SSH监听端口
# PermitRootLogin 禁止root远程登录
# PermitEmptyPasswords 禁止空密码
# Protocol        仅允许协议2

sudo sed -i 's/^#Port .*/Port 2222/' /etc/ssh/sshd_config
sudo sed -i 's/^#PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#PermitEmptyPasswords .*/PermitEmptyPasswords no/' /etc/ssh/sshd_config
sudo sed -i 's/^#Protocol .*/Protocol 2/' /etc/ssh/sshd_config

# 检查配置合法性
sudo sshd -t
# 预期:无输出表示通过

2. 强化认证机制(密钥登录与禁止口令)

# 客户端生成密钥
ssh-keygen -t ed25519 -C "ops@corp" -f ~/.ssh/id_ed25519

# 上传公钥(示例端口2222)
ssh-copy-id -p 2222 ops@10.0.0.10

# 服务端配置:仅密钥登录,限制用户
sudo tee -a /etc/ssh/sshd_config >/dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
AllowUsers ops admin
MaxAuthTries 3
LoginGraceTime 30
EOF

sudo sshd -t && sudo systemctl reload sshd

3. 访问控制与会话安全(端口转发、空闲断开)

# 禁止X11与端口转发,减少被滥用的通道
sudo tee -a /etc/ssh/sshd_config >/dev/null <<'EOF'
AllowTcpForwarding no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
EOF

sudo sshd -t && sudo systemctl reload sshd
# 预期:无输出,连接空闲10分钟断开

4. 加密算法与合规基线(算法白名单)

# 仅保留强加密算法(按需调整)
sudo tee -a /etc/ssh/sshd_config >/dev/null <<'EOF'
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
HostKey /etc/ssh/ssh_host_ed25519_key
EOF

sudo sshd -t && sudo systemctl reload sshd

5. 完整配置示例(关键片段)

# /etc/ssh/sshd_config
Port 2222
Protocol 2
PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers ops admin
MaxAuthTries 3
LoginGraceTime 30
AllowTcpForwarding no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org

6. 安装与安全工具联动(Fail2ban)

# 安装
sudo yum install -y epel-release fail2ban || sudo apt-get install -y fail2ban

# 基本配置:5次失败封禁10分钟
sudo tee /etc/fail2ban/jail.d/sshd.local >/dev/null <<'EOF'
[sshd]
enabled = true
port = 2222
maxretry = 5
findtime = 10m
bantime = 10m
EOF

sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
# 预期:显示当前封禁数与规则

7. 变更上线与回滚策略

# 先测试配置,再reload
sudo sshd -t && sudo systemctl reload sshd

# 保留已登录会话进行验证
# 新端口验证
ssh -p 2222 ops@10.0.0.10

8. 常见排错(示例)
- 无法登录:检查端口、防火墙、用户权限

# 检查监听端口
sudo ss -lntp | grep sshd

# 检查防火墙规则
sudo firewall-cmd --list-ports || sudo iptables -L -n | grep 2222

# 查看日志(定位认证失败原因)
sudo tail -n 50 /var/log/secure  # CentOS/RHEL
sudo tail -n 50 /var/log/auth.log # Debian/Ubuntu
  • 配置错误导致重启失败:
sudo sshd -t
# 若提示Bad configuration option,按提示定位行号修正

9. 练习
1) 将默认端口改为 2222,并仅允许 ops 用户密钥登录。
2) 配置 ClientAliveInterval 300,验证空闲连接断开。
3) 启用 Fail2ban,模拟 5 次错误密码登录后查看封禁状态。
4) 使用 sshd -t 验证配置正确性并记录关键参数含义。