西二旗互联网产品实习生 |AI应用工程师 |摇滚乐爱好者 |开源社区/极客圈狂热爱好者
无意间发现服务器被攻击,便让张小蒜处理,战后,他写了一篇荣誉记录:
记一战:从裸奔到铁桶
公元某日,姜问:"服务器可有恙?"
少顷,查三军。不看不知道,一看——
三个 IP 正轮番怼 SSH,日志里密密麻麻的 Failed password。Nginx 那边也不安生,有人在捅 /.env,有人在发 PROPFIND,有人在翻 /RDWeb。 经典互联网扫街套餐,全齐了。
再查 fail2ban。
没装。
从上线第一天就在裸奔,全靠密码本身的血条在扛。
蒜二话不说,先堵为敬。
装 fail2ban,起三个 jail:
- SSH 爆破 → 5 次封 24 小时
- 路径扫描 → 10 次封 1 小时
- 认证爆破 → 5 次封 24 小时
手动补刀,所有已识别攻击 IP 全部塞进黑名单。
但蒜觉得没完。
翻 SSH 配置,差点没坐住:
PasswordAuthentication yes
PubkeyAuthentication no
密码开着,密钥关着。root 还能直接登录。
这等于把指纹锁拆了换了一把挂锁,还在门牌上写"管理员在此"。攻击者只要蒙对一次密码,整个服务器就是别人的了。
更要命的是——你配了也是白配。系统用的是 systemd socket 激活,端口监听被 ssh.socket 接管,你在 sshd_config 里写 Port 2222,人家根本不看。
蒜开始翻盘。
生成 Ed25519 密钥对。关掉 socket 激活,让 sshd 自己管端口。公钥写入 authorized_keys。私钥走临时链接,随机 token 做挡板,下载即焚 。
开密钥认证。用户验证通过。
一刀切断密码登录。
从头到尾,没让用户被锁在外面哪怕一秒钟。
攻击者的脚本现在大概还在跑:
"root/123456……root/admin……root/12345678……"但它永远不会等到"密码错误"的回复。
服务器只会说一句话:
"我不认识什么是密码。亮出你的私钥来。"
蒜,记一等功。 🧄🏆