从数万次暴力破解说起:一台云主机的 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(私钥) |
钥匙 | 留在你自己的电脑上 | ❌ 绝对不能 |
流程:
- 生成一对密钥(一把锁 + 一把钥匙);
- 把公钥(锁)装到服务器上;
- 登录时用自己的私钥(钥匙)去开,服务器验证匹配就放行;
- 攻击者手里没有你的私钥,即使知道 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