사용자 "myuser", uid/gid "1001", 파일 "/etc/subuid" 및 "/etc/subgid"에 다음 내용이 포함되어 있다고 가정해 보겠습니다.
myuser:100000:65536
이 설정을 사용하여 "myuser" 사용자가 "100000"이 소유한 파일에 액세스할 수 있습니까?
답변1
응, 의 도움으로setuid 루트유용newuidmap
그리고newgidmap
작업/etc/subuid
그리고/etc/subgid
.
유사한 도구팟캐스트,도커또는 LXC에는 모두 다음이 필요합니다.setuid 루트설치된 유틸리티는 일반 사용자로서 루트 없음/비권한 모드에서 작동합니다. 이러한 도구가 없으면 이 작업을 안내할 충분한 권한이 없습니다.
긴 설명은 다 있어요사용자 네임스페이스이러한 기능을 사용하는 방법을 알아보려면 이 맨페이지를 읽어야 합니다. 즉, 일단 사용자 네임스페이스가 생성되면(권한이 없는 작업을 사용하여) 특정 의사 파일을 /proc/<PID>/{uid,gid}_map
한 번만 작성하여 매핑을 설정할 수 있습니다. 올바른 (호스트) 권한이 있어야 합니다. 대체UID/지드그런 다음 허용된 범위를 /etc/sub{uid,gid}
사용자 네임스페이스에 매핑할 수 있습니다.
사용자내 사용자특수 명령의 도움 없이 이러한 의사 파일을 자체적으로 작성할 수 있지만 다음과 같습니다.
자신만 소유할 수 있음(호스트UID10011001장)UID사용자 네임스페이스(유용할 수 있는 확실한 선택은 자체 또는 0 입니다)뿌리). 그럼에도 불구하고 새 프로세스는 당분간 새로 생성된 사용자 네임스페이스에 매핑되지 않으므로 이 작업은 다른 프로세스에서 수행되어야 합니다. 매핑되지 않은UID오버플로로 번역됩니다.UID(기본적으로 65534 일명아무도) "해결"될 때까지 자체
/proc/<PID>/uid_map
파일에 쓸 수 없습니다. 되어도뿌리영향을 미칠 수 있기 때문에 이 네임스페이스에서뿌리어느 호스트야?UID1001, 이것은 쓸모가 없습니다. 시스템 호출(및 이를 사용하는 명령)은 권한 상승을 허용하지 않도록 설계되었습니다. 실패하는 것 외에도 매핑을 변경하려고 할 때EPERM
실패할 수도 있습니다.EINVAL
UID(예: 호스트UID10011001장)UID.그룹의 경우에도 마찬가지이지만 먼저 사용 능력을 상실해야 한다는 추가 제한이 있습니다.
setgroups
글을 쓸 수 있기 전에/proc/<PID>/gid_map
(이것은 글을 쓸 수 없게 되는 것을 피하기 위한 것입니다)제거하다자신이 그룹에서탈출하다이 그룹의 일부로 추가된 파일에 대한 제한 사항).
그래서UID100000은 확실히 도달할 수 없습니다.setuid 루트도구예필수의.
여기서 목표는 일반 사용자를 매핑하는 것입니다.내 사용자그리고UID1001( newuidmap
하위 ID 외에 매핑에도 허용됨)뿌리사용자(UID0) 및반품최소한 호스트를 매핑하십시오.UID사용자 네임스페이스 내 100000: 이를 통해 (사용자 네임스페이스의)를 통해 서로 변경할 수 있습니다.뿌리필요할 때. 여기서 다시 추가 100000을... 100000으로 매핑하겠습니다. 나도 똑같은 짓을 할 텐데지드, /etc/subgid
의 거울이라고 가정합니다 /etc/subuid
.
다음은 초기 호스트 사용자가 newuidmap
사용하고 수행하는 방법에 대한 실제 예 입니다.newgidmap
내 사용자. 위에서 언급한 것처럼 여기에는 두 가지 프로세스가 필요하므로 여기서는 두 개의 터미널에 두 개의 쉘이 있습니다. 이 사람들의 행동setuid 루트echo
명령은 (호스트)에서 실행되는 적절하게 제작된 (또는 등) 명령 으로 대체될 수 있습니다.printf
뿌리사용자.
1학기:
$ unshare --user sh
$ id -u; id -un ; id -g; id -gn; echo pid:$$
65534
nobody
65534
nogroup
pid:13273
term2(이전 재사용PID명령의 값):
$ newuidmap 13273 0 1001 1 100000 100000 1
$ newgidmap 13273 0 1001 1 100000 100000 1
term1을 다시 ( exec sh
쉘에 "해결됨" 및 "업그레이드됨" 상태가 표시되도록 하기 위해):
$ id -u; id -un ; id -g; id -gn
0
root
0
root
$ exec sh
#
# touch mytest
# chown 100000:100000 mytest
term2(여기에 표시된 내용은 다음과 같습니다.1학기, 선택한 매핑의 값이 동일하므로):
$ ls -l mytest
-rw-r--r--. 1 100000 100000 0 Apr 21 18:00 mytest
$ touch mytest
touch: cannot touch 'mytest': Permission denied
1학기:
# chown 100001:100001 mytest
chown: changing ownership of 'mytest': Invalid argument
# chown root:root mytest
2학기:
$ ls -l mytest
-rw-r--r--. 1 myuser myuser 0 Apr 21 18:00 mytest
모든 하위 프로세스1학기이제 통제할 것이다UID100000(파일 시스템 작업 포함)
/etc/subuid
더 많은 항목이 영향을 받거나 더 쉽게 영향을 받을 수 있으므로 더 넓은 범위 또는 더 스마트한 매핑을 사용할 수 있습니다 (예: 100000을 다음으로 매핑).내 사용자대신 간단히 실행을 newuidmap 13273 0 1001 1 1001 100000 1
허용합니다.su myuser
1학기, 치명적이지 않은 오류에도 불구하고 성공해야 합니다). 예를 들어, 이는 관련되지 않은 문제로 인해 시작을 거부하는 사용자 LXC 인스턴스에 대한 액세스/구조/백업(네트워킹과 같은 다른 기능이 아닌 파일 시스템 수준에서만)을 허용합니다.