我知道,可以利用Linux名称空间和其他许多东西来安全地处理限制和监禁子进程,而不会让它们被僵尸化并转储到init上。但我对执行细节很模糊。如何使用util-linux提供的工具(如mount和nsenter )来监视、监视和确保启动的所有进程都是另一个进程的直接命名空间后代?
发布于 2014-04-11 00:51:20
这里使用的正确命令是unshare。请注意,执行此操作的必要选项只能从util-linux 2.23中获得。这样做的目的是为您正在运行的程序创建一个新的PID命名空间,以便在这个名称空间中也创建它的所有子程序。只需执行以下操作,就可以在新的PID命名空间中运行命令:
sudo unshare -fp some_command要运行shell,只需省略命令即可。这将创建一个进程,它和它的任何子进程一样,在父(系统)命名空间中具有一个PID。但是,在新的命名空间中,它将具有1的PID以及init进程的一些特殊特性。也许从监控的角度来看,最相关的特征是,如果其任何一个后代成为孤儿,他们将被重新亲生到这个过程中,而不是真正的init进程。
对大多数监测案例来说,仅仅这样做可能就足够了。如前所述,名称空间中的进程都在父名称空间中有PID,因此可以使用常规命令来监视它们的活动。我们还确信,如果名称空间中的任何进程成为孤儿,它不会从顶层程序PID下面的进程树分支中掉下来,这意味着它仍然可以很容易地被跟踪。
相结合
然而,我们不能做的是监视进程的PID,它认为这是有。要做到这一点,特别是为了能够在新的命名空间中使用ps命令,您需要为命名空间挂载一个单独的procfs文件系统。这反过来又会导致另一个问题,因为ps为procfs所接受的唯一位置是/proc。一个解决方案是创建一个chroot监狱并在那里挂载新的procfs。但是这是一种很麻烦的方法,因为我们至少需要复制(或者至少是硬链接)我们打算使用的任何二进制文件以及它们所依赖的任何库到新的根。
解决方案也是使用一个新的挂载命名空间。在此范围内,我们可以以一种使用真正的根procfs目录的方式挂载新的/proc,可以在PID命名空间中使用,并且不会干扰任何其他内容。为了使这个过程非常简单,unshare命令提供了--mount-proc选项:
sudo unshare -fp --mount-proc some_command现在,在组合命名空间中运行ps将只显示具有PID名称空间的进程,并且它将显示顶级进程为PID为1。
nsenter呢?顾名思义,nsenter可以用于输入已经用unshare创建的命名空间。如果我们只想从名称空间内部从其他无关的脚本获取信息,这是非常有用的。最简单的方法是访问在命名空间中运行的任何程序的PID。要明确的是,这必须是运行nsenter的命名空间中目标程序的PID (因为名称空间可以嵌套,一个进程就有可能有多个PID)。要在目标PID/挂载命名空间中运行shell,只需执行以下操作:
sudo nsenter -t $PID -m -p如果像上面一样设置了这个名称空间,ps现在将只列出该名称空间中的进程。
https://unix.stackexchange.com/questions/124162
复制相似问题