考虑管理用户定义程序的系统:
/bin/ls
,也可以是/usr/sbin/apache
;用户可以指定允许他开始的任何内容。fork()
,exec()
等setsid()
)。这是一个问题:如何在Linux流程模型中提供这样的系统?
天真的方法:
fork()
,exec()
,setuid()
等启动计划。/proc/stat
写入唯一且永久识别它)到文件。SIGTERM
设置为PID。/proc
以根据PID构建流程层次结构。这种方法有一个很大的漏洞:任何进程都可能分叉并突破其进程组。查看流程层次结构是不够的。程序创建新进程后,无法将其原点追溯回原始程序。
解决方法是确保每个程序都使用唯一的UID启动。这是不可取的或特别可行的,因为(人)用户可以定义任意数量的节目;然后,系统必须以编程方式为每个程序创建新的唯一用户。
到目前为止,我唯一的想法是在程序的初始过程中注入一个特殊的保留环境变量,即使用env PROGRAM=myprogram <command line>
运行程序。然后,系统可以强制所有进程必须继承其父进程的环境。系统可以定期搜索/proc
并强行杀死任何缺少PROGRAM
环境变量的进程。
我可以使用Linux系统调用API中的秘密吗?
答案 0 :(得分:2)
(1)必须能够“停止所有程序P的进程,包括儿童/叉子”。 (2)必须可以执行“查找属于程序P的所有进程”的操作。
cgroups实现了这一点,而systemd可能是迄今为止使用(2)实现(1)的最重的用户。你可以打破进度组,但不能打破cgroup。