「SSH」- SSH Agent

认识

SSH Agent 是一个用于管理 SSH 密钥的程序,它可以帮助用户更安全、更方便地使用 SSH 协议进行认证。

SSH Agent 属于客户端程序,它是 SSH 客户端工具链的一部分,主要用于管理用户的私钥并提供身份认证服务。

SSH Agent 的设计初衷是为本地用户提供便捷的密钥管理,所有操作均在客户端完成,因此属于客户端程序。服务端仅负责验证客户端提供的认证信息,不直接与 Agent 交互。

SSH Agent 是 SSH 工具链中提高安全性和便利性的重要组件,合理使用可以显著改善 SSH 认证体验。

组成

WIP

构造

—— 构造的目的是获得该事物。要么借助现有实现,要么从零开始构建。针对我们的场景,我们选择前者。

  • 大多数完整版 SSH 实现(如 OpenSSH)会提供原生 Agent。
  • 精简版或嵌入式实现(如 Dropbear)通常不包含此功能。
  • Windows/ 图形工具可能需要额外配置或使用替代方案。

常见实现

不是所有的 SSH 实现都默认提供 SSH Agent 程序,这取决于具体的实现和平台。以下是不同 SSH 实现对 SSH Agent 的支持情况:

  • OpenSSH (Linux/macOS) | 默认包含 ssh-agent,是使用最广泛的实现
  • LibreSSH | OpenSSH 的分支,兼容其功能
  • Dropbear SSH | 轻量级实现,不包含 Agent 功能(但可通过第三方工具如 dropbearkey 补充)
  • Bitvise SSH (Windows) | 商业实现,提供图形化的 Agent 管理
  • PuTTY (Windows) | 部分支持 | 提供 Pageant 作为替代 Agent(功能类似但不完全兼容 OpenSSH Agent)

特殊情况

嵌入式系统:

许多嵌入式设备的精简 SSH 实现(如 Dropbear)通常会移除 Agent 功能以节省资源。

Windows 原生支持:

Windows 10/11 的官方 OpenSSH 客户端(可选功能)包含 ssh-agent,但需要手动启用。

图形化工具:

一些 GUI SSH 工具(如 SecureCRT、MobaXterm)会内置自己的 Agent 实现,而非使用系统原生 Agent。

替代方案

如果某个 SSH 实现不提供原生 Agent,可通过以下方式弥补:

第三方 Agent:

Windows: Pageant(PuTTY 配套工具)

跨平台: gpg-agent(GnuPG 提供,可模拟 SSH Agent)

SSH 配置替代:

使用 IdentitiesOnly 配置直接指定密钥路径,但需每次输入密码。

性质

运行位置

SSH Agent 运行在用户本地机器(发起 SSH 连接的客户端),负责管理用户本地的私钥,与远程服务器无关。

核心功能

存储用户解密的私钥(仅在内存中)

在用户发起 SSH 连接时,自动响应客户端的认证请求

支持密钥转发(将认证能力安全传递给其他客户端)

与服务端的交互

SSH 服务端(sshd)完全不知道 Agent 的存在,它只接收来自 SSH 客户端的认证请求。客户端通过 Agent 获取私钥签名后,再将签名结果发送给服务端完成认证。

与服务端的关系

服务端角色:SSH 服务端(sshd)仅验证客户端提供的公钥签名,不参与密钥管理。

代理转发场景:

当用户通过 ssh -A 启用代理转发时,客户端的 Agent 会临时将签名能力传递给远程主机上的 SSH 客户端(用于跳板机场景),但 Agent 本身仍运行在原始客户端。

  1. 密钥管理:存储用户的私钥,避免每次使用都需要输入密码
  2. 身份验证:在 SSH 连接时自动提供正确的密钥
  3. 密钥缓存:将解密的私钥保存在内存中一段时间(直到代理关闭)

主要优点
单次解锁:只需在会话开始时输入一次密钥密码
密钥安全性:私钥始终保存在内存中,不会写入磁盘
转发支持:允许在可信环境中安全地转发认证能力

SSH Agent Forwarding

What is SSH Agent Forwarding and How Do You Use It? – CloudSavvy IT

通过 SSH Agent Forwarding 特性,在 Client-A 分发 Public-Key 到 Host-A、Host-B 后,当 Client-A 使用 Private-Key 登录到 Host-A 之后,此时 Client-A 能够从 Host-A 直接登录到 Host-B 主机,而无需在主机之间分发 Private-Key 信息。

这是因为 Host-A 连接 Host-B 主机时,Host-B 会询问 Host-A 的身份,而 Host-A 会将询问转发给 Client-A 的 SSH Agent 服务,由在 Client-A 的 SSH Agent 服务来响应 Host-B 的询问。

该笔记将记录:在 OpenSSH 中,如何配置使用 SSH Agent Forwarding 特性,以及相关问题的解决方案。

解决方案

在使用 SSH Agent Forwarding 特性前,需要在 Client-A 中进行以下检查:
1)SSH Agent 正在运行;
2)已经将 Private-Key 添加到 SSH Agent 中;
3)环境变量 SSH_AUTH_SOCK 正确定义,以确保 ssh(1) 能够连接到 SSH Agent 服务;

修改 Client-A 的 ~/.ssh/config 文件,添加如下配置:

Host *
  ForwardAgent yes

高级功能

  1. 代理转发:通过 `-A` 选项启用,允许远程服务器使用本地代理

“`bash

ssh -A user@remotehost

“`

  1. 时限设置:可以为添加的密钥设置过期时间

“`bash

ssh-add -t 3600 ~/.ssh/id_rsa # 密钥 1 小时后过期

“`

  1. 约束使用:限制密钥只能用于特定目的

“`bash

ssh-add -c ~/.ssh/id_rsa # 每次使用需要确认

“`

安全注意事项

– 只在可信机器上使用代理转发
– 会话结束后记得关闭代理(`ssh-agent -k`)
– 考虑使用 `-t` 选项为密钥设置合理的使用时限
– 在公共计算机上避免使用 SSH Agent

应用

启动 SSH Agent 服务

“`bash
eval “$(ssh-agent -s)”
“`

添加密钥

通过 ssh-add ~/.ssh/id_rsa 命令,来讲 SSH Private Key 添加到 SSH Agent 中。

Q:每次电脑重启之后,如果要连接多台服务器,我们需要手动执行 ssh-add 命令来添加密钥。我们希望能够实现 SSH Private Key 自动添加,而非手动添加。
R:https://superuser.com/questions/1595123/how-do-i-use-keepassxc-as-an-ssh-agent
A:现(03/26/2025)我们能够找打的解决方案有:

  • .bashrc 中,添加 ssh-add 命令,来实现自动添加;
  • 针对桌面环境,使用 keepassxc 来管理密钥,其与 ssh-agent 集成,能够实现 SSH Private Key 自动添加;

列出已加载密钥

“`bash
ssh-add -l
“`

删除所有密钥

“`bash
ssh-add -D
“`

参考

DeepSeek / 介绍 SSH Agent
DeepSeek / SSH Agent 属于客户端程序还是服务端程序?
DeepSeek / 所有的 SSH 实现都提供 SSH Agent 程序吗?