난 달린다 unshare -r touch file
. 그러나 unshare -r chown nobody file
그것은 나에게 주어졌습니다 Invalid argument
. 왜?
답변1
새 사용자 네임스페이스를 생성한 후 작업을 "완료"하려면 UID와 GID 매핑을 한 번에 완료해야 합니다.
초기 사용자(권한이 없는 경우)는 이 매핑을 수행할 수 있지만 자신을 새 사용자 네임스페이스에만 매핑할 수 있습니다.하나UID 및하나GID는 권한 없이 매핑될 수 있습니다.
이 제한된 경우에는 이 단일 사용자 매핑에 관심 있는 후보인 새 사용자 네임스페이스에는 단 두 명의 사용자만 있습니다. 다른 관련 네임스페이스(예: 네트워크 또는 마운트)와 관련된 권한을 포함하는 권한을 얻기 위한 루트 또는 사용자 네임스페이스 자체(일반적으로 여러 레이어 포함): 초기(john) -> userns1(루트) -> userns2(다시 john)). 따라서 일반적으로 루트가 선택됩니다(이 -r
옵션이 수행하는 작업입니다).
루트 권한에서 일부 권한은 프로세스, 파일의 UID 변경 또는 영향과 관련되어 있습니다. 그러나 이 새로운 사용자 네임스페이스에서는 선택한 UID(루트의 경우 0)를 제외한 다른 모든 UID가 매핑되지 않습니다. 그들은 다음과 같이 매핑됩니다.(오버플로된 UID) 아무도 없음(65534) 및 이를 변경하거나 변경하려고 시도하면 EINVAL(잘못된 매개변수)이 발생합니다. 이는 초기 사용자의 네임스페이스에서 권한이 없는 사용자가 동일한 작업을 수행한 결과인 EPERM(Operation Not Allowed)과 다릅니다. 그러나 전반적인 목표는 동일합니다. 즉, 사용자 네임스페이스를 사용하여 스푸핑을 시도하여 호스트(초기 네임스페이스...)에 대한 권한이나 액세스를 얻을 수 있는 방법이 없습니다.
권한이 없는 사용자가 생성한 네임스페이스에서 여러 UID를 사용해야 하는 경우 다음을 사용해야 합니다.특권돕는 사람. 이러한 도우미는 어디에나 있으며 권한이 없는 사용자와 함께 사용할 경우 컨테이너 기술(Docker, LXC...)의 전제 조건입니다.newuidmap
(그리고 그 동료들 newgidmap
). 이 도구는 setuid-root(적어도 CAP_SETUID가 필요하지만 다른 것도 필요함)이며 /etc/subuid
사용자 자체 외에 /에 있는 모든 사용자 항목의 전체 매핑 범위를 새 사용자 네임스페이스에 부여할 수 있습니다./etc/subgid
자세한 내용은 이 Q/A에서 확인할 수 있습니다.하위 사용자 ID를 사용하여 파일 시스템 권한을 부여할 수 있습니까?
답변2
루트만이 소유권을 다른 사용자에게 변경할 수 있습니다. 당신은 unshare -r
루트가 되지만 자신의 네임스페이스에서만 가능합니다.
~$ unshare -r touch /tmp/foo
~$ unshare -r ls -l /tmp/foo
-rw-r--r-- 1 root root 0 27. Jul 14:20 /tmp/foo
~$ ls -l /tmp/foo
-rw-r--r-- 1 user user 0 27. Jul 14:20 /tmp/foo
네임스페이스의 파일 시스템이 "실제" 네임스페이스의 파일 시스템을 변조할 수 있으므로 chown
이는 방지됩니다 .