AxionserveSign in / RegisterEnglish/中文/cn繁体/tw

SSH 加固清单:上架第一小时的 12 个动作

新服务器上架第一小时的 12 个 SSH 加固动作:密钥登录、禁 root 密码、改默认行为、fail2ban、日志与告警。每个动作一条命令 + 一个「为什么」,可直接照抄执行,全部幂等。

· AxionServe 编辑部 · 云安全

互联网上无差别的扫描与爆破每分钟都在发生——新服务器上线的第一小时做完这 12 个动作,能挡掉绝大多数自动化攻击。安全不是买来的产品,是一组默认动作。本篇是安全基线中心的核心清单篇:每个动作给「命令 + 为什么 + 验证」,照抄即可,脚本化版本在自动化脚本。

SSH 加固十二动作分组示意

第一组:进门方式(动作 1–4)

  • ① 配置密钥登录——密钥对本地生成,公钥上服务器:
    ssh-keygen -t ed25519 -C "admin@$(hostname)-$(date +%F)"   # 本地执行;ed25519 短且强
    ssh-copy-id root@新服务器IP                                  # 公钥推送;没有 ssh-copy-id 就手动追加到 ~/.ssh/authorized_keys
    为什么:密码可以被字典爆破,256 位密钥不能。验证:新开终端用密钥能登录,才算完成本步;
  • ② 禁用密码认证——确认①成功后执行:
    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——
    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
    为什么:密钥登录下爆破已无收益,但扫描噪音会淹没有价值的日志——fail2ban 把惯犯 IP 关进小黑屋,日志清爽一半;
  • ⑥ 防火墙只留必要端口——默认拒绝入站,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限制 rootPermitRootLogin prohibit-password配置回显
4收紧尝试MaxAuthTries/LoginGraceTime配置回显
5fail2banjail.d/sshd.localstatus sshd 有 jail
6防火墙默认拒绝+白名单非白名单端口不通
7自动安全更新unattended-upgrades服务在位
8登录告警ssh rc/pam 挂钩自己登录收到通知
9日志确认journalctl + last能看到 Accepted/Failed
10基线快照ss/ps/passwd/cron 归档快照文件存在
11时间同步timedatectl set-ntpNTP 状态 synchronized
12恢复通道IPMI/VNC/快照真实走通一次

密钥管理纪律:加固之后的一半工作

12 个动作把门换成了密钥锁,钥匙本身的管理决定这套锁的成色:①一机一钥——每台服务器独立密钥对,一把泄露不连坐;②私钥加密存储——ssh-keygen 时的 passphrase 别留空,私钥文件权限 600,配合 ssh-agent 免去重复输入;③人员变动即轮换——离职与外包结束的当天删公钥(authorized_keys 是一行一个的清单,删行即断权),这台机器的授权面从此干净;④备份恢复通道与密钥分离——IPMI/控制台通道的凭据单独存放(密码管理器),SSH 密钥全丢时它还在。四条约十分钟就能落实到台账里,但省掉的是「钥匙失控」这类最难排查的事故。

常见翻车与误区

  • 改端口不是安全——换端口只降噪音不降风险(扫描器全端口扫),做了②⑤之后端口号的边际价值趋近于零;改与不改都随意,别把它当核心防线;
  • 先禁密码后配密钥 = 自锁门外——顺序永远是①→验证→②;真锁了走动作⑫的恢复通道;
  • 清单做完 ≠ 安全完成——这 12 个动作挡住的是自动化攻击(占实际攻击的绝大多数),针对性攻击要靠应急响应流程(见安全基线中心的后续批次与诊断思路)。

下一步:12 个动作的幂等脚本版在自动化脚本(新机器一条命令跑完);防火墙的完整口径在防火墙基线;备份与恢复在恢复演练;全景回安全基线中心。练手环境从入门 VPS($5.34/月)开始,成本最低的沙盒。