学习过程中,我们大概会用到不超过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 都会产生新的进程。