谁正在启动我的 ssh-agent,为什么它不能正确终止?

谁正在启动我的 ssh-agent,为什么它不能正确终止?

这是我长期以来一直遇到的问题,但每次我试图弄清楚一些事情时,我都会迷失方向,所以我想我最好在这里询问,也许更有经验的人可以帮助我。

背景

我的 Raspberry Pi 运行的是 Raspbian Jessie,我经常使用 SSH 登录并远程执行命令。在我的第一次 SSH 会话期间,我注意到ssh-agent生成了一个进程在树莓派上每次我登录时,但从未在exiting: 登录和退出时被杀死,导致生成一堆ssh-agent进程,只是挂在那里什么都不做。四处摆弄并阅读手册页和答案,我最近了解了 的目的ssh-agent,而且我还了解到它通常应该在注销时被杀死,所以我开始问自己为什么不这样。此外,我注意到发出会导致产生source ~/.bashrc另一个实例。ssh-agent我继续读下去相关手册页SSH_AGENT_PID应该定义环境变量,因为ssh-agent程序应该在 an 内启动eval以执行其输出并定义此类变量,然后由其他 SSH 相关命令使用,包括ssh-agent -k(杀死相对于当前会话的代理),所以我跑echo $SSH_AGENT_PIDecho $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]
    
  • 使用inssh-agent -s递归搜索并不会产生任何结果。grep/etc/lib

  • 我没有安装桌面环境,但我有一个/etc/X11文件夹,里面有一些配置文件。我尝试将文件夹重命名为其他名称并重新启动以防万一,但该进程仍然会生成,所以显然这与此没有太大关系。


结论

现在,为了尽可能简单,我只有两个问题:

  1. 这是在哪里以及如何ssh-agent产生的,谁发出命令?
  2. 为什么不以正确的方式调用它,而不设置所需的环境变量,从而使进程无限期地挂在那里?

答案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

sshdSSH_AUTH_SOCK如果您启用代理转发,AllowAgentForwarding yes则将设置/etc/sshd_config(默认情况下启用)。

无法将 sshd 配置为使用不同的路径,因为SSH_AUTH_SOCK该路径似乎已被更改硬编码

SSH_AUTH_SOCK如果禁用代理转发,则不会设置。

man sshd_config:

请注意,禁用代理转发不会提高安全性,除非用户也被拒绝 shell 访问,因为他们始终可以安装自己的转发器。

相关内容