하위 사용자 ID를 사용하여 파일 시스템 권한을 부여할 수 있습니까?

하위 사용자 ID를 사용하여 파일 시스템 권한을 부여할 수 있습니까?

사용자 "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실패할 수도 있습니다.EINVALUID(예: 호스트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 myuser1학기, 치명적이지 않은 오류에도 불구하고 성공해야 합니다). 예를 들어, 이는 관련되지 않은 문제로 인해 시작을 거부하는 사용자 LXC 인스턴스에 대한 액세스/구조/백업(네트워킹과 같은 다른 기능이 아닌 파일 시스템 수준에서만)을 허용합니다.

관련 정보