【问题标题】:Is it possible to limit standard streams available to linux at the process level?是否可以在进程级别限制 linux 可用的标准流?
【发布时间】:2010-09-16 03:38:46
【问题描述】:

我希望能够生成一个只能访问 stdin、stdout 和 stderr 的 linux 进程(不多也不少)。我可以在流程级别本身执行此操作吗?我还含蓄地声明(矛盾修饰法)我不希望生成的进程能够更改流的另一端指向的“事物”。

比喻:

  • 该进程有一个来自某个地方的输入管道,它无法更改管道的起始位置,因此它无法控制输入的来源。
  • 该进程有输出管道和错误管道,它无法更改输出管道的另一端指向的位置,因此它无法控制输出的位置。
  • 它无法创建任何新管道。

我目前也在研究 SElinux。这是否允许我创建一个只能访问这三个流的进程?谢谢。

【问题讨论】:

    标签: linux stream selinux


    【解决方案1】:

    正如另一个答案中所述,SELinux 确实具有有助于锁定任何进程的各种权限。

    内核管理对某些对象(具有关联的权限集)的访问,例如文件是对象,目录是对象,unix 数据报套接字是对象等等。

    可能最简单的事情就是编写一个小策略。幸运的是 SELinux 默认是拒绝的,所以运行你的程序并查看 SELinux 拒绝的日志,只允许你的程序做你想做的事。换句话说,您将避免添加涉及对象类的权限,例如 msg(systemV 消息队列中的消息)、msgq(SystemV 消息队列本身)、sem(信号量)、shm(共享内存)以及可能的其他权限,具体取决于它的功能。

    我建议你第一次这样做时启用 SELinux 但允许(参见 setenforce 0)

    我还建议一些工具来帮助您建立一些策略,编写基本原始的 M4 可能有点难以承受

    【讨论】:

      【解决方案2】:

      这听起来很像what is described this LWN article,它基本上阻止了所有系统调用,除了读、写和退出。

      【讨论】:

      • 哦,没错,我忘记了 CONFIG_SECCOMP。但并非所有发行版内核都启用它,而且它非常有限:您不能让另一个程序在 seccomp 下执行。
      【解决方案3】:

      如果你是 root,你可以 chroot 到一个目录,删除权限,这样你就不再有文件系统的写访问权限,然后 exec。这将阻止程序创建新文件。但是没有办法阻止程序创建管道和套接字(好吧,SELinux 可以没有套接字),也没有办法阻止程序重新排列和关闭其文件描述符。

      好吧,我想您可以使用ptrace 来捕获所有系统调用,并且只允许您批准的系统调用,所以当我说“没有办法”时,我的意思是“没有简单的方法”。这会产生显着的开销,但如果你足够小心,你可以确保它的安全。如果您决定走这条路,straceUMview 项目可能是很好的起点。

      【讨论】:

        【解决方案4】:

        SELinux 可以胜任;您可以为某些程序分配使用某些系统调用的权限。通过拒绝对 open、pipe 等的访问,您应该能够完全按照您的描述进行操作。

        第二种可能的方法是使用 LD_PRELOAD 功能,并提供您自己的 open、pipe 等。职能。这不是 100% 安全的,因为程序仍然可以更直接地访问系统调用(假设这是一个潜在的恶意程序)

        【讨论】:

        • 如何限制使用 SELinux 的单个系统调用?有权限限制对象类的系统调用类,但我认为pipeclosedup 等没有限制。
        猜你喜欢
        • 1970-01-01
        • 2023-01-14
        • 2015-05-08
        • 1970-01-01
        • 2015-03-04
        • 2018-12-04
        • 2022-07-18
        • 2013-03-13
        • 1970-01-01
        相关资源
        最近更新 更多