ssh-agent 的目的是什么?

age*_*ith 95 ssh openssh sshd

我已经阅读了官方定义:

ssh-agent一个保存用于公钥认证(RSA、DSA、ECDSA)的私钥的程序。这个想法是 ssh-agent 在 X 会话或登录会话的开始时启动,所有其他窗口或程序都作为 ssh-agent 程序的客户端启动。通过使用环境变量,可以定位代理并在使用 ssh(1) 登录其他机器时自动用于身份验证。

“一个保存私钥的程序” - 恕我直言,ssh 密钥由用户使用ssh-keygen命令生成并简单地存储在~/.ssh- 为什么我需要一些守护程序来保存这些密钥?它究竟是如何容纳它们的?- 它们不只是存储在.ssh吗?

“作为 ssh-agent 程序的客户端启动” - 我不明白。哪里需要那个?我通常只使用 ssh 如下:

 ssh -i ~/.ssh/private_key_name username@hostname
Run Code Online (Sandbox Code Playgroud)

上述定义中的“客户”究竟是什么意思?什么客户?难道你不只是ssh从终端运行命令来连接到另一台机器吗?还有哪些其他客户端,为什么他们不能像ssh命令一样使用该私钥文件的标准路径?

Den*_*ker 96

SSH 代理会为您处理身份验证数据的签名。在对服务器进行身份验证时,您需要使用您的私钥对一些数据进行签名,以证明您就是您。

作为一种安全措施,大多数人明智地使用密码保护他们的私钥,因此任何身份验证尝试都需要您输入此密码。这可能是不可取的,因此 ssh-agent 会为您缓存密钥,而您只需要输入一次密码,当代理想要解密时(通常甚至不是这样,因为 ssh-agent 可以与 pam 集成,许多发行版都这样做)。

SSH 代理从不将这些密钥交给客户端程序,而只是提供一个套接字,客户端可以通过该套接字向其发送数据并通过该套接字以签名数据进行响应。这样做的一个附带好处是,即使您不完全信任程序,您也可以使用您的私钥。

SSH 代理的另一个好处是它可以通过 SSH 转发。因此,当您 ssh 到主机 A 时,在转发代理时,您可以从 A ssh 到另一台主机 B,而无需在主机 A 上提供您的密钥(甚至不是加密形式)。

  • 我觉得这是最完整的答案,但仍然缺少一点。使用密钥代理还可以轻松使用多个密钥。不必指定密钥的路径,当使用密钥代理时,ssh 将尝试其中的每个密钥。 (12认同)
  • 因此,如果私钥不受密码保护,那么可以假设不需要`ssh-agent`? (5认同)
  • @Patrick 这也可能是它的缺点 - 在服务器上尝试太多无效密钥,它会在您获得有效密钥之前关闭连接。当然,这就是 `~/.ssh/config` 的 `IdentityFile` 选项的好处,无论有没有代理 (4认同)

jor*_*anm 20

这样做的好处ssh-agent是您只需输入一次密码。如果您的私有 RSA 密钥未使用密码加密,则不需要 ssh-agent。该ssh命令将是客户端的一个示例。


slm*_*slm 10

维基百科文章可能有最好的描述:

对服务器的验证基于质询-响应身份验证。ssh 使用用户名和密钥请求连接到服务器。ssh 守护进程获取请求并根据存储在身份验证文件中的公钥发回一个质询。ssh 使用私钥构造密钥响应,并将其发送到连接另一端的等待 sshd。它不发送私钥本身。ssh 守护进程验证密钥响应,如果有效,则授予对系统的访问权限。ssh-agent 通过创建一个侦听 SSH 连接的套接字来简化此操作。用户只需启动 ssh-agent,告诉它如何找到他们的密钥(如果它们不在默认位置),一次性输入要使用的每个密钥的密码,

再次逐字逐句来自维基百科文章:

... ssh-agent 创建一个套接字,然后检查来自 ssh 的连接。能够连接到此套接字的每个人也都可以访问 ssh-agent。权限的设置与通常的 Linux 或 Unix 系统一样。当代理启动时,它会在 /tmp 中创建一个具有限制性权限的新目录。插座位于文件夹中。

它通常放在系统或用户的 rc 文件中,例如$HOME/.bashrc$HOME/.profile(对于 bash shell),以便环境变量ssh-agent集完全合并到您的环境中。

在我的 Fedora 14 系统上,它很早就作为 X11 子系统的一部分启动了。在这个文件中/etc/X11/xinit/xinitrc-common

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi
Run Code Online (Sandbox Code Playgroud)

$SSH_AGENT然后在其他 X11 启动脚本中使用该变量,例如此处/etc/X11/xinit/Xclients

exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"
Run Code Online (Sandbox Code Playgroud)

通过将其合并到此处,以下环境变量将被设置为父 shell 的一部分,因此所有分叉的孩子也应该拥有它们,例如:

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;
Run Code Online (Sandbox Code Playgroud)

这有点复杂,但简而言之,这基本上就是ssh-agent.

例如在 GNOME 中,ssh-agent实际上是将每个用户作为启动应用程序启动:

                     启动应用程序的 ss

TL; 博士

底线,ssh-agent存在这样当你需要你的 ssh 密钥时,你只需要用他们的密码解锁一次(假设他们有一个),从那时起它们就可以在内存(RAM)中以解密的形式使用。


jas*_*yan 9

如果您经常ssh进入各种不同的机器,每台机器都有自己的密钥和密码,那么运行ssh-agent允许您在会话开始时为每个密钥输入一次密码1,然后您可以多次对每台机器进行身份验证无需重新输入密码即可随心所欲。

另一个好处是,根据man页面,代理从不通过其请求通道发送私钥;所以如果你在不同的盒子之间跳来跳去,你的私钥是受到保护的。

1您可以设置life密钥在代理中的保留时间。


Hau*_*ing 5

“作为 ssh-agent 程序的客户端启动”是指 ssh-agent 在(本地)登录会话初始化期间启动,以便所有程序获取连接代理所需的$SSH_AGENT_PID环境变量。$SSH_AUTH_SOCK

将私钥处理从 ssh 中剔除的另一个优点是 ssh-agent 可以替换为 gpg-agent。因此,您可以使用 OpenPGP 密钥(具有身份验证功能)进行 SSH。对于智能卡上的 OpenPGP 密钥来说,这是一个很好的解决方案。