跳到正文
SSH 加固:把钥匙留在自己手里
SSH 加固:把钥匙留在自己手里

SSH 加固:把钥匙留在自己手里

VPS 一接公网,几分钟内就有人来试密码。这篇不讲 SSH 大全,讲我为什么选 ed25519、为什么改端口值得,以及「改配置别关当前会话」的退路纪律。

速读#

VPS 一接公网就会被扫,SSH 加固的主防御是密钥登录、禁密码、禁 root 密码登录。改端口有价值,但它是降噪,不是主防御;私钥永远留本地,改配置时也必须保留当前会话当退路。

接上公网几分钟就有人在试密码#

不是吓唬,看一眼 /var/log/auth.log 就明白。密码在公网上等于没穿衣服:依赖「别人猜不到」,而别人有 7×24 的脚本在猜。

密钥:不靠猜不到,靠解不开#

密码靠保守秘密:强度够不够、有没有在别处泄露过、会不会图省事复用,每一环都系在人身上。密钥靠数学:私钥不出门,公钥被拿走也推不出私钥,登录验证靠签名完成——网络上传输的东西里没有可以截下来重放的秘密。持续扫描磨得穿人性的弱点,磨不动数学。

Terminal window
ssh-keygen -t ed25519 -C "s1oopx@laptop" # 本地生成密钥对
ssh-copy-id root@你的服务器IP # 把公钥装到服务器

私钥永远留本地;公钥才放服务器。 能放出去的是锁,不能放出去的是钥匙。和 Tunnel token 进 .env、CI 密钥走 secrets 同一条线:凡是「拿到就等于我」的东西,只在我手里存在。

为什么 ed25519 不是 RSA#

RSAed25519
同等强度密钥更长、更慢更短、更快
我的选择能用新场景默认它

同等安全强度下,ed25519 的密钥短到一行放得下,签名和验证都更快,也没有 RSA 那种「长度选 2048 还是 4096」的参数纠结——默认参数就是最佳实践,想选错都难。

不是 RSA 错了,是 ed25519 在新场景下更对路。老系统兼容才是 RSA 还留着的理由——我没有这个包袱,就没必要背。

改端口:降噪,不是主防御#

Port 22222

有人说「安全的错觉,扫端口照样扫得到」。我的判断:它防的不是定向攻击,是自动化批量扫描。 绝大多数脚本只扫 22,改了就把这部分噪音滤掉。

措施性质
密钥登录主防御
禁密码 / 禁 root 密码登录主防御
改默认端口降噪,非主防御
防火墙只放行需要的端口主防御

把「降噪」和「防御」分开记,就不会对改端口抱不切实际的期待,也不会因为它挡不住定向攻击就否定降噪价值。

降噪的实际收益是日志质量:22 端口一天几千条失败尝试,翻日志全是垃圾;改了端口之后,auth.log 里再出现的失败尝试才值得看一眼。

改了端口,每次 ssh -p 22222 也烦。写进本地 ~/.ssh/config,以后一个 ssh vps 搞定:

Host vps
HostName 你的服务器IP
Port 22222
User s1oopx
IdentityFile ~/.ssh/id_ed25519

退路纪律:别关当前会话#

以上改动都落在 /etc/ssh/sshd_config

PermitRootLogin prohibit-password
PasswordAuthentication no
Port 22222
Terminal window
sshd -t # 先验配置语法,有错这里就拦住
systemctl restart ssh

改 SSH 配置时,务必保留当前已登录会话,再开新窗口测能否登录。 万一密钥没生效就关了密码,还有退路改回来。sshd -t 是同一条纪律的前半段:语法错误在重启前暴露,而不是重启后把自己锁外面才发现。就算两头都断了,VPS 控制台的 VNC 还在——买机器时看重控制台能力,真到这一步它就是最后那道退路。

半破坏性操作:先验证 → 留退路 → 新窗测试 → 确认通了再关旧会话。和防火墙启用前先放行 SSH 端口同源。

和 Tunnel 一正一反#

Cloudflare Tunnel 能把 Web 入站归零,这篇守的是剩下那道 SSH 缝。Web 与管理通道分开管——SSH 我没塞进 Tunnel,混在一起之后哪层出问题都难排:Web 挂了怀疑隧道,隧道挂了连管理入口一起丢。管理通道要的是依赖尽量少、故障模式尽量简单

做完这些再看 journalctl -u ssh 里被拒的密码尝试,会觉得庆幸——扫描是 7×24 不停的。

版权许可

CC BY-NC-SA 4.0 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

相关文章

s1oopX

登录 s1oopX