LXC: 루트 사용자와 최종 사용자가 소유한 권한 없는 컨테이너 간에 보안상의 차이가 있습니까?

LXC: 루트 사용자와 최종 사용자가 소유한 권한 없는 컨테이너 간에 보안상의 차이가 있습니까?

나는 LXC 컨테이너를 사용하여 대부분의 네트워크 연결 서비스를 격리할 계획입니다.

제가 이해한 바로는 이 작업을 수행하는 두 가지 주요 방법이 있습니다.

  1. 루트가 소유한 권한 없는 컨테이너 만들기. 이 경우 루트에는 대규모 하위 UID 및 하위 GID 세트가 있으며 해당 범위의 다른 하위 세트는 각 컨테이너의 영향을 받습니다(어떤 컨테이너도 하위 UID 또는 하위 GID를 서로 공유하지 않습니다). ,

  2. 권한이 없는 시스템 계정이 소유한 권한이 없는 컨테이너 만들기. 이 경우 각 계정에는 컨테이너와 해당 컨테이너에 필요한 종속 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사용할 수 있는 외부 범위를 정의합니다. 이 파일은 newuidmapsetuid 루트에서 사용됩니다.

$ 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가 이 파일을 어떻게 사용하는지 잘 모르겠습니다.

관련 정보