是否有可能在stream程级别限制可用于Linux的标准stream?

我希望能够产生一个只能访问标准input,标准输出和标准错误的Linux进程(没有其他的)。 我可以在stream程级本身做到吗? 我也隐含地说(矛盾),我不希望产生的过程能够改变stream的另一端指向的“事物”。

打个比方:

  • 该进程有一个inputpipe道来自某个地方,它不能改变pipe道从哪里开始,所以它不能控制input来自哪里。
  • 该进程有输出和错误pipe道,它不能改变输出pipe道的另一端指向的地方,所以它不能控制输出到哪里。
  • 它不能创build任何新的pipe道。

我目前也在看SElinux。 这将允许我创build一个只能访问这三个stream的stream程吗? 谢谢。

正如在另一个答案中所述,SELinux具有各种权限来帮助锁定任何进程。

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

可能最简单的做法是写一点政策。 幸运的是,SELinux默认是拒绝的,所以运行你的程序并查看SELinux拒绝日志,只允许你的程序做你想做的事情。 换句话说,您可以避免添加涉及诸如msg(systemV消息队列中的消息),msgq(SystemV消息队列本身),sem(信号量),shm(共享内存)等对象类的权限以及可能依赖于它的操作。

我建议你第一次做SELinux但是放任(见setenforce 0)

我也会建议一些工具来帮助你制定一些政策,但是基本上可以写出一些原始的M4可能有点不可思议

这听起来很像这个LWN文章所描述的 ,它基本上阻塞了除读,写和退出之外的所有系统调用。

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

那么我想你可以使用ptrace来捕获所有的系统调用,只允许那些你认可的系统调用,所以当我说“没有办法”时,我的意思是“没有简单的方法”。 这招致了一个明显的开销,但如果你足够小心,可以使其安全。 如果你决定走这条道路, strace或UMview项目可能是一个很好的起点。

SELinux可以完成这项工作; 您可以为某些程序分配权限以使用某些系统调用。 通过拒绝开放,管道和其他人的访问,你应该能够做到你所描述的。

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