通过转发的套接字文件识别传入的 SSHD 进程

问题描述 投票:0回答:1

我有一个运行 SSHD 的 Docker 容器,它接收来自多个远程计算机的 SSH 连接。我需要识别并终止来自一台特定机器的连接。

连接:

  • 每个传入连接都来自不同的计算机。
  • 每个传入连接都会将容器上的 Unix 套接字文件转发到远程计算机上的 TCP 端口。每台远程机器转发不同的容器。
  • 转发该端口是这些连接所做的唯一一件事;他们不会启动交互式会话或运行任何命令。
  • 每个传入连接都以同一用户身份登录。
  • 每台远程计算机都有一个不同的用于登录的身份验证密钥。
  • 在远程计算机上执行 SSH 连接的代码在我的控制之下,因此如果有一些选项我可以传递给
    ssh
    或在
    ssh_config
    中设置,这样可以更轻松地识别连接,我可以选择这样做。

我所知道的:

  • 我知道我需要终止其连接的机器的序列号。
  • 我知道该连接将转发哪个套接字文件。
  • 我知道连接将使用哪个 SSH 身份验证密钥登录。
  • 知道连接将来自哪个 IP 地址或主机名。

到目前为止我尝试过的:

  • ps -aux
    将向我显示所有传入连接的 SSHD 进程。但是,我无法判断哪个传入连接来自哪台远程计算机。
  • 如果我可以识别哪个进程对应于哪个 SSH 身份验证密钥,那就足够了,但没有明显的方法可以从那开始。
  • 最有希望的选项似乎是识别哪个进程打开了相应的套接字文件,但我还无法做到这一点:
    • cat /proc/net/unix
      告诉我哪些套接字文件已打开,但不告诉我每个套接字文件由哪些进程打开
    • lsof
      应该列出哪些进程打开了哪些文件。但是,当我在只有一个传入连接时运行它来测试它时:
      • 输出没有列出我知道在任何地方打开的套接字文件
      • 相关 SSHD 进程的输出(其中有两个,一个作为 root 运行,另一个作为登录用户运行)显示它们唯一打开的文件是
        /proc/${PID}/cwd
        /proc/${PID}/root
        /proc/${PID}/exe
        ,以及
        /proc/${PID}/fd/
      • 中的 6-8 个编号文件
sockets ssh openssh sshd
1个回答
0
投票

找到了解决方案:

lsof
可以告诉你哪些进程打开了给定的套接字文件。然而,默认情况下,Docker 会限制容器,使得容器内的进程无法读取
/proc/${PID}/fd/${FD_NUM}
,即使尝试读取的进程以 root 身份运行,这就是为什么
lsof
无法判断哪些进程拥有哪些文件打开了。

使用

--cap-add=SYS_PTRACE
运行 SSHD 容器会告诉 Docker 不要阻止此类操作,从而允许
lsof
正常工作。

更具体地说:

lsof -t "${SOCKET_FILE}"
将返回打开给定套接字文件的PID列表。

© www.soinside.com 2019 - 2024. All rights reserved.