这是我长期以来一直遇到的问题,但每次我试图弄清楚一些事情时,我都会迷失方向,所以我想我最好在这里询问,也许更有经验的人可以帮助我。
背景
我的 Raspberry Pi 运行的是 Raspbian Jessie,我经常使用 SSH 登录并远程执行命令。在我的第一次 SSH 会话期间,我注意到ssh-agent
生成了一个进程在树莓派上每次我登录时,但从未在exit
ing: 登录和退出时被杀死,导致生成一堆ssh-agent
进程,只是挂在那里什么都不做。四处摆弄并阅读手册页和答案,我最近了解了 的目的ssh-agent
,而且我还了解到它通常应该在注销时被杀死,所以我开始问自己为什么不这样。此外,我注意到发出会导致产生source ~/.bashrc
另一个实例。ssh-agent
我继续读下去相关手册页SSH_AGENT_PID
应该定义环境变量,因为ssh-agent
程序应该在 an 内启动eval
以执行其输出并定义此类变量,然后由其他 SSH 相关命令使用,包括ssh-agent -k
(杀死相对于当前会话的代理),所以我跑echo $SSH_AGENT_PID
和echo $SSH_AUTH_SOCK
,但它们都是空的。我突然意识到:可能该进程不会在注销时被杀死,因为ssh-agent -k
它试图从未设置的环境变量中读取其PID。
问题
由于ssh-agent
注销时不会被杀死,并且由于未设置所需的环境变量而肯定会发生这种情况,因此它只能意味着一件事:调用登录的人ssh-agent
可能没有以正确的方式执行此操作(这将是eval "$(ssh-agent -s)"
)。所以我想:好吧,问题出在哪里?我将找到执行的配置文件、服务或登录脚本来启动代理并手动修复它!它到底会在哪里呢?
我尝试过的
由于我注意到ssh-agent
每次调用时都会生成an source ~/.bashrc
,因此这是我检查的第一个文件,但其中没有任何内容远程引用与 SSH 相关的任何内容。我一直在以下所有文件中使用vi
该字符串进行搜索,但什么也没找到ssh
:
~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
还有其他可能涉及的文件吗source ~/.bashrc
?我真的不知道。
然后我搜索了相关systemd
服务,但只找到ssh.service
,即WantedBy=multi-user.target
,因此不会在登录时运行(这很明显,因为这是 SSH 服务器守护进程)。
我也尝试将文件夹中的每个文件移动/home/pi
到临时文件夹并注销并再次登录,但ssh-agent
仍然产生。
最终,我还发射了我在密室中的最后一枪:我find / -name 'ssh-agent'
以 root 身份运行,只打印了/usr/bin/ssh-agent
, 一个可执行文件,所以我创建了一个伪造的可执行文件,它基本上只记录了父命令:
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
我重命名了真实的/usr/bin/ssh-agent
并将其替换为设置正确权限/用户/组的假的,source ~/.bashrc
再次运行,然后打印LOG
文件:
-bash
-bash
对于正在发生的事情没有任何线索。
更多细节
我正在添加更多细节,我不知道它们是否有帮助,但你知道......安全总比后悔好。
这是我的
.bashrc
。dummy
我创建了一个名为using 的新用户useradd -m dummy
,登录它不会启动任何ssh-agent
(我觉得这可能意味着什么)。这些diff /home/pi/.bashrc /home/dummy/.bashrc
内容基本上没有显示任何内容(只是我所做的评论),对于diff /home/pi/.profile /home/dummy/.profile
.SSH_AUTH_SOCK
即使未设置,代理套接字的创建也没有问题:pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/ total 0 srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
不知道为什么,但套接字文件名上的数字始终是紧邻进程 PID 之前的数字
ssh-agent
。片段来自
htop
:PID USER PRI NI VIRT RES SHR S Command 1 root 20 0 5472 3900 2728 S /sbin/init 1329 pi 20 0 3696 224 16 S └─ ssh-agent -s
已安装的软件包匹配
ssh
:pi:~$ apt list --installed | grep ssh libpam-chksshpwd/oldstable,now 1.1.8-3.1+deb8u2+rpi3 armhf [installed] libssh-gcrypt-4/oldstable,now 0.6.3-4+deb8u2 armhf [installed,automatic] libssh2-1/oldstable,now 1.4.3-4.1+deb8u1 armhf [installed,automatic] openssh-client/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] openssh-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] openssh-sftp-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic] ssh/oldstable,now 1:6.7p1-5+deb8u4 all [installed] sshpass/oldstable,now 1.05-1 armhf [installed]
使用in
ssh-agent -s
递归搜索并不会产生任何结果。grep
/etc
/lib
我没有安装桌面环境,但我有一个
/etc/X11
文件夹,里面有一些配置文件。我尝试将文件夹重命名为其他名称并重新启动以防万一,但该进程仍然会生成,所以显然这与此没有太大关系。
结论
现在,为了尽可能简单,我只有两个问题:
- 这是在哪里以及如何
ssh-agent
产生的,谁发出命令? - 为什么不以正确的方式调用它,而不设置所需的环境变量,从而使进程无限期地挂在那里?
答案1
我知道有几个可能的原因:
如果您使用
libpam-ssh
,它可以在会话启动过程中自动为您启动 SSH 代理,甚至可以自动加载您的密钥(如果它们没有密码或密码与您的登录密码相同)。如果您正在使用
gpg-agent
,它也可以选择执行 的任务ssh-agent
。它的关闭处理方式不同,因此只有SSH_AUTH_SOCK
环境变量,而不是SSH_AGENT_PID
如果您的工作站上运行 SSH 代理(例如 PuTTY 的 Pageant),并在启用代理转发的情况下建立 SSH 连接(并且远程
sshd
允许),则在远程主机上您将再次看到只有SSH_AUTH_SOCK
没有SSH_AGENT_PID
... 因为代理套接字转到sshd
哪个隧道将其返回到本地工作站的 SSH 代理。
答案2
这是一个老问题,但如果您来这里是为了找出SSH_AUTH_SOCK
环境变量的设置内容除了提到的所有其他地方,那么答案是sshd
。
sshd
SSH_AUTH_SOCK
如果您启用代理转发,AllowAgentForwarding yes
则将设置/etc/sshd_config
(默认情况下启用)。
无法将 sshd 配置为使用不同的路径,因为SSH_AUTH_SOCK
该路径似乎已被更改硬编码。
SSH_AUTH_SOCK
如果禁用代理转发,则不会设置。
man sshd_config
:
请注意,禁用代理转发不会提高安全性,除非用户也被拒绝 shell 访问,因为他们始终可以安装自己的转发器。