是否可以使用一组C库或系统调用来删除POSIX上的所有用户权限,或至less在Linux上? 请注意,我不问如何删除root
权限,这是所有其他StackOverflowsearch结果似乎是要求和回答。
我想要切换到用户nobody
,但如果可能的话更强。 也就是说,我想让我的C应用程序执行以下操作:
root
,并且没有setuid文件权限位 $HOME
accept
sockets 我迄今为止考虑到的不符合法案的事情:
setuid
/ setgid
切换到用户nobody
nobody
),应用程序不需要root
就可以切换到nobody
。 root
类权限,不能带走普通用户权限 exit
, sigreturn
, read
和write
看起来很有趣但是我找不到文档的东西看起来没有维护,或者看起来是不可移植的:
那么是否有一个logging良好的,最好是便携式的方式来放弃不重要的用户权限和沙箱进程,而不必先成为root
?
所有POSIX都不可能有任何解决方案,因为POSIX没有定义你正在寻找的机制。
只看Linux的要求,可能最简单的方法就是通过安全模块实现。 任何apparmor,selinux,RBAC都可以做你需要的,但只能通过外部配置文件 – 而不是你的应用程序内置的东西。 问题可能是在所有这些情况下添加一个配置文件需要root用户这样做(但该配置文件也适用于用户进程)。
几乎满足要求的一点更复杂的解决方案是seccomp。 虽然它根本不理解路径(你只能看到指针),但是有一些方法可以限制访问:每个线程都可以定义seccomp策略,所以你可以重新设计你的系统来创建一个“路径验证线程”,它不会如果它们符合你的规范,除了读取路径和返回套接字外,不做任何事情。 然后限制该线程只是recv()
, open()
和send()
。 线程做其他的工作,然后可以open()
并使用其他服务。
或者,如果你可以在程序启动时配置路径,你可以把它们放在一个数组中,将该页面标记为只读,并设置seccomp策略,只接受来自该数组的文件名的open()
(这只是一个指针比较这种情况)。
在某种程度上,将应用程序分割成具有非常有限责任的独立进程的方法是可以在其他系统上复制的,但是在Linux上没有相同的保证。 例如,qmail是一个非常小的进程的系统,作为数据(简化)的管道工作。 在Linux上,你仍然可以将seccomp应用到它们上,在Solaris上只是删除exec
和其他功能,在其他系统上……我不知道,但可能你可以做一些事情。