第02章:AI配置的SSH,为什么不安全?
第02章:AI配置的SSH,为什么不安全?
“SSH 是你服务器的前门。AI 帮你开了门,但它可能忘了装锁。”
ℹ️ 版本说明:本章基于 Ubuntu 26.04 LTS、OpenSSH 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 的审计日志
- 违反了"最小权限原则"
正确做法:
- 禁用 root SSH:
PermitRootLogin no - 创建普通用户,加入 sudo 组
- 普通用户 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 安全的三个必做:
- 只允许密钥登录:
PasswordAuthentication no+PubkeyAuthentication yes - 禁用 root 直接登录:
PermitRootLogin no,要 root 权限就 sudo - 安装 fail2ban:自动封锁暴力破解的 IP,减少日志噪音和 CPU 浪费
记住:改完 sshd_config 后,先开一个新 SSH 连接测试,确认能登进去了再关闭旧连接。这个步骤能防止你把自己锁在服务器外面。
→ 第3章:AI生成的crontab任务,会悄悄失败