1. 为什么SSH密钥登录比密码更安全?

每次登录云服务器都要输入密码,不仅麻烦还容易被人盯上。想象一下密码就像你家门钥匙,如果被偷了或者被人猜到了,谁都能进你家。而SSH密钥登录相当于给门锁加了指纹识别系统——需要同时拥有你的指纹(私钥)和门锁的识别程序(公钥)才能开门。

我管理过上百台服务器,早期也用过密码登录,直到有次发现服务器被暴力破解攻击后才彻底转向密钥登录。实测下来密钥登录有三大优势:首先破解难度呈指数级上升(2048位的RSA密钥相当于600位的随机密码);其次完全避免中间人攻击;最重要的是可以彻底关闭密码登录,从根本上堵住漏洞。

2. 五分钟生成你的第一对SSH密钥

打开终端(Windows用户可以用Git Bash),我们先用最基础的RSA算法生成密钥对:

ssh-keygen -t rsa -b 4096 -C "你的邮箱或备注"

这里-t指定算法类型,-b确定密钥长度。我强烈建议用4096位而不是默认的2048位,现在量子计算机发展这么快,密钥长点更安心。执行后会让你选择保存路径,直接回车用默认的~/.ssh/id_rsa就行。

接下来要设置密钥密码(passphrase),这是个容易踩坑的地方。很多人直接回车跳过,但我建议一定要设置!这样即使私钥文件泄露,没有密码也白搭。就像保险箱有两道锁:钥匙+密码才最稳妥。

生成完成后,你的~/.ssh目录下会出现两个文件:

  • id_rsa:这就是要绝对保密的私钥,权限必须是600
  • id_rsa.pub:可以随便分发公钥,内容长得像ssh-rsa AAAAB3...

重要提示:千万不要把私钥发给任何人!我见过有开发者把私钥上传到GitHub的,结果服务器被挖矿程序攻占。

3. 服务器端的详细配置指南

现在把公钥部署到服务器上,这里有个效率技巧:直接用ssh-copy-id命令一键完成:

ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@服务器IP

如果没这个命令,也可以手动操作:

  1. 登录服务器后编辑~/.ssh/authorized_keys
  2. 把本地id_rsa.pub的内容粘贴进去
  3. 关键一步:改权限!chmod 600 ~/.ssh/authorized_keys

接着修改SSH服务配置,用vim打开/etc/ssh/sshd_config,确保这些参数:

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
ChallengeResponseAuthentication no

特别注意:改配置前一定要另开一个终端保持登录状态!我有次手滑改错配置直接把自己锁在服务器外面,最后只能去控制台重置。

4. 高级安全加固方案

基础配置完成后,可以进一步强化安全:

端口隐身术

  • 修改默认22端口:Port 54321
  • 配合防火墙规则:iptables -A INPUT -p tcp --dport 54321 -j ACCEPT

IP白名单

AllowUsers 用户名@你的IP
AllowGroups ssh-users

密钥轮换策略

  1. 生成新密钥对时用-f指定新文件名
  2. 新旧密钥同时在authorized_keys保留一周
  3. ssh -i指定密钥测试无误后再删除旧密钥

监控技巧

# 查看失败登录尝试
grep 'Failed password' /var/log/auth.log
# 实时监控登录情况
tail -f /var/log/secure

5. 各云平台的特殊设置

不同云服务商有些细节差异:

阿里云/腾讯云

  • 创建实例时可以直接上传公钥
  • 控制台能一键绑定/解绑密钥
  • 注意:部分镜像默认关闭密钥登录,需要手动开启

AWS EC2

  • 使用.pem格式的密钥对
  • 连接时需指定密钥路径:ssh -i key.pem ec2-user@ip

华为云

  • 支持批量绑定密钥到多台服务器
  • 提供密钥对托管服务(但我还是建议自己保管私钥)

6. 常见故障排查手册

**连不上怎么办?**按这个顺序检查:

  1. ssh -v查看详细报错
  2. 确认网络连通性:telnet 服务器IP 端口
  3. 检查服务状态:systemctl status sshd
  4. 查看日志:journalctl -u sshd -f

权限问题

  • 服务器端.ssh目录权限必须是700
  • authorized_keys权限必须是600
  • 私钥文件在本地的权限也必须是600

密钥被拒绝

  1. 先用密码登录检查authorized_keys内容
  2. 确认公钥格式完整(不能换行或空格)
  3. 尝试重新上传公钥

7. 密钥管理的最佳实践

经过多次踩坑后,我总结出这些经验:

  1. 不同服务器用不同密钥对(重要业务单独隔离)
  2. 使用密码管理器保管私钥密码
  3. 定期轮换密钥(建议每3-6个月)
  4. 离职员工要及时删除其公钥
  5. 备份!备份!备份!(但要用加密U盘存放)

对于团队协作,建议:

  • 搭建跳板机集中管理访问权限
  • 使用HashiCorp Vault等工具做密钥分发
  • 记录详细的密钥发放/回收日志

更多推荐