ssh-agent:它是如何工作的?

ssh-agent:它是如何工作的?

我想尝试ssh-agent无需密码登录(我已经知道gssapi和pubkey方法,但我想学习这个)。在客户端和服务器上,我在 ssh_config (客户端)和 sshd_config (服务器)上启用了 AgentForward

在客户端上,我启动 ssh-agent

eval `ssh-agent`

我添加我的 rsa 密钥

ssh-add

ssh-add -l 确认它有效

ssh-add -l
4096 SHA256:******** mysuser@mylocalhost (RSA)

然后我登录并询问密码

ssh remotehost

远程主机上的 ssh-add -l 确认其有效

ssh-add -l
4096 SHA256:******** mysuser@mylocalhost (RSA)

现在我打开另一个 shell,ssh 到远程主机并......再次询问密码。如果我现在注销并登录..再次询问密码。怎么了?

我还尝试创建一个新的 rsa 密钥,添加密码,使用 ssh-add 添加..并且仍然询问密码。

答案1

如果您ssh-agent在终端窗口中手动启动,则代理功能将在该窗口中可用,并且仅从该窗口启动进程。要使代理在 GUI 会话的所有终端窗口中可用,您需要将代理作为 GUI 会话设置的一部分启动。

您的发行版可能已经或可能没有一些允许此操作的工具:可选的 PAM 模块可以执行此操作,或者 Debian 和相关发行版可以通过(请参阅 参考资料获取更多信息)pam_ssh.so为 X11 会话启用 SSH 代理。其他发行版可能有其他解决方案。/etc/X11/Xsession.optionsman 5 Xsession.options

从技术上讲,当 SSH 代理启动时,它会创建一个 Unix 套接字,允许 SSH 客户端与代理进行通信,并且环境变量SSH_AUTH_SOCK用于标识其位置。当您使用代理转发时,sshd远程主机将为转发的代理连接创建类似的套接字和环境变量。

如果您在一个本地终端窗口中启动代理,然后将此环境变量复制到也运行本地 shell 的另一个终端,那么您应该能够在两个终端中使用手动启动的代理。但通常最好找到一个解决方案来启动代理作为 GUI 会话设置的一部分,这样SSH_AUTH_SOCK环境变量就已经设置好了,并且会被该会话中启动的所有终端自动继承。

请注意,如果远程主机的管理员认为有必要,他们可以禁止 SSH 代理转发。

答案2

找到解决方案。

在我认为(错误)ssh-agent“缓存”密码之前,

a) 你启动代理

b) 进入远程主机

c) 密码进入神秘的“缓存”

d) 您可以再次输入远程主机,并且不会询问密码,因为密码已被缓存!完全错误的。

使用ssh有两种免密码进入方式

  1. 使用 kerberos 或 AD(使用 kerberos)的单点登录

  2. 公钥

ssh-agent 只能“转发”私钥,例如:

我启动 ssh-agent

eval `ssh-agent`
Agent pid 26541

我添加了密钥(我使用默认密钥,但您可以指定使用 ssh-keygen 命令创建的另一个密钥,带或不带密码)。

ssh-add

为了把事情说得最清楚

local = my local machine
server1 = first remote server
server2 = second remote server

我在 server1 上远程登录,现在因为 ssh-agent 已“转发”,即使 server1 没有 pubkey(位于本地),我也可以在 server2 上无需输入密码即可从 server1 登录。在 server2 上,我在 .ssh/authorized_keys 上拥有密钥(公共)

ssh -A server1 #ask password
ssh server2 #don't ask password, from server1

如果 ssh-agent 未启用

ssh -A server1 #ask password
ssh server2 #ask password.

gif 解释得更好,用户“pino”从远程主机“fedora”到远程主机“debian”无需密码输入(要无密码输入,您必须将 slack64 的 pubkey 复制到主机 debian 上的 $HOME/.ssh/authorized_keys 文件中在这个例子中),但是当它杀死ssh-agent并重试输入失败时(如果你提醒密码你当然可以输入)。

在此输入图像描述

相关内容