RLIMIT_NPROCまたはユーザーの名前空間のどちらが勝ちますか?

RLIMIT_NPROCまたはユーザーの名前空間のどちらが勝ちますか?

構成によっては、権限のない(ルートではない)プロセスがユーザーの名前空間を作成できます。

RLIMIT_NPROCプロセス数の制限ユーザーごと

ユーザーの名前空間に入ると、私が望むUIDとは異なるUIDでプロセスを作成できますかRLIMIT_NPROC

答え1

名前空間があっても追加の権限が付与されないという一般的な原則があります。複数の名前空間を持つ残りのシステムと同様に、単一の名前空間で実行できない操作はありません。名前空間は、特定のプロセスに追加の制限を適用するための追加機能を提供します。

RLIMIT_NPROC生成できるプロセスの最大数。これらのプロセスの一部が名前空間にある場合は、権限が少なくなる可能性がありますが、それでも1つのプロセスとしてカウントされます。とにかく、これらのプロセスはすべて外部ネームスペースのプロセスです。 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:ユーザーネームスペース

関連情報