RLIMIT_NPROC 또는 사용자 네임스페이스 중 누가 이길까요?

RLIMIT_NPROC 또는 사용자 네임스페이스 중 누가 이길까요?

구성에 따라 권한이 없는(루트가 아닌) 프로세스가 사용자 네임스페이스를 생성할 수 있습니다.

RLIMIT_NPROC프로세스 수 제한사용자당.

사용자 네임스페이스에 들어가면 내가 원하는 UID와 다른 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부: 사용자 네임스페이스.

관련 정보