本网站相关文章:

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
2
3
4
5
在多个服务器之间工作, A, B, C, D 等, 你在本机持有上述所有服务器的密钥对, 此时出现一个新的需求:
你登录 A, 欲直接从 A 登录到 B, 但是此时A 和 B 之间没有密钥对

使用key对 Github push/pull代码, 使用key登录服务器 S1, 那么此时出现需求:
希望在 S1上更新代码, 但是又不能将你自己的密钥对全部拷贝到S1上(太不安全, 之前就是这样做的)

问题 2: 为何首次收入密码之后, 之后不无需再次输入?

类似 session 概念, agent 会一直在后台运行, 此时会保存首次输入的密钥.

Process

参考: ssh-agent-forward

这里主要讲解一下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: 过程完成, 成功

见如下图解:

ssh-agent-forward-image

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 的进程间通信信息.整个配置逻辑如图: ssh-agent-configure

其中需要在跳板机/个人 PC 上进行如下配置, 增加转发支持. 编辑文件/etc/ssh/ssh_config, 增加如下配置:

1
2
3
Host *
ForwardAgent yes
ForwardX11 yes

之后需要在跳板机上配置 ssh-agent, 之后就可以正常操作了, 具体见下面的例子说明.

Example

避免重复密钥

1
2
3
4
5
6
7
8
# 运行
ssh-agent bash
# 添加
ssh-add ~/.ssh/test
# 连接, 并输入test密钥对的密码
ssh -i ~/.ssh/test root@192.168.9.1
# 重复连接已经无需再次输入密码
ssh -i ~/.ssh/test root@192.168.9.1

多服务器登录

关于 ssh-agent 的原理, 见上面的说明.

1
2
3
4
5
6
# 首先启动ssh-agent
ssh-agent bash
# 之后登录服务器1
mygo feng 2
# 在服务器host2上就可以直接使用ssh连接其他服务器, 而不需要使用密钥
ssh ubuntu@host1

参考:

ssh-agent