作为普通的非root用户的沙箱权限下降权限?

是否可以使用一组C库或系统调用来删除POSIX上的所有用户权限,或至less在Linux上? 请注意,我不问如何删除root权限,这是所有其他StackOverflowsearch结果似乎是要求和回答。

我想要切换到用户nobody ,但如果可能的话更强。 也就是说,我想让我的C应用程序执行以下操作:

  • 以普通用户身份运行, 而不是 root ,并且没有setuid文件权限位
  • 保留访问特定文件和打开传出networking连接的能力
  • 自愿并永久失去读写指定(或全部)目录中文件的能力,特别是$HOME
  • 如果可能的话,放弃或沙箱所有其他不必要的能力,如打开一个听acceptsockets

我迄今为止考虑到的不符合法案的事情:

  • setuid / setgid切换到用户nobody
    • 普通用户被禁止切换到其他用户(比如nobody ),应用程序不需要root就可以切换到nobody
  • Linux / POSIX.1efunction
    • function只能添加root类权限,不能带走普通用户权限
  • 传统seccomp
    • 我的应用程序需要的不仅仅是exitsigreturnreadwrite

看起来很有趣但是我找不到文档的东西看起来没有维护,或者看起来是不可移植的:

  • 的Seccomp-BPF
  • AppArmor的
  • grsecurity RBAC /基于angular色的访问控制

那么是否有一个logging良好的,最好是便携式的方式来放弃不重要的用户权限和沙箱进程,而不必先成为root

所有POSIX都不可能有任何解决方案,因为POSIX没有定义你正在寻找的机制。

只看Linux的要求,可能最简单的方法就是通过安全模块实现。 任何apparmor,selinux,RBAC都可以做你需要的,但只能通过外部配置文件 – 而不是你的应用程序内置的东西。 问题可能是在所有这些情况下添加一个配置文件需要root用户这样做(但该配置文件也适用于用户进程)。

几乎满足要求的一点更复杂的解决方案是seccomp。 虽然它根本不理解路径(你只能看到指针),但是有一些方法可以限制访问:每个线程都可以定义seccomp策略,所以你可以重新设计你的系统来创建一个“路径验证线程”,它不会如果它们符合你的规范,除了读取路径和返回套接字外,不做任何事情。 然后限制该线程只是recv()open()send() 。 线程做其他的工作,然后可以open()并使用其他服务。

或者,如果你可以在程序启动时配置路径,你可以把它们放在一个数组中,将该页面标记为只读,并设置seccomp策略,只接受来自该数组的文件名的open() (这只是一个指针比较这种情况)。

在某种程度上,将应用程序分割成具有非常有限责任的独立进程的方法是可以在其他系统上复制的,但是在Linux上没有相同的保证。 例如,qmail是一个非常小的进程的系统,作为数据(简化)的管道工作。 在Linux上,你仍然可以将seccomp应用到它们上,在Solaris上只是删除exec和其他功能,在其他系统上……我不知道,但可能你可以做一些事情。