나는 LXC 컨테이너를 사용하여 대부분의 네트워크 연결 서비스를 격리할 계획입니다.
제가 이해한 바로는 이 작업을 수행하는 두 가지 주요 방법이 있습니다.
루트가 소유한 권한 없는 컨테이너 만들기. 이 경우 루트에는 대규모 하위 UID 및 하위 GID 세트가 있으며 해당 범위의 다른 하위 세트는 각 컨테이너의 영향을 받습니다(어떤 컨테이너도 하위 UID 또는 하위 GID를 서로 공유하지 않습니다). ,
권한이 없는 시스템 계정이 소유한 권한이 없는 컨테이너 만들기. 이 경우 각 계정에는 컨테이너와 해당 컨테이너에 필요한 종속 UID 및 GID가 있습니다.
유용성 관점에서 볼 때 전자가 훨씬 더 좋습니다. 설정 및 유지 관리가 더 쉽습니다.
하지만,보안 관점에서 둘 사이에 차이점이 있습니까?
예를 들어:
및 에 정의된 동일한 풀(동일한 행)에 속한 ID 와 다른 사용자, 즉 다른 풀(다른 행)에 속한 ID를 비교하면
/etc/subuid
링크 또는 수평 관계가 있습니까 ?/etc/subgid
하위 ID와 소유자 계정 사이에 링크 또는 수직 관계가 있습니까? 루트가 소유한 하위 ID는 권한이 없는 사용자가 소유한 하위 ID보다 더 높은 권한을 가질 수 있나요? 다른 임의 ID보다 쉽게 하위 ID를 소유자 ID로 업그레이드할 수 있나요?
루트가 소유한다는 것은 컨테이너를 관리하는 모든 명령이 호스트에서 루트 권한으로 실행된다는 의미입니다. 이것이 약점을 구성합니까, 아니면 모든 특권이 조기에 포기됩니까?
등.
즉, 루트가 소유한 권한이 없는 컨테이너가 표준 계정이 소유한 컨테이너보다 "권한이 덜한" 것이 가능합니까?
답변1
즉, 루트가 소유한 권한이 없는 컨테이너가 표준 계정이 소유한 컨테이너보다 "권한이 덜한" 것이 가능합니까?
난 그렇게 생각하지 않아. 중요한 것은 /proc/$PID/uid_map
컨테이너의 사용자 네임스페이스에 있는 프로세스가 아니라 /etc/subuid
에서 다음 명령을 실행한다고 가정합니다.초기 사용자 네임스페이스(즉, 컨테이너가 아님) $PID
컨테이너에서 실행 중인 프로세스에서:
$ cat /proc/$PID/uid_map
0 200000 1000
이는 $PID 프로세스의 UID 범위가 해당 (컨테이너) 사용자 네임스페이스 외부의 UID 범위 [0-1000)
에 매핑된다는 의미입니다. [200000-201000)
범위를 벗어난 UID는 컨테이너의 65534( ) [200000-201000)
에 매핑됩니다 . $(cat /proc/sys/kernel/overflowuid)
예를 들어, 새 PID 네임스페이스를 생성하지 않으면 이런 일이 발생할 수 있습니다. 이 경우 컨테이너의 프로세스는 외부 프로세스를 볼 수 있지만 해당 UID는 65534입니다.
따라서 올바른 UID 매핑을 사용하면 컨테이너가 루트로 시작되더라도 해당 프로세스는 외부에 권한이 없는 UID를 갖게 됩니다.
내부 종속 UID는 /etc/subuid
어떤 방식으로든 외부 단일 UID에 연결되지 않습니다. 이 파일의 목적은 권한이 없는 사용자가 여러 UID를 사용하여 컨테이너를 시작할 수 있도록 하는 것입니다(대부분의 Linux 운영 체제의 경우와 마찬가지로). 기본적으로 권한이 없는 사용자인 경우 UID만 매핑할 수 있습니다. 즉, UID가 1000이고 $PID
컨테이너의 프로세스를 참조하는 경우 다음 작업만 수행할 수 있습니다.
echo "$N 1000 1" >/proc/$PID/uid_map
$N
권한이 없는 사용자 의 경우 . 다른 모든 것은 허용되지 않습니다. 더 많은 범위를 그릴 수 있다면, 즉
echo "$N 1000 50" >/proc/$PID/uid_map
[1000-1050)
컨테이너를 통해 컨테이너 외부의 UID에 액세스할 수 있습니다. 물론, 외부 UID 범위의 시작을 변경할 수 있다면 쉽게 루트 권한을 얻을 수 있습니다. 따라서 /etc/subuid
사용할 수 있는 외부 범위를 정의합니다. 이 파일은 newuidmap
setuid 루트에서 사용됩니다.
$ cat /etc/subuid
woky:200000:50
$ echo '0 200000 50' >/proc/$PID/uid_map
-bash: echo: write error: Operation not permitted
$ newuidmap $PID 0 200000 50
$ # success
세부 사항은 훨씬 더 복잡하고 설명하기에는 제가 적합한 사람이 아닐 수도 있지만 대답을 하지 않는 것이 더 낫다고 생각합니다. :-) 매뉴얼 페이지 user_namespaces(7)
와 newuidmap(1)
제가 직접 연구한 내용을 확인하고 싶을 수도 있습니다.새로운 Linux 사용자 네임스페이스의 첫 번째 프로세스는 setuid()를 호출해야 합니까?. 불행하게도 LXC가 이 파일을 어떻게 사용하는지 잘 모르겠습니다.