ssh-agent的目的是什么?


70

我已经阅读了官方定义:

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

手册“客户”到底是什么意思-什么客户?您不只是从终端运行ssh命令进行连接-还有哪些其他客户端,为什么他们不能像ssh命令那样仅使用指向ssh私有文件的路径?

Answers:


75

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

作为一种安全措施,大多数人都使用密码短语明智地保护其私钥,因此任何身份验证尝试都将要求您输入此密码短语。这可能是不希望的,因此ssh-agent会为您缓存密钥,并且当代理想要对其进行解密时,您只需要输入一次密码即可(而且通常不需要,因为ssh-agent可以与pam集成在一起,许多发行版都可以做到)。

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

SSH代理的另一个好处是可以通过SSH转发。因此,当您将SSH切换到主机A时,在转发代理程序时,您可以将A从SSH切换到另一个主机B,而无需在主机A上显示密钥(即使不是加密形式)。


10
我觉得这是最完整的答案,但是仍然有一点缺失。使用密钥代理还可以轻松使用多个密钥。使用密钥代理时,ssh不必尝试指定密钥的路径,而是会尝试其中的每个密钥。
Patrick

3
@Patrick也可能是它的缺点-在服务器上尝试太多无效密钥,它将在获得有效密钥之前关闭连接。当然,那是什么~/.ssh/configIdentityFile选择是好,使用或不使用代理
托比亚斯Kienzler

@帕特里克,没有经纪人似乎同样有可能
安德烈·费多罗夫

@AndreyFedorov是的,您可以在没有代理的情况下拥有多个密钥,但是您也可以在您的~/.ssh/config密钥中指定用于哪个远程主机,以便它确切知道它需要哪个密钥。
帕特里克

3
因此,ssh-agent如果私钥不受密码短语的保护,那么可以认为那是不必要的吗?
pkaramol

16

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


7

如果您经常ssh使用各种不同的计算机,每个计算机都有各自的密钥和密码,则运行ssh-agent允许您在会话开始时为每个密钥输入一次密钥密码1,然后可以对每台计算机进行多次身份验证根据您的喜好,而无需重新输入密码。

另一个好处是,按照man页面,代理程序永远不会在其请求通道上发送私钥。因此,如果您在不同的盒子之间跳来跳去,则私钥将受到保护。

1您可以设置life按键在座席中的保持时间。


6

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

对服务器的验证基于质询-响应身份验证。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

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

exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"

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

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;

稍微复杂一点,但总的来说,这就是要进行的工作ssh-agent

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

                     启动应用程序的ss

TL; DR

底线是ssh-agent存在的,因此,当需要ssh密钥时,您只需使用其口令短语一次解锁(假设它们具有一个)即可,然后从那时起,它们就可以以已解密的形式在内存(RAM)中使用。


1

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

摆脱ssh的私钥处理的另一个好处是ssh-agent可以被gpg-agent代替。因此,您可以将OpenPGP密钥(具有身份验证功能)用于SSH。对于智能卡上的OpenPGP密钥,这是一个不错的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.