ssh加固核心是收口“谁、从哪来、用什么方式、能做什么”四维度:先摸清暴露面(ss监听地址、日志扫描记录、生效配置),再禁root直登、白名单allowusers、密钥认证、限制maxauthtries=3和logingracetime=60,收缩监听地址与安全组,禁用非必要子系统及sshv1,全程可验证可审计。

全面评估并加固 Linux 服务器的 SSH 访问矩阵,核心是把“谁、从哪来、用什么方式、能做什么”这四个维度全部收口到可验证、可审计、可收敛的策略中。不是改几个参数就叫加固,而是让每一次连接请求都必须通过层层校验,缺一不可。
摸清当前 SSH 实际暴露面
先别急着改配置,得知道真实情况。很多服务器看似加固了,但实际仍监听全网、允许密码登录、甚至 root 可直登——只是没人去查。
- 执行 ss -tlnp | grep :22 查看监听地址:若显示
0.0.0.0:22或[::]:22,说明 SSH 正在向公网完全暴露 - 检查 /var/log/auth.log(或
/var/log/secure)最近 24 小时的失败记录:grep "Failed password" /var/log/auth.log | tail -20,确认是否存在高频扫描 IP - 运行 ssh -T user@localhost 测试本地密钥登录是否生效;再用新终端尝试密码登录,验证
PasswordAuthentication是否真已关闭 - 用 sshd -T | grep -E "(PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|AllowUsers)" 直接输出当前生效配置,绕过注释干扰
收紧身份认证与访问主体
SSH 访问矩阵的第一层控制,就是明确“谁可以连”。这不是靠猜,而是用白名单机制硬性限定。
- 禁用 root 远程登录:
PermitRootLogin no(不是prohibit-password,后者仍留有密钥后门风险) - 只放行必要用户和来源:
AllowUsers deploy@192.168.10.0/24 admin@203.0.113.5,支持用户名+IP 段组合,比单纯AllowUsers更精细 - 确保所有允许用户均已配置有效公钥,且
~/.ssh/authorized_keys权限为600,目录为700 - 对临时调试账户,可配合
Match User tempuser块单独限制其登录时段或源 IP,用完即删
切断暴力破解路径与异常会话残留
攻击者不会只试一次,他们依赖的是服务端容忍度。加固的关键在于让每次失败都真正“失效”,而不是堆日志。
- 设
MaxAuthTries 3:三次错误即断开连接,不给重试机会 - 缩紧登录窗口:
LoginGraceTime 60,超时未完成认证自动释放连接 - 防挂起会话:
ClientAliveInterval 300+ClientAliveCountMax 2,10 分钟无响应即踢出 - 搭配
fail2ban监控/var/log/auth.log,对 5 分钟内失败 4 次的 IP 封禁 1 小时,后端用nftables(非 iptables)更轻量
收缩网络暴露与协议能力边界
SSH 不是 Web 服务,不该长期裸奔在公网。暴露面越小,被盯上的概率越低,被利用的路径也越少。
- 若非必须,不改端口,而改监听地址:设
ListenAddress 10.0.1.5:22(内网管理网段),或仅绑定云平台分配的跳板机弹性 IP - 禁用非必要子系统:
Subsystem sftp /usr/lib/openssh/sftp-server保留,其余如rsync、tcpforwarding全部注释掉 - 停用过时协议:
Protocol 2(确保无 SSH-1 遗留),OpenSSH 9.0+ 默认已弃用ssh-rsa,新部署必须用ed25519密钥 - 云环境务必同步收紧安全组:只放行可信 IP 段或跳板机出口 IP 到 SSH 端口,
0.0.0.0/0是高危信号











