Ulimit
誰會贏,RLIMIT_NPROC 還是使用者命名空間?
根據配置,非特權(非根)程序可以創建使用者命名空間。
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 ,但在命名空間之外,它們是您的程序。