我一直以为"密码够复杂就安全"。直到我打开服务器的登录日志。
先看看日志里有什么
lastb | head -20 # 失败登录记录
sudo grep "Failed password" /var/log/auth.log | wc -l # 统计次数
输出让我有点意外:短短几天,几万次失败登录尝试,来自世界各地的 IP。它们用字典一个个试 root、admin、test 这些用户名和弱密码。
公网上的 22 端口,24 小时都有人敲门。这不是针对你,是自动化的机器人。
为什么密钥比密码安全
| 密码登录 | 密钥登录 | |
|---|---|---|
| 能被猜吗 | 可以(字典、撞库) | 几乎不可能(2048 位以上) |
| 会在网络传吗 | 会(就算加密也怕中间人) | 不传,只做签名验证 |
| 能复用吗 | 经常复用(一漏全漏) | 每台机器一把,互不影响 |
| 能自动化吗 | 要写死密码,很危险 | 天然支持免密脚本 |
生成密钥
ssh-keygen -t ed25519 -C "备注标签"
-t ed25519:现在推荐的类型,比 RSA 更短更安全-C:备注,纯粹方便你认出这把钥匙干什么用
它会生成两个文件:
| 文件 | 是什么 | 放哪 |
|---|---|---|
id_ed25519 | 私钥(钥匙) | 只留在自己电脑,绝不外传 |
id_ed25519.pub | 公钥(锁) | 装到服务器上,可以公开 |
把公钥装到服务器
# 本地执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@服务器IP
# 手动方式(ssh-copy-id 不可用时)
cat ~/.ssh/id_ed25519.pub | ssh user@服务器IP \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
验证!这一步不能跳
ssh -i ~/.ssh/id_ed25519 -o PasswordAuthentication=no user@服务器IP
为什么要加
它强制这次连接只能用密钥。如果还能进去,说明密钥真的生效了,而不是偷偷用了密码。
PasswordAuthentication=no?它强制这次连接只能用密钥。如果还能进去,说明密钥真的生效了,而不是偷偷用了密码。
确认无误后,关闭密码登录
sudo vim /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin prohibit-password
PubkeyAuthentication yes
sudo sshd -t && sudo systemctl reload ssh
顺序很重要:必须先装好公钥、验证能进,再关密码登录。
反了的话,你就被关在门外了——只能去云厂商控制台救。
反了的话,你就被关在门外了——只能去云厂商控制台救。
总结
- 公网 22 端口一直有人爆破,别抱侥幸
- 密钥登录:私钥不出门,公钥随便给
- 改配置前想清楚顺序:先开门,再拆墙
- 验证一定要用
PasswordAuthentication=no强制走密钥
安全不是"加个复杂密码",而是把攻击面变小。关掉密码登录之后,爆破机器人连试的机会都没有了。