構成によっては、非特権(非ルート)プロセスがユーザー名前空間を作成する場合があります。
RLIMIT_NPROC
はプロセスの数を制限しますユーザーあたり。
ユーザー名前空間を入力した場合、異なるUIDでプロセスを作成して、実際のRLIMIT_NPROC
を超えることはできますか?
そうではないようです。
$ 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:ユーザー名前空間 。
名前空間を持っていても追加の特権は与えられないという一般原則があります。単一の名前空間では実行できなかった、複数の名前空間を持つシステムの残りの部分に対して実行できることは何もありません。名前空間が提供するのは、一部のプロセスに追加の制限を適用する追加の機能です。
RLIMIT_NPROC
は、作成できるプロセスの最大数です。これらのプロセスの一部が名前空間にある場合、それらの特権は少なくなる可能性がありますが、それでも1つのプロセスとしてカウントされます。とにかく、これらのプロセスはすべて、外部名前空間のプロセスです。それらは異なるUIDを持つ可能性がありますinside名前空間ですが、名前空間の外側では、それらはあなたのプロセスです。