根据配置,非特权(非 root)进程可以创建用户命名空间。
RLIMIT_NPROC
限制进程数量每个用户。
如果我输入用户命名空间,我是否可以创建具有不同 UID 的进程,从而超出我的真实值RLIMIT_NPROC
?
答案1
有一个一般原则,即拥有命名空间不会给您任何额外的特权。对于具有多个名称空间的系统的其余部分,没有什么是您无法使用单个名称空间完成的。命名空间为您提供了对某些进程应用额外限制的额外能力。
RLIMIT_NPROC
是您可以创建的最大进程数。如果其中一些进程位于命名空间中,它们可能拥有较少的权限,但它们仍然算作一个进程。无论如何,所有这些进程都是外部命名空间中的进程。他们可能有不同的 UID里面在命名空间内,但在命名空间之外,它们是您的进程。
答案2
看来并非如此。
$ unshare -r
# ulimit -u 1000
# sh -c 'for i in $(seq 998); do sleep 1& done' >/dev/null
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
... (i.e. more than one error - so I guess my existing processes were already counted)
sh: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
相似地:
$ unshare -r
# ulimit -u 1002
# sh -c 'for i in $(seq 100); do sleep 1& done' >/dev/null
# sleep 2
# for i in $(seq 10); do unshare -r sh -c 'for i in $(seq 100); do sleep 1& done' >/dev/null; done
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
ulimit -u 1000
在内部运行unshare -r
不会影响用户命名空间之外的用户。啊 - 这是因为ulimit -u
总是在进程内设置限制。但当在 fork() 中检查限制时,我们将该进程的 RLIMIT_NPROC 与“真实”UID 的进程总数进行比较,即从“根”命名空间的角度来看。
据我所知,这一切都运行得很好。
顺便说一句,我注意到,如果您没有特权,则无法使用用户命名空间创建具有多个不同 UID 的进程。
$ unshare -r
# id -u
0
# setpriv --ruid 1 sh
setpriv: setresuid failed: Invalid argument
这方面的规则由 Michael Kerrisk 解释,例如操作中的命名空间,第 5 部分:用户命名空间。