第02章:AI配置的SSH,为什么不安全?

第02章:AI配置的SSH,为什么不安全?

“SSH 是你服务器的前门。AI 帮你开了门,但它可能忘了装锁。”


ℹ️ 版本说明:本章基于 Ubuntu 26.04 LTSOpenSSH 9.x

2.1 AI默认会生成什么

你让 AI 帮你配置 SSH 让团队成员登录服务器,它通常给你:

# AI 生成的 SSH 配置指导
# 1. 生成 SSH 密钥对
ssh-keygen -t rsa -b 4096 -C "team@company.com"

# 2. 复制公钥到服务器
ssh-copy-id user@server-ip

# 3. 修改 /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes

这个配置能工作,但是:

  • PermitRootLogin yes:允许直接 root 登录,任何得到 root 密码的人都能直接控制服务器
  • PasswordAuthentication yes:允许密码登录,暴露在互联网上的服务器会遭受持续的密码暴力破解
  • 使用了 RSA(较旧的算法)而不是更安全的 Ed25519

每天,全球有数百万次对 SSH 端口 22 的暴力破解尝试。AI 生成的默认配置对这些攻击完全没有防御。


2.2 AI通常遗漏的5个坑

⚠️ 坑1:允许密码认证(暴力破解的大门)

密码认证 + 暴露在公网 = 等着被破解。真实的攻击数据:一个新部署的云服务器,通常在几分钟内就会收到第一次 SSH 暴力破解尝试。

最小安全配置

PasswordAuthentication no
PubkeyAuthentication yes

只允许密钥登录,密码暴力破解就无从下手。


⚠️ 坑2:允许 root 直接 SSH 登录

即使你禁用了密码认证,允许 root SSH 登录也是危险的:

  • 一旦密钥泄露,攻击者直接获得 root 权限
  • 所有操作以 root 身份执行,没有 sudo 的审计日志
  • 违反了"最小权限原则"

正确做法

  1. 禁用 root SSH:PermitRootLogin no
  2. 创建普通用户,加入 sudo 组
  3. 普通用户 SSH 登录后,用 sudo 执行需要权限的命令

⚠️ 坑3:使用旧算法(RSA)而不是 Ed25519

AI 经常生成 ssh-keygen -t rsa -b 4096,但 Ed25519 是目前推荐的选择:

算法 安全性 密钥大小 性能
RSA 4096 3369 字节
Ed25519 更好 68 字节

Ed25519 基于椭圆曲线,抗量子计算能力更强,密钥更短,速度更快。OpenSSH 6.5+(Ubuntu 14.04+)已支持。


⚠️ 坑4:默认 SSH 端口 22(被扫描器重点关注)

端口 22 是全球 SSH 扫描器的首要目标。改端口不是真正的安全措施,但能显著减少日志噪音(自动化攻击)。

注意:改端口后,更新防火墙规则,否则你会把自己锁在外面。


⚠️ 坑5:没有登录失败锁定机制

即使只允许密钥登录,无限次的 SSH 连接尝试也是一种 DoS(拒绝服务)。fail2ban 会在检测到多次失败后自动封锁 IP。

AI 通常不会提醒你安装 fail2ban,因为它不是 SSH 配置本身的一部分。


2.3 更好的提示词

提示词 P01:生产就绪的 SSH 安全加固

使用时机:新服务器上线前的 SSH 安全配置

比默认多了什么

  • 完整的安全 sshd_config
  • fail2ban 配置
  • 验证步骤
帮我为 Ubuntu 26.04 LTS 服务器配置生产就绪的 SSH 安全加固。

要求:
1. SSH 密钥类型:使用 Ed25519(不用 RSA),生成命令带有 comment 区分用途
2. /etc/ssh/sshd_config 安全配置:
   - 禁用密码认证(PasswordAuthentication no)
   - 禁用 root 直接登录(PermitRootLogin no)
   - 只允许特定用户组 SSH 登录(AllowGroups sshusers)
   - 限制最大认证尝试次数(MaxAuthTries 3)
   - 设置登录超时(LoginGraceTime 30s)
   - 禁用 X11 转发和空密码
   - 明确指定允许的算法(密钥交换、加密、MAC)— 给出 2026 年的推荐算法列表
3. fail2ban 配置:检测到5次失败登录后封锁 IP 1小时
4. 操作步骤顺序(防止把自己锁在外面):
   a. 先确认新配置正确
   b. 开一个新 SSH 连接测试(不要关闭旧连接)
   c. 确认新连接成功后再退出旧连接

同时给我验证命令:如何确认当前 SSH 配置是否安全。

基于 Ubuntu 26.04 LTS + OpenSSH 9.x。

提示词 P02:为团队配置基于证书的 SSH 认证

使用时机:团队成员多(5人以上),需要统一管理 SSH 访问权限

比默认多了什么

  • SSH CA(证书颁发机构)
  • 证书有效期控制
  • 成员离职时无需逐台删 authorized_keys
帮我为一个10人团队配置基于 SSH CA 证书的认证系统。

场景:团队有多台服务器,目前用 authorized_keys 管理每个人的公钥。问题:有人离职时需要逐台删除他的密钥,很容易遗漏。

解决方案:使用 SSH CA(证书颁发机构):
1. CA 生成:创建用于签发证书的 CA 密钥对,保存在安全位置
2. 服务器配置:服务器信任 CA 公钥(不需要保存每个人的公钥)
3. 员工证书:为每个员工的公钥签发证书,设置有效期(如 365 天)
4. 权限控制:通过 principals 限制每个证书可登录的用户名
5. 撤销:员工离职时只需吊销证书(创建 KRL 文件),不需要改每台服务器

请给出:
- 完整的命令步骤(创建 CA → 签发证书 → 服务器配置 → 员工登录)
- KRL(Key Revocation List)的使用方法
- 证书到期的自动提醒机制

基于 Ubuntu 26.04 LTS + OpenSSH 9.x。

提示词 P03:SSH 审计和入侵检测

使用时机:服务器上线后,需要监控异常 SSH 登录

比默认多了什么

  • 登录日志分析
  • 异常检测
  • 告警脚本
帮我为 Ubuntu 26.04 LTS 服务器配置 SSH 登录审计和异常检测。

要求:
1. 登录记录:
   - 成功登录:记录用户名、IP、时间、来源地区(可选,用 geoip)
   - 失败登录:记录失败原因、IP
   - sudo 使用:记录每次 sudo 命令(通过 /etc/sudoers 配置)

2. 异常检测规则(用 awk/grep 分析 /var/log/auth.log):
   - 同一 IP 5分钟内失败 ≥10 次:打印告警
   - 非工作时间(22:00-06:00)有 root 相关操作:打印告警
   - 新的 IP 首次登录成功:打印通知

3. 告警脚本:
   - 检测到异常时,发送 curl 请求到 webhook(可以是飞书/钉钉/Slack)
   - 加入 crontab,每小时运行一次

4. 快速查询命令:
   - 最近24小时登录成功的用户和 IP
   - 最近24小时被 fail2ban 封锁的 IP
   - 当前有哪些 SSH 会话在线

基于 Ubuntu 26.04 LTS + Bash 5.2。

2.4 验收清单

检查项 验证方法 AI辅助
禁用密码认证 grep PasswordAuthentication /etc/ssh/sshd_config 让 AI 给出完整 sshd_config
禁用 root SSH grep PermitRootLogin /etc/ssh/sshd_config 让 AI 添加安全配置
使用 Ed25519 密钥 ssh-keygen -l -f ~/.ssh/id_*.pub 查看算法 让 AI 生成新密钥对
fail2ban 已启动 systemctl status fail2ban 让 AI 给出安装和配置命令
配置语法无错误 sshd -t(测试配置不重启) 让 AI 修复配置语法
用新连接测试后再改配置 操作步骤文档 让 AI 给出安全的操作顺序

2.5 本章小结

如果你只记一件事:把 PasswordAuthentication yes 改成 PasswordAuthentication no。这一行改动,让密码暴力破解对你的服务器完全无效。

SSH 安全的三个必做

  1. 只允许密钥登录PasswordAuthentication no + PubkeyAuthentication yes
  2. 禁用 root 直接登录PermitRootLogin no,要 root 权限就 sudo
  3. 安装 fail2ban:自动封锁暴力破解的 IP,减少日志噪音和 CPU 浪费

记住:改完 sshd_config 后,先开一个新 SSH 连接测试,确认能登进去了再关闭旧连接。这个步骤能防止你把自己锁在服务器外面。

→ 第3章:AI生成的crontab任务,会悄悄失败