Ulimit

誰會贏,RLIMIT_NPROC 還是使用者命名空間?

  • February 13, 2019

根據配置,非特權(非根)程序可以創建使用者命名空間。

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 在Namespaces in operation, part 5: User namespaces中解釋。

有一個一般原則,擁有命名空間不會給你任何額外的特權。對於具有多個名稱空間的系統的其餘部分,您無法對單個名稱空間執行任何操作。命名空間為您提供了對某些程序應用額外限制的額外能力。

RLIMIT_NPROC是您可以創建的最大程序數。如果其中一些程序在命名空間中,它們可能擁有較少的權限,但它們仍然算作一個程序。無論如何,所有這些程序都是外部命名空間中的程序。它們在命名空間內可能有不同的 UID ,但在命名空間之外,它們是您的程序。

引用自:https://unix.stackexchange.com/questions/500241