SSH 加固清单:上架第一小时的 12 个动作
新服务器上架第一小时的 12 个 SSH 加固动作:密钥登录、禁 root 密码、改默认行为、fail2ban、日志与告警。每个动作一条命令 + 一个「为什么」,可直接照抄执行,全部幂等。
互联网上无差别的扫描与爆破每分钟都在发生——新服务器上线的第一小时做完这 12 个动作,能挡掉绝大多数自动化攻击。安全不是买来的产品,是一组默认动作。本篇是安全基线中心的核心清单篇:每个动作给「命令 + 为什么 + 验证」,照抄即可,脚本化版本在自动化脚本。
第一组:进门方式(动作 1–4)
- ① 配置密钥登录——密钥对本地生成,公钥上服务器:
为什么:密码可以被字典爆破,256 位密钥不能。验证:新开终端用密钥能登录,才算完成本步;ssh-keygen -t ed25519 -C "admin@$(hostname)-$(date +%F)" # 本地执行;ed25519 短且强 ssh-copy-id root@新服务器IP # 公钥推送;没有 ssh-copy-id 就手动追加到 ~/.ssh/authorized_keys - ② 禁用密码认证——确认①成功后执行:
为什么:这是爆破攻击的终局开关——密码认证关了,字典攻击的收益归零;echo -e "PasswordAuthentication no\nPubkeyAuthentication yes" > /etc/ssh/sshd_config.d/99-hardening.conf systemctl reload sshd # Debian/Ubuntu 服务名可能是 ssh - ③ 限制 root 直登——
PermitRootLogin prohibit-password(写入同一 drop-in 文件):root 只许密钥;更严格的做法是普通用户 + sudo,审计粒度更细; - ④ 收紧尝试参数——
MaxAuthTries 3与LoginGraceTime 20:把每次连接的试探成本抬高,日志噪音同步下降。
第二组:自动防御(动作 5–7)
- ⑤ 装 fail2ban——
为什么:密钥登录下爆破已无收益,但扫描噪音会淹没有价值的日志——fail2ban 把惯犯 IP 关进小黑屋,日志清爽一半;apt-get install -y fail2ban # 或 yum/dnf printf '[sshd]\nenabled = true\nmaxretry = 5\nfindtime = 600\nbantime = 3600\n' > /etc/fail2ban/jail.d/sshd.local systemctl enable --now fail2ban && fail2ban-client status sshd - ⑥ 防火墙只留必要端口——默认拒绝入站,SSH(与业务端口)白名单放行,完整基线见防火墙基线;
- ⑦ 自动安全更新——
apt-get install -y unattended-upgrades && dpkg-reconfigure -f noninteractive unattended-upgrades:只自动装安全补丁,大版本升级仍然人工——「不自动升级大版本」也是纪律的一部分。
第三组:可见性(动作 8–10)
- ⑧ 登录告警——每次 SSH 登录发一封邮件/一条通知(/root/.ssh/rc 或 pam 脚本挂一行 curl 到你的通知端点):你自己没登录而告警响了,就是入侵的第一信号;
- ⑨ 审计日志确认——
为什么:出事后第一个问题永远是「什么时候进来的」——日志留存期与完整性要在第一天确认(云镜像有时默认裁剪日志);journalctl -u sshd --since "1 hour ago" | grep -E "Accepted|Failed" | tail -20 last -10 # 最近登录记录:IP 都认识吗? - ⑩ 基线快照——把当前状态存档:开放端口(ss -tlnp)、运行进程(ps auxf)、账户清单(awk -F: '$3>=1000{print $1}' /etc/passwd)、crontab——日后「多出来的东西」都对照这份快照找。
第四组:纵深(动作 11–12)
- ⑪ 时间同步——
timedatectl set-ntp true:日志时间戳错乱的机器,取证时每一步都要先校时——第一小时就把它修好; - ⑫ 恢复通道确认——测试机房提供的 IPMI/VNC/控制台通道可用(独服)或快照功能可用(VPS):万一 SSH 把自己锁在门外(改配置手滑是高频事故),这条通道就是唯一的门。验证方式:真的用它登录一次。
十二动作速查表
| # | 动作 | 一句话命令/位置 | 验证方式 |
|---|---|---|---|
| 1 | 密钥登录 | ssh-keygen + ssh-copy-id | 新终端密钥登录成功 |
| 2 | 禁密码认证 | sshd_config.d drop-in | 密码登录被拒 |
| 3 | 限制 root | PermitRootLogin prohibit-password | 配置回显 |
| 4 | 收紧尝试 | MaxAuthTries/LoginGraceTime | 配置回显 |
| 5 | fail2ban | jail.d/sshd.local | status sshd 有 jail |
| 6 | 防火墙 | 默认拒绝+白名单 | 非白名单端口不通 |
| 7 | 自动安全更新 | unattended-upgrades | 服务在位 |
| 8 | 登录告警 | ssh rc/pam 挂钩 | 自己登录收到通知 |
| 9 | 日志确认 | journalctl + last | 能看到 Accepted/Failed |
| 10 | 基线快照 | ss/ps/passwd/cron 归档 | 快照文件存在 |
| 11 | 时间同步 | timedatectl set-ntp | NTP 状态 synchronized |
| 12 | 恢复通道 | IPMI/VNC/快照 | 真实走通一次 |
密钥管理纪律:加固之后的一半工作
12 个动作把门换成了密钥锁,钥匙本身的管理决定这套锁的成色:①一机一钥——每台服务器独立密钥对,一把泄露不连坐;②私钥加密存储——ssh-keygen 时的 passphrase 别留空,私钥文件权限 600,配合 ssh-agent 免去重复输入;③人员变动即轮换——离职与外包结束的当天删公钥(authorized_keys 是一行一个的清单,删行即断权),这台机器的授权面从此干净;④备份恢复通道与密钥分离——IPMI/控制台通道的凭据单独存放(密码管理器),SSH 密钥全丢时它还在。四条约十分钟就能落实到台账里,但省掉的是「钥匙失控」这类最难排查的事故。
常见翻车与误区
- 改端口不是安全——换端口只降噪音不降风险(扫描器全端口扫),做了②⑤之后端口号的边际价值趋近于零;改与不改都随意,别把它当核心防线;
- 先禁密码后配密钥 = 自锁门外——顺序永远是①→验证→②;真锁了走动作⑫的恢复通道;
- 清单做完 ≠ 安全完成——这 12 个动作挡住的是自动化攻击(占实际攻击的绝大多数),针对性攻击要靠应急响应流程(见安全基线中心的后续批次与诊断思路)。
下一步:12 个动作的幂等脚本版在自动化脚本(新机器一条命令跑完);防火墙的完整口径在防火墙基线;备份与恢复在恢复演练;全景回安全基线中心。练手环境从入门 VPS($5.34/月)开始,成本最低的沙盒。