手把手配置 SSH 密钥登录和安全加固
买了服务器后最担心的问题就是安全。密码登录虽然方便,但暴力破解脚本遍地都是,每天能看到几十次失败的登录尝试。于是 SSH 密钥登录就成了第一件要做的事。
为什么要用密钥
- 理论上无法被暴力破解(没有密码可以猜)
- 可以给不同的设备配不同的密钥,丢了可以单独吊销
- 配合 SSH agent 可以免密登录,方便自动化脚本
生成密钥对
在本地电脑上生成,不是在服务器上:
# 用 ed25519 算法(比 RSA 更安全、更快)
ssh-keygen -t ed25519 -C "my-server-2026"
# 如果想用 RSA(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "my-server-2026"
执行后会问你保存路径和密码短语(passphrase)。密码短语是密钥的二次保护,建议设一个。
上传公钥到服务器
# 方法一:ssh-copy-id(最简单)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@服务器IP
# 方法二:手动复制(如果没装 ssh-copy-id)
cat ~/.ssh/id_ed25519.pub
# 然后登录服务器,粘贴到 ~/.ssh/authorized_keys
禁用密码登录
确认密钥登录成功后,关闭密码登录:
sudo vim /etc/ssh/sshd_config
# 修改以下配置
PasswordAuthentication no
PermitRootLogin prohibit-password
PubkeyAuthentication yes
# 重启 SSH 服务
sudo systemctl restart sshd
其他安全加固
# 改 SSH 端口(减少日志噪音)
Port 2222
# 限制登录用户
AllowUsers myname
# 登录失败次数限制
MaxAuthTries 3
# 空闲超时断开
ClientAliveInterval 300
ClientAliveCountMax 0
管理多个密钥
当你有多台服务器时,~/.ssh/config 就很方便了:
Host my-server
HostName 123.123.123.123
User myname
Port 2222
IdentityFile ~/.ssh/id_ed25519_my_server
Host work-server
HostName 45.45.45.45
User admin
Port 22
IdentityFile ~/.ssh/id_ed25519_work
配置好后直接 ssh my-server 就能连,不用记 IP 和端口。
密钥丢了怎么办
如果你还有服务器控制台(VNC/IPMI)或者还有其他管理员用户,登录进去删掉旧公钥就行。如果没有,那就只能重装系统了——这也是为什么建议服务器上始终保留一个备用用户。
配置好密钥登录之后,每次 SSH 都安心多了。也算是在服务器安全上迈出了第一步。