SuperAPI AI 工具集

ssh-hardening

安全与审计

查看项目

更新于 10-15 13:49

技能介绍

用途

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 修补漏洞