SSH代理(ssh-agent)及SSH代理转发(agent-forwarding)功能介绍

结合下面拓扑图模拟演示并介绍SSH代理(ssh-agent)及SSH代理转发(agent-forwarding)功能

Server_A: 192.168.31.80

Server_B: 192.168.31.111/10.112.10.249 (双网卡)

Server_C: 10.112.10.250

从拓扑图上可以看出,由于Server_C与PC机IP网络层面上无法直接互通,若想SSH登录到Server_C,只能通过Server_B进行代理中转

需求如下:

1)PC机通过SecureCRT登录Server_A,要实现Server_A能SSH免密登录到Server_B,且不用输入passphrase密钥密码,这时需要Server_A通过ssh-keygen生成一对公钥与私钥,并将公钥拷贝到Server_B上

2)Server_A上SSH登录Server_C只能通过Server_B跳转,但是我又不想Server_B也通过ssh-keygen生成另外一对公钥与私钥(用于Server_B免密码登录登录Server_C),我想复用Server_A原先生成的那一对公钥与私钥,来实现免密码登录Server_C,这时需要将Server_A的公钥在Server_C上也保存一份

如何实现这两个需求呢?

第一个需求中会用到SSH代理(ssh-agent)功能

第二个需求实现需要用到SSH代理转发(agent-forwarding)功能


下面一步一步边动手边介绍相关基本概念

1、首先SecureCRT登录Server_A,ssh-keygen -t rsa并输入密钥密码passphrase

2、可以通过scp或者ssh-copy-id等方式拷贝公钥到Server_B

若要将Server_A的公钥也拷贝到Server_C,可进行如下操作

3、可以看到每次在Server_A上SSH登录Server_B时都会提示要求输入密钥密码

4、若不想每次都输入密钥密码,这时需要用到ssh-agent帮助我们保存密钥密码到内存

所谓ssh-agent是一个帮助程序,可以跟踪用户的身份密钥及其密码。然后,代理可以使用密钥登录其他服务器,而无需用户再次键入密码或密码。这实现了一种单点登录(SSO)形式,原文如下

The ssh-agent is a helper program that keeps track of user's identity keys and their passphrases. The agent can then use the keys to log into other servers without having the user type in a password or passphrase again. This implements a form of single sign-on (SSO).

下面介绍如何进行ssh-agent的操作

1)如果ssh-agent在登录时未自动启动,则可以使用该命令手动启动

eval `ssh-agent`

2)检查SSH_AUTH_SOCK环境变量的值。如果已设置,则ssh-agent代理可正在运行

3)SSH密钥添加到代理

默认情况下,代理使用存储在.ssh用户主目录下的目录中的SSH密钥

也可以指定私钥文件 ssh-add ./.ssh/id_rsa

然后输入之前设置的密钥密码passphrase,这时密钥密码就保存到内存中了

4)通过ssh-add -l命令将列出代理当前可访问的私钥

5、接下来直接登录Server_B就不需要输入passphrase密钥密码了


接下来需求2,就需要用到Agent-Forwarding(代理转发)

原理如下:Server_B相当于一个代理服务器,当Server_B SSH登录Server_C时,Server_C对Server_B提出认证要求,其实这时Server_B是将认证请求转发给了Server_A,Server_A使用本地ssh-agent代理处理请求后,处理结果交给Server_B这个代理,最终返回到Server_C上,这样实现转发传递的过程

具体操作可以两种方式实现

1、先ssh -A root@192.168.31.111

再ssh -A root@10.112.10.250

-A选项 启用agent-forwding

-A Enables forwarding of the authentication agent connection.

2、修改Server_A的/etc/ssh/ssh_config的方式

将 ForwardAgent no改为ForwardAgent yes

且Server_B的/etc/ssh/sshd_config 中AllowAgentForwarding 要为yes

一般默认为yes,不用修改(sshd_config与ssh_config是两个不同的文件,一个服务端配置文件,一个客户端配置文件)

接下来直接ssh 到Server_B,然后Server_B可以复用Server_A的密钥对直接免密登录Server_C

不用加-A参数

更进一步,可以直接使用-t参数

-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.

ssh -t 192.168.31.111 ssh 10.112.10.250

再进一步延伸,将代理转发用于scp,比如将Server_B上的文件直接scp远程拷贝到Server_C的某个目录,不用输入任何密码或密钥密码

scp root@192.168.31.111:~/mysql*.tar.gz root@10.112.10.250:/home

以上就是SSH代理(ssh-agent)及SSH代理转发(agent-forwarding)功能介绍与实践过程

原文发布于微信公众号 - WalkingCloud(WalkingCloud2018)

原文发表时间:2019-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券