SSH-Agent实现多台机器登陆

学习过程中,我们大概会用到不超过10台的机器,互相复制公钥到对方机器上的authorized_keys文件中即可,这样就实现了免秘钥登陆。

但在生产环境下,可能有成百上千台机器,这种情况下去互相复制公钥显然不太现实。不过我们可以使用 ssh-agent 来实现多台机器的ssh登陆。


ssh-agent

ssh-agent (ssh代理)是一种控制用来保存公钥身份验证所使用的私钥的程序。

ssh-agent 是一个密钥管理器,运行ssh-agent以后,使用 ssh-add 将私钥交给ssh-agent保管,其他程序需要身份验证的时候可以将验证申请交给ssh-agent来完成整个认证过程。

首先,如果想要使用 ssh-agent ,我们需要先启动它:

两种启动方式都可以

ssh-agent $SHELL        #centos中,默认shell通常为shell

eval `ssh-agent`

而且也不需要另外安装软件,系统默认就有该命令:

[root@server1 ~]# ls /usr/bin/ssh-add 
/usr/bin/ssh-add

[root@server1 ~]# ls /usr/bin/ssh-agent 
/usr/bin/ssh-agent


ssh-add

ssh-agent 是管理多个ssh key的代理,受管理的私钥通过 ssh-add 来添加,目的是对解密的私钥进行高速缓存。

参数:

-D:删除ssh-agent中的所有密钥

-d:从ssh-agent中的删除密钥

-e pkcs11:删除PKCS#11共享库pkcs1提供的钥匙

-s pkcs11:添加PKCS#11共享库pkcs1提供的钥匙

-L:显示ssh-agent中的公钥

-l:显示ssh-agent中的密钥

-t life:对加载的密钥设置超时时间,超时ssh-agent将自动卸载密钥

-X:对ssh-agent进行解锁
 
-x:对ssh-agent进行加锁

  • 把专有密钥添加到 ssh-agent 中
ssh-add ~./ssh/id_dsa

  • 从 ssh-agent 中删除密钥
ssh-add -d ./ssh/id_xxx.pub

  • 查看 ssh-agent 中的密钥
ssh-add -l


举例

现在有server1、server2、server3三台机器,其中server1已经可以免秘钥登陆server2和server3,但server2和server3之间无法通过ssh登陆。

[root@server1 ~]# ssh server2
Last login: Mon Nov 26 09:36:44 2018 from server1

[root@server1 ~]# ssh server3
Last login: Mon Nov 26 09:37:25 2018 from server1

[root@server2 ~]# ssh server3
root@server3's password:            #提示密码登陆


[root@server3 ~]# ssh server2
root@server2's password:            #提示密码登陆

  • 编辑配置文件:
[root@server1 ~]# vim /etc/ssh/sshd_config         #做下面更改
AllowAgentForwarding yes

  • 启动 ssh-agent 服务:
[root@server2 ~]# ssh-agent bash

[root@server1 ~]# ps aux |grep ssh-agent
root     24338  0.0  0.0  51416   580 ?        Ss   02:43   0:00 ssh-agent
root     24388  0.0  0.0  51416  1032 ?        Ss   02:44   0:00 ssh-agent bash

  • 添加私钥:
[root@server1 ~]# ssh-add ~/.ssh/id_rsa
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

  • 测试登陆:
[root@server1 ~]# ssh -A server2          #这里 -A 不可省略,表示开启认证代理连接转发功能
Last login: Mon Nov 26 09:36:58 2018 from server1

[root@server2 ~]# ssh  server3            #后面这里 -A可以省略
Last login: Mon Nov 26 09:37:28 2018 from server1

[root@server3 ~]# logout 
Connection to server3 closed.

[root@server2 ~]# logout 
Connection to server2 closed.

这样,通过 ssh-agent 就可以实现一台机器上直接登录多台机器,而不需要繁琐的输入密码及配置密钥的操作。

实际上,我们还需要一个脚本来实现 ssh-agent 的自动启动

[root@server1 ~]#cat /etc/profile.d/ssh-agent.sh

#!/bin/sh

if [ -f ~/.agent.env ]; then

. ~/.agent.env >/dev/null

 if ! kill -0 $SSH_AGENT_PID >/dev/null 2>&1; then

  echo "Stale agent file found. Generating new agent..."

   eval `ssh-agent |tee ~/.agent.env`

  ssh-add

 fi

else

 echo "Starting ssh-agent..."

 eval `ssh-agent |tee ~/.agent.env`

 ssh-add

fi

这样就不会生成太多的 ssh-agent 程序了,以免每次打开 ssh-agent 都会产生新的进程。

上一篇:阶段学习总结-坦克大战(2D)案例


下一篇:多台服务器-SSH免密登录设置