用途
SSH Hardening 技能用于加固 VPS 服务器上的 SSH 配置。SSH 是服务器管理的主要入口,也是关键攻击面,合理的 SSH 加固可以防止未授权访问、暴力破解攻击和凭据窃取。该技能面向 AI 智能体,帮助其按行业标准实践完成 SSH 安全配置。
主要能力
- 创建具有 sudo 权限的非 root 用户
- 生成并配置 SSH 密钥认证
- 禁用基于密码的认证
- 禁用通过 SSH 的 root 登录
- 在 sshd_config 中配置安全设置
- 在应用前测试配置
适用场景
- 为新 VPS 服务器设置安全的 SSH 访问
- 用 SSH 密钥替代密码认证
- 为满足安全合规要求禁用 root 登录
- 加固现有服务器以抵御暴力破解攻击
- 修复与 SSH 相关的安全审计发现
- 实施最小权限原则
前提条件
- 拥有服务器的 root 或现有 sudo 用户访问权限
- 能够通过 SSH 访问服务器(保持当前会话打开)
- 本地机器上安装 SSH 客户端(ssh、ssh-keygen、ssh-copy-id)
- 本地机器可访问终端
使用方式(加固步骤)
步骤 1:创建非 root 用户
关键:完成此步骤并测试后再禁用 root 登录。
创建用于日常操作的新用户:
# 创建用户(将 'deployer' 替换为所需用户名)
sudo adduser deployer
按提示输入强密码。将用户加入 sudo 组:
sudo usermod -aG sudo deployer
继续前测试 sudo 访问:
# 切换到新用户
su - deployer
# 测试 sudo
sudo whoami
# 应输出:root
# 退出回原用户
exit
步骤 2:生成 SSH 密钥对(本地机器)
在本地机器(不是服务器)上生成 SSH 密钥:
ssh-keygen -t ed25519 -C "your-email@example.com"
密钥类型说明:
- ed25519 - 现代、安全、快速(推荐)
- 替代方案:rsa -b 4096 用于较旧系统
提示时:
- 按 Enter 保存到默认位置(~/.ssh/id_ed25519)
- 输入强密码短语(推荐)或留空
步骤 3:将 SSH 密钥复制到服务器
从本地机器将公钥复制到服务器:
ssh-copy-id deployer@your-server-ip
按提示输入用户密码。
手动替代方案(如果 ssh-copy-id 不可用):
# 在本地机器上显示公钥
cat ~/.ssh/id_ed25519.pub
# 在服务器上,以新用户身份
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
# 粘贴公钥,保存并退出
chmod 600 ~/.ssh/authorized_keys
步骤 4:测试 SSH 密钥认证
关键:在新的终端窗口中测试,保持现有会话打开。
ssh deployer@your-server-ip
应无需输入密码即可连接(或仅输入 SSH 密钥密码短语)。如果连接失败,不要继续步骤 5,先排查问题。
步骤 5:加固 SSH 配置
警告:谨慎进行这些更改。在关闭现有会话前,先在新终端中测试。
编辑 SSH 守护进程配置:
sudo nano /etc/ssh/sshd_config
更新或添加以下设置:
# 禁用 root 登录
PermitRootLogin no
# 禁用密码认证
PasswordAuthentication no
# 禁用空密码
PermitEmptyPasswords no
# 限制认证尝试次数
MaxAuthTries 3
# 仅允许特定用户(可选但推荐)
AllowUsers deployer
# 仅使用 SSH 协议 2
Protocol 2
# 禁用 X11 转发(除非需要)
X11Forwarding no
# 设置登录宽限时间
LoginGraceTime 60
# 禁用基于主机的认证
HostbasedAuthentication no
可选高级设置:
# 更改默认端口(通过隐匿实现安全,可选)
# Port 2222
# 禁用代理转发(除非需要)
# AllowAgentForwarding no
# 禁用 TCP 转发(除非需要)
# AllowTcpForwarding no
# 设置空闲超时
# ClientAliveInterval 300
# ClientAliveCountMax 2
步骤 6:测试配置
测试配置文件是否存在语法错误:
sudo sshd -t
无输出表示配置有效。
步骤 7:重启 SSH 服务
关键:重启前先在新终端中测试。
# 先在新终端中测试连接
ssh deployer@your-server-ip
# 如果成功,重启 SSH(在原终端中)
sudo systemctl restart sshd
验证:
sudo systemctl status sshd
步骤 8:验证 root 登录已禁用
尝试以 root 连接(应失败):
ssh root@your-server-ip
预期结果:Permission denied (publickey)
配置参考
AllowUsers 与 AllowGroups
将 SSH 访问限制到特定用户或组:
# 选项 1:特定用户
AllowUsers deployer admin
# 选项 2:特定组中的用户
AllowGroups sshusers
端口更改
更改默认 SSH 端口(22)可减少自动化扫描器的噪声:
Port 2222
记住:
- 重启 SSH 前更新防火墙规则
- 连接时使用新端口:ssh -p 2222 user@host
仅密钥认证
确保这些设置协同工作:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
安全最佳实践
- 关闭会话前始终测试 - 保持一个会话打开直到验证完成
- 使用 SSH 密钥密码短语 - 增加另一层安全
- 限制用户访问 - 使用 AllowUsers 或 AllowGroups
- 监控认证日志 - 定期检查 /var/log/auth.log
- 使用 fail2ban - 为重复失败尝试添加自动封禁
- 定期轮换密钥 - 定期生成新密钥
- 禁用未使用的功能 - X11Forwarding、TCP 转发等
故障排查
被锁在服务器外
预防是关键:
- 进行更改时始终保持一个会话打开
- 在关闭现有会话前先在新终端中测试
- 通过托管服务商的控制面板拥有控制台访问权限
恢复:
- 使用托管服务商的控制台/VNC 访问
- 还原 /etc/ssh/sshd_config 的更改
- 重启 sshd 服务
SSH 密钥不工作
# 检查服务器上的文件权限
ls -la ~/.ssh/
# 应显示:
# drwx------ .ssh/
# -rw------- authorized_keys
# 如需要,修复权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 检查 SSH 日志
sudo tail -f /var/log/auth.log
更改后连接被拒绝
# 检查 SSH 服务状态
sudo systemctl status sshd
# 查看最近错误
sudo journalctl -u sshd -n 50
# 测试配置
sudo sshd -t
常见错误
- 在测试新配置前关闭所有 SSH 会话
- 在设置 SSH 密钥前禁用密码认证
- 未测试新用户的 sudo 访问
- sshd_config 中的拼写错误导致服务失败
- 更改后忘记重启 sshd
- 更改 SSH 端口时未更新防火墙
附加资源
- 完整 sshd_config 参考见 references/sshd-config.md
- 自动化设置脚本见 scripts/setup-ssh-hardening.sh
相关技能
- firewall-configuration - 限制 SSH 端口访问
- fail2ban-setup - 自动封禁暴力破解尝试
- auto-updates - 保持 SSH 修补漏洞