本系列:SSH 安全加固实战(共 5 篇) ① 为什么你的 SSH 正在裸奔 → ② 先读懂配置文件再动手 → ③ 用密钥认证告别密码 → ④ 限制谁能登录、从哪里登录(本篇) → ⑤ 防暴力破解与安全审计
第 3 篇关掉了密码登录,爆破的最大威胁已堵上。但攻击面还能继续收窄:账号层面限制谁能登进来、网络层面只放行可信来源,并砍掉用不上的资源占用。这一篇把这些做细,让你的入口更"隐蔽、干净、难接近"。
账号层面:只让该登录的人能登录
在 sshd_config 里可用白名单机制,只允许指定账号或用户组登录:
# 只允许 user1、user2 两个账号登录
AllowUsers user1 user2
# 或者只允许 admin 组里的用户登录
AllowGroups admin
提示框:
AllowUsers与AllowGroups是白名单(命中才放行),DenyUsers/DenyGroups是黑名单。生产环境建议用白名单更稳。二者可同时存在,规则叠加生效。
设置后同样 sshd -t + reload(注意服务名),并用另一个账号测试确认被拒、目标账号正常。这样即使某个账号被暴力破解尝试,只要不在白名单内也进不来。
会话层面:限制并发与重试,避免资源被耗死
攻击者会不断建立半开连接、反复试探,拖慢甚至拖垮服务。限制几个防拖垮参数:
LoginGraceTime 30 # 认证超时秒数,太久容易堆积半开连接
MaxAuthTries 3 # 单次连接最大认证尝试次数
MaxSessions 10 # 单连接最多打开的会话数
MaxStartups 10:30:100 # 未认证并发连接上限,防 DoS
解释:
LoginGraceTime:一次连接若在 30 秒内没完成认证就断开,减少挂着的僵尸连接。MaxAuthTries:限制单次连接里猜密码的次数,配合第 3 篇关密码更安全。MaxStartups:并发未完成认证的连接数达到 10 后,新连接以 30% 概率被拒,超过 100 全部拒绝,是经典防爆破/防拖垮配置。
提示框:不要为了省事把这些设得极苛刻导致误伤自己(比如自己在慢网络上
MaxAuthTries 1容易把自己挡外面)。保留逃生会话、一次改一项的原则依然适用。
保活与空闲断开:避免会话永远挂着
长期空闲的连接既占资源,也可能被劫持复用。可加:
ClientAliveInterval 300 # 每 300 秒向客户端发一次探活包
ClientAliveCountMax 0 # 连续 0 次未响应即断开(即探活失败就断)
这样 5 分钟没响应的空闲连接会被主动断开,清理僵尸会话。若你经常挂着长时间任务,可适当放宽或使用 tmux/screen 保持任务(那是另一个话题)。
网络层面:用防火墙只放行可信来源
账号限制管的是"谁能登录",网络层还要管"从哪来能到达 22 端口"。这是比改端口更本质的收窄。
Debian / Ubuntu —— ufw
sudo ufw allow from 你的家/办公IP to any port 22 proto tcp
sudo ufw enable
把"你的家/办公IP"换成你固定的出口 IP。家里宽带若无固定公网 IP,可改为只允许公司的 IP 段,或用 VPN/跳板机(见文末)。
查看与确认:
sudo ufw status verbose
RHEL / CentOS / Rocky —— firewalld
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的家/办公IP" port protocol="tcp" port="22" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
提示框:原理相同,只是命令体系不同。ufw 用
allow from X,firewalld 用 rich-rule 指定source address。都能实现"只放行某个来源 IP 到 22"。两个体系不要混用。
关键纪律:加白名单规则时,先确保你自己的连接来源 IP 在放行列表内,且当前会话保持登录,再 reload/生效,否则可能把自己挡在防火墙外。若 IP 会变,考虑 VPN 进入内网后再连 SSH(更安全也更省心)。
要不要改监听端口?—— 权衡
常见做法是把 Port 22 改成如 2222。作用与代价:
- 作用:让地毯式扫描器"撞不到"默认端口,显著降低噪音(无脑扫描 22 的数量远多于随机端口)。
- 代价:不等于安全。真正有针对性的扫描仍能发现;且客户端连接都要带
-p 端口或写进~/.ssh/config,稍有不便。
建议:改端口作为降低噪音的辅助手段,但不要指望它替代防火墙白名单与密钥认证。改法(记得逃生会话):
Port 2222
reload 后用客户端指定新端口验证:ssh -p 2222 user@server_ip。
安全提示:开放公网服务前务必清楚"最低权限 + 最小暴露"原则——只开必需端口、只放行可信来源、只允许必要账号。SSH 是同理。
禁用 root 直登并改用 sudo
即便有密钥,最佳实践是禁止 root 直接用 SSH 登录,日常用普通账号 + sudo:
PermitRootLogin no
这样即使某把 root 私钥泄露或 root 账号被探测,也难以直接登入最高权限账号。日常操作用普通用户提权即可(sudo 命令)。
提示框:云厂商(阿里云/腾讯云/AWS 等)镜像的默认账号常叫
root、ubuntu、ec2-user等。禁用 root 前,先确认你有一个能sudo的普通账号,否则会失去管理能力。
组合起来:一个更完整的入口策略
把这四层叠加,就是"纵深防御"的样子:
- 密钥认证(第 3 篇)—— 防密码爆破
- 白名单账号(本篇)—— 只允许必要账号
- 防火墙来源限制(本篇)—— 只放行可信 IP
- 会话/并发参数 + 禁用 root 直登(本篇)—— 防拖垮、降风险
- (可选)改端口 —— 降扫描噪音
本篇小结
- 账号白名单
AllowUsers/AllowGroups收窄"谁能登录"。 LoginGraceTime/MaxAuthTries/MaxStartups防止资源被爆破拖垮。ClientAlive*清理空闲会话。- 防火墙 ufw / firewalld 只放行可信来源 IP,比改端口更本质。
- 改端口只降噪音;禁用 root 直登 + sudo 是更稳妥的长期做法。
下一篇预告
入口已经收得很窄了。最后一篇做主动拦截与持续维护:用 fail2ban 自动封禁爆破 IP、看日志做安全审计,并给出一份贯穿全系列的最终自测清单。
建议先在服务器上开启防火墙并配置账号白名单,逐项验证后再进入终篇。我们下一篇见。