目标系统只能使用指定用户的公钥身份验证登录。密码已禁用。我们将 ssh-agent 转发与 libpam_ssh_agent_auth 结合使用,以允许某些转发密钥在目标系统上获得 sudo 权限。
但是,有时正在运行的进程可能会填满整个磁盘,导致没有空间放置 SSH 代理的套接字(通常位于 $TMPDIR)。这样,我就无法在我的机器上获得 sudo 权限,而没有 sudo 权限,我也无法释放任何磁盘空间。
我曾尝试在 ramdisk 中手动启动 ssh-agent(eval $(ssh-agent -a "/dev/shm/socketname")
),然后添加密钥(ssh-add -k
),但它只添加目标系统上可用的密钥,而不是从客户端转发的密钥。
问题:
- 登录后,我可以将转发的密钥添加到 ssh-agent 吗?或者
- 我可以告诉 SSH 在登录时启动 ramdisk 中目标系统的 ssh-agent 吗?
代理转发不会启动任何“目标系统的 ssh 代理”。它会在远程端创建一个监听的 Unix 域套接字,并将传入的连接中继到本地代理监听的本地套接字。
您无需使用
ssh -A
来让远程进程访问您的本地代理。ssh -A
您可以“手动”执行更多操作,因此例如您可以选择在 中创建远程套接字/dev/shm/
。本地名为的环境变量
SSH_AUTH_SOCK
存储了正确的本地套接字的路径。让我们创建一个连接到本地套接字的远程套接字。ssh -R
可以转发流套接字,就像它可以转发 TCP 端口一样。在我的测试中
sshd
,确定为OpenSSH_9.2
给出了/dev/shm/foo
正确的模式:600
。我希望它能够安全地完成(即,当模式为左右时没有时间窗口666
),但如果您想要安全起见,那么:mktemp -d -p /dev/shm
在服务器上),然后要求 SSH 服务器在那里创建一个套接字;$XDG_RUNTIME_DIR
)。接下来,您需要告诉未来的远程进程(包括
sudo
)正确的套接字在哪里:就这样。从现在开始,从此 shell 启动的进程将继承
SSH_AUTH_SOCK
,最终将它们引导到您的本地代理。这就像您使用了ssh -A
,但远程套接字是您想要的位置。注意,断开连接后
ssh -R
,旧套接字将保留。然后,您可能希望再次对远程套接字使用相同的路径。现在的问题是,如果远程/dev/shm/foo
已经存在,则必须先将其删除,然后我们ssh -R
才能工作。存在一个自动解决方案,它要求StreamLocalBindUnlink
在yes
服务器上(在sshd_config
)。如果您无法以这种方式配置 SSH 服务器,则ssh user@server 'rm /dev/shm/foo'
首先应在本地,在之前ssh -R
。StreamLocalBindUnlink
也存在一个选项,ssh
但我认为它适用于ssh
在客户端创建的套接字(我们在这里不使用此类套接字);有人说这是一个错误。