ssh-代理转发介绍以及应用场景
本网站相关文章:
- 远程自动化工具
- ssh 基本安装和配置
- ssh 隧道转发功能以及应用
- ssh 代理转发介绍及应用场景
- ssh 代理中使用 https 以及二级代理的介绍
- ssh 数字证书生成以及 https 原理介绍
- ftp 安装,原理,配置
- ssh 远程执行命令和 bash 工作模式
Introduction
Intro
ssh 代理, 其是一个程序, 用于帮助管理私钥, ssh-agent 就是 SSH 自带的 ssh 代理程序.
目前拥有的 SSH Agent 有:
- ssh-agent: 自带代理, 可以作为其他 Agent 的后端, 运行时会 fork 自身, 并打印所需环境变量
- GnuPG: 在 KDE 桌面环境, 用于缓存私钥
- KeyChain: 用来方便的管理 SSH 密钥对程序, 尽最大努力减少对用户打扰, 其本身是一个 Shell 脚本, 驱动 ssh-agent/gpg-add 来工作
- Envoy: KeyChain 的替代品
- Pam_ssh: SSH 私钥插入式验证模块, 密码短语与系统登录用户密码相同的时候, 可以减去再次输入密码的麻烦
使用场景
- 用不同密钥连接不同主机时, 使用 ssh-agent 来进行认证
- 私钥设置密码之后, ssh-agent 可以让我们避免重复输入密码
- 实现转发功能, 在多个服务器之间工作, 避免在登陆的多台服务器之间配置密钥对
问题 1: 关于转发功能, 在何种场景?
1 | 在多个服务器之间工作, A, B, C, D 等, 你在本机持有上述所有服务器的密钥对, 此时出现一个新的需求: |
问题 2: 为何首次收入密码之后, 之后不无需再次输入?
类似 session 概念, agent 会一直在后台运行, 此时会保存首次输入的密钥.
Process
这里主要讲解一下ssh-agent
的原理, 其他原理见上面的参考中的说明.
使用ssh-agent
, 连接 remote1 时, 会进行key challenge
质询操作, 在 server1 上的 sshd 将质询信息返回给
PC 之后, 就会利用 ssh-agent 进行解析并返回.
- 步骤 0: 此时 remote1 连接 remote2, 此时 remote1 上的 sshd 会将质询验证信息(进程之间通信)发送给 PC 中的
ssh-agent
. - 步骤 1/2: ssh-agent 发送密钥信息以进行质询
- 步骤 3: 此时 remote1 上的作为一个
代理人
角色, 将密钥信息转发给 remote1 上的ssh client
- 步骤 4: remote1 上的
ssh client
发送上层代理发来的密钥进行 remote2 的验证 - 步骤 5: 过程完成, 成功
见如下图解:
Command
Start Env
获取代理的所有环境变量: ssh-agent
进入 ssh-agent 环境: ssh-agent bash
或者 ssh-agent $SHELL
或者 eval $(ssh-agent)
, 此时会发现系统多增加了一个 ssh-agent 进程
登录之后自动运行 ssh-agent, 则需要加入 bash 加载环境中: echo 'eval $(ssh-agent)' >> ~/.bash_profile
对于 eval, 需要提前关闭 ssh-agent 进程: ssh-agent -k
Add Key
在运行ssh-agent
之后, 则需要将私钥加入缓存中: ssh-add ~/.ssh/test
移除指定的私钥: ssh-add -d ~/.ssh/test
移除所有私钥: ssh-add -D
查看代理中的所有公钥: ssh-add -L
Lock Key
锁定 SSH 代理, 让 ssh-agent 暂停管理私钥:
- 锁定:
ssh-add -x
- 解锁:
ssh-add -X
Forward Key
开启 SSH Forwarding, 在 server 和本机之间建立一个 SSH 连接链, 服务器上收到的加密/解密请求都会传递会本机, 并使用 ssh-agent 进行处理, 最终返回信息. 注意, 在开启 forward 之后, 作为跳板机的服务器, 可以获取 ssh agent 的进程间通信信息.整个配置逻辑如图:
其中需要在跳板机/个人 PC 上进行如下配置, 增加转发支持. 编辑文件/etc/ssh/ssh_config
, 增加如下配置:
1 | Host * |
之后需要在跳板机上配置 ssh-agent, 之后就可以正常操作了, 具体见下面的例子说明.
Example
避免重复密钥
1 | # 运行 |
多服务器登录
关于 ssh-agent 的原理, 见上面的说明.
1 | # 首先启动ssh-agent |