2008-10-08 61 views
3

我希望能够产生一个只能访问标准输入,标准输出和标准错误(仅此而已)的Linux进程。我可以在流程级本身做到这一点吗?我也隐含地声明(oxymoron)我不希望产生的过程能够改变流的另一端指向的“事物”。是否有可能在流程级别限制可用于Linux的标准流?

比喻:

  • 过程中有来自某处的输入管道,它不能改变在管,从开始,所以它无法控制其中输入来自。
  • 该进程的输出和错误管道在某处,它不能改变输出管道另一端指向的位置,所以它无法控制输出到哪里。
  • 它不能创建任何新的管道。

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

回答

2

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

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

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

我建议你第一次做它有SELinux的上,但在宽松(见setenforce 0)

我还建议工具来帮助您建立一些政策,它可以是一个有点势不可挡写的基本原料M4

1

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

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

1

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

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

+0

您将如何限制个人系统调用与SELinux?有权限限制类对象的系统调用类,但是我看到`pipe`,`close`,`dup`等没有限制。 – ephemient 2008-10-09 14:44:08

2

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

+0

哦,的确如此,我忘记了CONFIG_SECCOMP。但并不是所有的发行版内核都能启用它,而且它非常有限:您不能在seccomp下执行另一个程序。 – ephemient 2008-10-09 14:29:28

相关问题