ls -l
LXD를 시도하는 동안 내 컴퓨터의 폴더를 LXC 컨테이너와 공유하려고 시도했지만 컨테이너의 폴더가 user nobody
및 group 에 속해 있다고 표시 되기 때문에 해당 폴더에 쓸 수 없습니다 nobody
.
이 사용자 및 그룹의 ID를 어떻게 알 수 있나요?
답변1
id
다음을 사용하여 uid 및 gid를 찾을 수도 있습니다 .
# Get the numeric uid of the user 'nobody'
$ id -u nobody
65534
# Get the numeric gid of the user 'nobody'
$ id -g nobody
65534
옵션이 없으면 사용자가 속한 uid와 모든 gid가 인쇄됩니다.
$ id nobody
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
답변2
이 명령에는 이름 대신 ID를 볼 수 ls
있는 옵션이 있다는 것을 알았습니다 .-n
-n, --numeric-uid-gid like -l, but list numeric user and group IDs
그래서 를 사용했는데 ls -ln
ID가 표시되었습니다.
65534 65534
답변3
OP의 맥락에서 컨테이너와 네임스페이스를 사용하면 사용자 네임스페이스도 관련되어 있다고 가정하겠습니다.아무도그리고그룹 없음특이한아무도그리고그룹 없음대상 사용자 및 그룹.
사용자아무도사실 그럴 수도 있겠네요과다실제 사용자가 아닌 현재 사용자 네임스페이스에 매핑되지 않은 사용자 ID에 접근하려고 할 때 반환되는 사용자 ID입니다.아무도. 기본적으로 오버플로 사용자 ID는 다음에 매핑됩니다.아무도.
이는 다음 명령이 삼중 0 0 4294967295(초기 사용자 네임스페이스에서와 같이 모든 것이 매핑된다는 의미)를 반환하지 않는 한 발생할 수 있습니다.
$ cat /proc/self/uid_map
0 0 4294967295
$ cat /proc/self/gid_map
0 0 4294967295
관련 문단입니다사용자 네임스페이스(7):
할 수 있는 곳이 많다매핑되지 않은 사용자 ID(그룹 ID)사용자 공간에 노출될 수 있습니다. 예를 들어, 새 사용자 네임스페이스의 첫 번째 프로세스는 네임스페이스에 대한 사용자 ID 매핑을 정의하기 전에 getuid(2)를 호출할 수 있습니다. 대부분의 경우,매핑되지 않은 사용자 ID를 오버플로 사용자 ID(그룹 ID)로 변환합니다. 오버플로 사용자 ID(그룹 ID)의 기본값은 65534입니다.
/proc/sys/kernel/overflowuid
/proc/sys/kernel/overflowgid
및 의 설명을 참조하세요 .공정(5).매핑되지 않은 ID가 이러한 방식으로 매핑되는 경우에는 사용자 ID(UID 가져오기(2),겟기드(2)등), UNIX 도메인 소켓을 통해 전달된 자격 증명, stat(2), waitid(2)에서 반환된 자격 증명,
[...]
unshare -U
이를 확인할 수 있는 간단한 예는 루트 또는 권한이 없는 사용자로부터 매핑 없이 새 사용자 네임스페이스를 시작하는 것입니다 . 여기에는 더 많은 자유를 얻고 overflowuid
나중에 변경하기 위해 초기 호스트 실제 루트에서 시작하는 것이 나와 있습니다 .
root@host:~# newgrp daemon
root@host:~# id
uid=0(root) gid=1(daemon) groups=1(daemon),0(root)
root@host:~# id bin
uid=2(bin) gid=2(bin) groups=2(bin)
root@host:~# id sys
uid=3(sys) gid=3(sys) groups=3(sys)
root@host:~# touch /tmp/foo
root@host:~# chown bin:sys /tmp/foo
root@host:~# ls -l /tmp/foo; ls -n /tmp/foo
-rw-r--r-- 1 bin sys 0 Oct 11 21:34 /tmp/foo
-rw-r--r-- 1 2 3 0 Oct 11 21:34 /tmp/foo
root@host:~# unshare -U
nobody@host:~$ id
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
nobody@host:~$ ls -l /tmp/foo; ls -n /tmp/foo
-rw-r--r-- 1 nobody nogroup 0 Oct 11 21:34 /tmp/foo
-rw-r--r-- 1 65534 65534 0 Oct 11 21:34 /tmp/foo
nobody@host:~$ exit
logout
root@host:~# sysctl -w kernel.overflowuid=60000
kernel.overflowuid = 60000
root@host:~# sysctl -w kernel.overflowgid=61000
kernel.overflowgid = 61000
root@host:~# unshare -U
$ id
uid=60000 gid=61000 groups=61000
$ ls -l /tmp/foo; ls -n /tmp/foo
-rw-r--r-- 1 60000 61000 0 Oct 11 21:34 /tmp/foo
-rw-r--r-- 1 60000 61000 0 Oct 11 21:34 /tmp/foo
$ exit
logout
root@host:~#
그래서 현실은 훨씬 더 복잡합니다. 오버플로 UID/GID를 표시하는 컨테이너 내에서는 다른 값에 매핑되지 않으면 상위 네임스페이스에 어떤 실제 UID/GID가 존재하는지 확인할 수 없습니다. 여기서 오버플로 값 60000 및 61000은 기본값 65534를 대체하고 상위 네임스페이스의 원래 UID/GID를 가리키지 않습니다. 0(root), 1(daemon), 2(bin), 3(을 나타냅니까? sys) 또는 다른 것? 알 방법이 없습니다.