是否可以在进程级别限制linux可用的标准流?

时间:2008-10-08 21:55:37

标签: linux stream selinux

我希望能够生成一个只能访问stdin,stdout和stderr的linux进程(没有更多,也没有更少)。我可以在流程级别执行此操作吗?我也隐含地声明(矛盾)我不希望衍生过程能够改变流的另一端指向的“事物”。

比喻:

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

如另一个回答所述,SELinux确实拥有各种权限,有助于锁定任何进程。

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

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

我建议你第一次使用SELinux但是允许(参见setenforce 0)

我还建议使用工具来帮助你建立一些政策,基本上写原始M4可能有点压倒性

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

第二种可能的途径是使用LD_PRELOAD功能,并提供自己的开放,管道等。功能。这不是100%安全,因为程序仍然可以更直接地访问系统调用(假设这是一个潜在的恶意程序)