IT技术博客大学习 共学习 共进步

SSH免密码认证进阶使用

将之典藏 2011-09-19 23:29:02 浏览 3,544 次

大家都知道,SSH可以通过证书进行免密码认证(see)。不过长期以来,我对SSH证书认证都不太感冒,主要是安全方面的考虑:

当要管理多台服务器时,假定PC机是Local,分别有服务器:s1和s2。私钥放在Local,公钥分别放在两台服务器,那Local登录到两台服务器都可以不再需要密码认证。

但是从两台服务器之间呢?

由于两台服务器上都只有公钥,没有私钥,当从s1->s2,或者相反的时候,依然要输入密码认证。

除非你在s1和s2上都放私钥就可以解决这个问题,如果服务器数量再多的话,私钥管理起来就成问题,容易被窃取。

风险很大的说!有木有?有木有??(回答木有的那位:同学,你好,请点我

直到我最近研究到pageant。才知道:哇靠,原来把私钥放在Local,s1和s2之间的认证也是可以证书实现的。真正做到一个私钥通行所有服务器,私钥不外漏,安全有保障。

要这么做其实很简单,要启用SSH认证代理。Linux下运行ssh-agent,Windows下以putty为例:

  1. 先要下载pageant,运行并加载私钥;
  2. 再设置putty允许代理转发(Allow agent forwarding);

只需要这样,就解决了 s1->s2或s2->s1之间的认证问题,不再需要把私钥放上服务器。

但是,解决的还不够彻底,在这种情况下(所有服务器上都有公钥,从Local连入S1,再从S1使用SSH命令连扩S2,再从S2使用SSH命令连入S3):

这时候,即使S3服务器上有公钥,依然要输入密码进行验证。解法有二:

  1. 在S1连接S2的时候,SSH命令附加参数:-A
  2. 在S1服务器的.ssh目录增加SSH客户端配置文件(~/.ssh/config),配置“ForwardAgent yes ”,完整的配置:
    Host *
        ForwardAgent yes

采取的是第2种方法,将SSH配置文件(.ssh/config)和公钥(.ssh/authorized_keys),分发到所有的服务器上,形成完整的网络。只需要打开pageant,无论从哪台服务器登陆到另外一台都不需要输入密码了,连github的私钥也可以放在Local哦。我不得不说一句:真他妈的帅~啊!

另外,如果想要pageant运行时自动加载私钥,可以建一个指向pageant.exe的快捷方式,修改这个快捷方式的目标,将私钥路径附加在后面(via)。

-

Update:

2011.07.09 - SSH agent与GNU screen之间不太兼容,可参见《SSH Agent与GNU Screen的兼容问题

建议继续学习

  1. Linux shell脚本使用while循环执行ssh的注意事项 (阅读 8,064)
  2. 在ssh服务里使用chroot (阅读 5,842)
  3. 为什么要用公钥/私钥而不是密码去做SSH身份验证 (阅读 5,702)
  4. 如何让ssh登录更加安全 (阅读 5,604)
  5. ssh连接超时解决办法 (阅读 5,505)
  6. 懒人连ssh不输密码若干大法 (阅读 5,484)
  7. SSH无密码登录 (阅读 5,483)
  8. ssh命令 (阅读 5,226)
  9. 共享会话的ssh连接配置 (阅读 4,706)
  10. 一句话crontab实现防ssh暴力破解 (阅读 4,564)