用途
server-security-init-skill 是一个 AI 智能体技能,用于指导用户安全地初始化和加固全新的 Ubuntu/Debian SSH 服务器。它通过分阶段的引导流程,逐步完成从公钥登录到防火墙、fail2ban 的配置,并在每一步进行验证,防止因配置失误导致服务器被锁定。
主要能力
该技能提供以下方面的指导:
- 公钥 SSH 引导,避免在命令、日志或配置文件中暴露 root 密码
- 分阶段 SSH 加固,在禁用旧访问路径前先验证非 root sudo 登录可用
- UFW 防火墙设置,默认拒绝入站并显式允许所需端口
- Fail2ban jail 配置,用于 SSH 暴力破解防护,并支持管理 IP 例外
- Debian 12/systemd socket 检查,防止 ssh.socket 静默地将 SSH 保持在旧端口
- 使用 ss -ltnp、sshd -T、systemctl 和 ufw status 进行服务器端验证
- 针对 fail2ban 封禁、防火墙错误和 SSH 监听不匹配的恢复检查
使用方式
该技能应通过将 server-security-init/ 目录复制到 AI 智能体的用户级技能目录来安装。
对于 AI 智能体:
- 仅安装 server-security-init/ 目录,而非仓库根目录
- 不要在技能安装期间执行服务器初始化
- 安装后,告知用户其智能体是否需要重启或重新加载技能
对于使用 npx 的人类用户:
npx skills add https://github.com/DeerYang/server-security-init-skill/tree/main/server-security-init -g
指定特定智能体:
npx skills add https://github.com/DeerYang/server-security-init-skill/tree/main/server-security-init -g -a codex
分阶段安全初始化流程
阶段 1:预检与引导
在进行任何更改之前,收集并验证服务器 IP、当前用户、SSH 端口、管理 IP、本地 SSH 密钥、目标用户和目标 SSH 端口等信息。检查现有 SSH 密钥或生成新密钥(未经用户确认不要自动化此步骤)。测试基于密码的 root SSH 访问。
阶段 2:安装公钥
将公钥复制到服务器,可使用 ssh-copy-id 或手动方式。验证公钥登录是否有效。关键:在公钥认证验证通过之前,不要继续下一步。
阶段 3:创建非 root sudo 用户
创建用户并授予 sudo 权限,将 SSH 密钥复制到新用户,验证新用户可以通过 SSH 登录并免密使用 sudo。关键:在新用户验证通过之前,不要继续下一步。
阶段 4:配置防火墙(UFW)
安装 UFW,设置默认策略(拒绝入站、允许出站),在启用防火墙之前先允许新的 SSH 端口,然后启用防火墙并验证规则。
阶段 5:更改 SSH 端口
编辑 sshd_config,检查 ssh.socket(Debian 12+),重启 SSH 服务,验证新端口正在监听,并测试新端口。关键:在新端口验证通过之前,保持旧 SSH 会话打开。
阶段 6:加固 SSH 配置
禁用 root 登录、禁用密码认证、启用公钥认证、禁用 ChallengeResponseAuthentication,测试配置并重启 SSH,验证生效配置。
阶段 7:配置 Fail2ban
安装 fail2ban,创建本地 jail 配置,启用并重启服务,验证状态。
阶段 8:更新本地 SSH 配置
在本地 ~/.ssh/config 中添加服务器条目,测试简化连接。
验证清单
完成所有阶段后,在服务器端验证以下内容:
- SSH 服务:检查 SSH 仅监听正确端口,检查生效的 sshd 配置,检查 ssh.socket 是否干扰(Debian 12)
- 防火墙:状态为 active,默认入站为 deny,新 SSH 端口已允许,没有允许端口 22 的规则
- Fail2ban:服务处于 active,sshd jail 已启用,管理 IP 在 ignoreip 中
- 用户与 Sudo:以非 root 用户登录,用户具有 NOPASSWD sudo,用户在 sudo 组中
常见模式
- 添加额外管理 IP
- 开放额外防火墙端口
- 检查被封禁的 IP
- 解封 IP
故障排除
- 更改端口后被锁定:使用提供商控制台/VNC 访问,检查实际监听端口,检查 ssh.socket 和 ssh.service 状态,查看 /var/log/auth.log
- UFW 阻止了新 SSH 端口:使用控制台/VNC,禁用 UFW,允许新端口,重新启用
- Fail2ban 封禁了你的 IP:检查封禁状态,解封自己,添加到 ignoreip
- SSH 端口恢复为 22(Debian 12):当 ssh.socket 处于活动状态时会发生,禁用 ssh.socket 并启用 ssh.service
- Root 登录仍然有效:检查生效配置,确保 sshd_config 中 PermitRootLogin no 未被注释,没有 Match 块覆盖,重启 SSH
- 密码认证仍被接受:检查生效配置,编辑 sshd_config 设置 PasswordAuthentication no 和 ChallengeResponseAuthentication no,测试并重启
安全注意事项
- 更改 SSH 或防火墙设置时,始终保持现有 SSH 会话打开
- 在进入下一阶段之前验证每个阶段
- 在公钥登录验证通过之前,绝不要禁用密码认证
- 在防火墙允许新端口之前,绝不要更改 SSH 端口
- 在非 root sudo 用户验证通过之前,绝不要禁用 root 登录
- 提供商控制台/VNC 访问是最终的恢复途径
- 不要将私钥粘贴到提示、脚本或日志中
- 在配置更改后重启 SSH 之前,测试 sudo sshd -t
系统要求
- Ubuntu 20.04+ 或 Debian 11+
- OpenSSH 服务器
- systemd init 系统
- UFW(Uncomplicated Firewall)
- apt 仓库中可用的 fail2ban 包
该技能为 AI 辅助服务器管理提供指导。在生产系统上执行生成的命令之前,请始终审查。