从数万次暴力破解说起:一台云主机的 SSH 加固实录

从数万次暴力破解说起:一台云主机的 SSH 加固实录

一、起因:服务器被人撞了几万次

排查一台云主机(轻量应用服务器实例)时,在安全日志里发现大量连接失败的记录,大致是:连接失败数万次,被临时封禁的 IP 上百个。

这些记录的本质很简单:全世界的扫描节点探测到你的公网 IP,对着默认的 22 端口,用常见弱口令字典反复尝试登录 root。只要 22 端口开放、密码登录开放,这种事就不会停。

问题的解法也清楚:改端口、配密钥、关密码、收紧来源 IP。本文把整个梳理和加固过程按真实操作顺序记录下来,供同样使用云主机 + 运维面板的人参考。


二、先搞清楚:你改的到底是哪把密码

很多新手第一步就踩坑:云控制台里的”重置密码/重设实例密码”,改的是操作系统登录密码(root 密码),也就是 SSH 登录用的那个,和运维面板的登录账号完全无关。

项目 说明
入口 云控制台实例的”重置密码”
作用对象 操作系统 root 密码
影响范围 SSH 登录、系统命令执行
不影响 运维面板独立端口的登录账号

重置过程中实例通常会重启,有短暂中断,操作前先确认业务能接受。


三、SSH 到底是怎么连上的

一条命令就能连:

ssh -p 端口号 用户名@公网IP

需要凑齐四项:

要素 说明
公网 IP 云主机分配的公网地址
用户名 如 root
密码 云控制台设置的系统密码
端口 默认 22,加固后改为高位端口

主流桌面系统自带的命令行工具都是标准的 SSH 客户端,直接敲上面的命令、输入密码即可登录;较老的系统如果没有自带 SSH 客户端,装一个兼容客户端即可。

这也解释了那几万次攻击的原理:只要主机在公网、22 端口开放、密码登录开放,任何人都能拿 SSH 客户端去试你的密码。


四、改端口只是”躲”,关密码才是”扛”

4.1 第一步:改 SSH 端口

在 /etc/ssh/sshd_config 里设置:

Port 新端口号

重启 sshd:

systemctl restart sshd

同时在云平台防火墙/安全组里放行新端口,并把运维面板端口、HTTP 80、HTTPS 443 一并放行。

改完端口后,登录命令变为:

ssh -p 新端口号 用户名@公网IP

注意:改端口后,云控制台自带的网页终端如果选择”SSH 连接方式”,默认往往还是找 22 端口,需要在连接配置里手动把端口改成新端口,否则后台 SSH 连不上。

4.2 为什么只改端口不够

改端口只是把”门牌号”换成不那么显眼的,但门还是”报密码就能开”。扫描器扫到新端口照样可以猜密码。改端口是”躲”,禁用密码登录才是”扛”。


五、核心机制:公钥是锁,私钥是钥匙

SSH 密钥登录是一对:

文件 比喻 存放位置 能否公开
xxx.pub(公钥) 锁 贴在服务器 ~/.ssh/authorized_keys ✅ 可以
xxx(私钥) 钥匙 留在你自己的电脑上 ❌ 绝对不能

流程:

  1. 生成一对密钥(一把锁 + 一把钥匙);
  2. 把公钥(锁)装到服务器上;
  3. 登录时用自己的私钥(钥匙)去开,服务器验证匹配就放行;
  4. 攻击者手里没有你的私钥,即使知道 IP、端口、用户名、密码也进不来。

私钥从不在网络中传输,服务器只用公钥验证”你确实持有对应的私钥”。配了密钥不等于密码登录自动关闭,必须单独设置。


六、完整加固流程(防锁死版)

第 1 步:生成密钥(在你自己电脑上)

ssh-keygen -t ed25519 -C "备注名"

一路回车,生成:

  • ~/.ssh/xxx(私钥,自己留好)
  • ~/.ssh/xxx.pub(公钥,要贴到服务器)

第 2 步:把公钥装到服务器

如果还记得密码,直接:

ssh-copy-id -p 新端口号 用户名@公网IP

如果忘了密码(部分云镜像默认使用普通用户 + 默认密钥,root 密码不确定),就用云控制台的”免密登录(自动化助手方式)” 进去手动贴:

# 在免密终端里
sudo -i                              # 提权到 root
mkdir -p /root/.ssh
chmod 700 /root/.ssh
# 把你电脑上 cat ~/.ssh/xxx.pub 输出的那行,粘贴到下面
echo "公钥内容 你的备注" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

第 3 步:单独测试密钥登录(别关当前会话)

新开一个终端窗口:

ssh -p 新端口号 -i ~/.ssh/xxx 用户名@公网IP

能直接进去、不用输密码,才算成功。

第 4 步:关闭密码登录

确认第 3 步 100% 成功后,编辑 /etc/ssh/sshd_config:

PasswordAuthentication no

重启 sshd:

systemctl restart sshd

顺序绝对不能反:必须先确认密钥能连,再关密码。否则会把自己锁在门外。

第 5 步(可选但推荐):收紧来源 IP

把防火墙里 SSH 新端口和运维面板端口的来源从”全部 IPv4″改成你当前的固定公网 IP(你的IP/32)。如果是动态 IP,至少保证密钥/密码足够强,并考虑上 Fail2ban。


七、那些容易踩的坑

7.1 私钥丢了怎么办

私钥是你电脑上的文件,服务器不存它,丢了不可恢复,只能重新生成一对并重新贴公钥。只要还能进系统(密码或免密终端),就永远能救,不会死锁。三种情况:

场景 处理方式
还没配过密钥 现在就用密码或免密终端进去现配
配过但私钥丢了 用密码/免密终端进去重新生成,删掉旧公钥
已关密码登录且私钥丢了 用免密终端进去重新塞公钥;免密也进不去就只能控制台重置密码

7.2 忘了密码怎么办

两条路:

  • 用云控制台免密终端进去,执行 passwd root 自己设一个新密码;
  • 控制台重置密码,设完新密码后,网页终端的密码验证就能用了。

7.3 能不能直接停掉 SSH 服务

不建议。 停掉 sshd 后:

项目 状态
运维面板(装软件、建站、文件管理) ✅ 通常正常,面板自身就是高权限进程,不走 SSH
面板里的”终端” ❌ 打不开,它本质是 WebSSH,依赖本机 sshd
本地 SSH 客户端、控制台网页 SSH ❌ 全部连不上
云控制台免密登录 ⚠️ 通常能用,但前提是实例和配套 Agent 正常运行,不能保证

更严重的是:运维面板一旦登不进去(配置写错、升级异常、内存爆掉),SSH 是你唯一的自救通道;而且部分面板在服务器或自身重启时会把 SSH 重新拉起。所以停 SSH 既不可靠,也没必要。

正确做法是:SSH 留着,但只允许密钥登录、只允许自己的 IP 访问。

7.4 镜像默认用户可能是普通用户

部分云镜像创建时会默认绑定一个密钥,用户名是普通用户(具备 sudo 权限),网页终端会默认用这个账号。你可以:

  • 直接用该普通用户登录,管理命令前加 sudo;
  • 或者切换到 root 登录;
  • 免密终端里用 sudo -i 提权到 root。

八、理解你手里的几条”通道”

同一台服务器,有好几种操作方式,但底层并不相同:

渠道 背后机制 能否操作服务器 备注
本地 SSH 客户端 SSH ✅ 最常用,配好密钥后最安全
控制台网页终端(SSH 方式) SSH ✅ 默认端口 22,需手动改新端口
控制台免密登录(自动化助手方式) 云平台自动化助手,不经过 SSH ✅ 不验证系统密码、不依赖 SSH 端口,是兜底通道
运维面板 面板自身高权限进程 ✅ 装软件、建站、文件管理 面板里的”终端”仍依赖 sshd
面板内置终端 WebSSH → 本机 sshd ❌ sshd 停了就失效 —

一句话:面板和 SSH 共用同一套底层,面板是”方便的门”,SSH 是”底层的门”,免密登录是”云平台留的后门”。 面板把操作门槛降下来了,也把攻击面撑大了——面板一旦被攻破,攻击者往往直接拿到高权限。


九、最终状态与一句话总结

加固完成后,登录命令固定为:

ssh -p 新端口号 -i ~/.ssh/xxx 用户名@公网IP

特点:

  • 不输入密码,直接登录;
  • 没有私钥的设备,即使知道 IP、端口、用户名、密码也进不来;
  • 端口改成非默认、来源 IP 收紧、密码登录关闭,三道防线叠加。

要守的不是”少开几扇门”,而是”每扇门都上锁”:SSH 只用密钥、面板限源 IP 加强密码、云账号开两步验证;SSH 必须留着,它是面板挂掉时唯一的救命通道。


附:快速核对清单

  • SSH 端口改为高位新端口(sshd_config + 防火墙/安全组)
  • 本机生成 ed25519 密钥对
  • 公钥写入服务器 ~/.ssh/authorized_keys
  • 新窗口测试密钥登录成功
  • PasswordAuthentication no 并重启 sshd
  • 防火墙中 SSH 新端口、面板端口来源收窄为自身固定 IP
  • 运维面板改默认入口、设强密码
  • 云账号开启 MFA 两步验证
  • 私钥文件备份到安全位置,权限设为 600
作者:ZCNIX
本文链接:https://blog.zcnix.com/cloud-server-ssh-hardening-guide/
许可协议:CC BY-NC-SA 4.0
上一篇
下一篇