권한이 없는 LXC 컨테이너란 무엇입니까?

권한이 없는 LXC 컨테이너란 무엇입니까?

Linux 컨테이너(LXC 컨테이너)를 "권한 없음"이라고 하면 무슨 뜻인가요?

답변1

권한이 없는 LXC 컨테이너는 이를 악용하는 컨테이너입니다.사용자 네임스페이스(). 즉, 호스트의 UID 범위를 네임스페이스에 매핑할 수 있는 커널 함수입니다.~에UID 0을 가진 사용자가 다시 존재할 수 있습니다.

권한이 없는 LXC 컨테이너에 대한 나의 초기 생각과는 달리, 이것이 권한이 없는 호스트 사용자가 컨테이너를 소유해야 한다는 의미는 아닙니다. 이것은 단지 가능성일 뿐입니다.

관련 사항은 다음과 같습니다:

  1. 호스트 사용자에 대한 일련의 하위 UID 및 GID 정의( usermod [-v|-w|--add-sub-uids|--add-sub-gids])
  2. ...범위는 컨테이너 구성( lxc.id_map = ...) 에 매핑됩니다.

따라서 root호스트에 있는 컨테이너 프로세스의 유효 UID가 매핑에 의해 정의된 범위 내에 있게 되므로 권한 없는 컨테이너를 갖는 것도 가능합니다.

그러나 root먼저 슬레이브 ID를 정의해야 합니다. 을 통해 생성된 사용자와 달리 adduser하위 rootID 범위는 기본적으로 정의되지 않습니다.

또한 제공하는 전체 범위를 사용할 수 있으므로 다음 구성 줄을 사용하여 3개의 컨테이너를 가질 수 있습니다(UID 매핑만 표시).

  1. lxc.id_map = u 0 100000 100000
  2. lxc.id_map = u 0 200000 100000
  3. lxc.id_map = u 0 300000 100000

알아채다:댓글에 따르면 최신 버전에서는 lxc.idmap!

root100000에서 400000 사이의 종속 UID가 있다고 가정합니다 . 내가 찾은 모든 문서에서는 컨테이너당 65536개의 하위 ID를 사용하도록 권장하지만 일부는 사람이 더 쉽게 읽을 수 있도록 100000을 사용합니다.

즉, 모든 컨테이너에 동일한 범위를 할당할 필요는 없습니다.

40억(~ )개 이상의 슬레이브 ID가 가능하며 2^32, 이는 호스트 사용자에 대한 슬레이브 범위를 처리할 때 관대할 수 있음을 의미합니다.

루트가 소유하고 실행하는 권한 없는 컨테이너

다시 문지르세요. 권한이 없는 LXC 게스트는 호스트에서 권한이 없는 사용자가 실행할 필요가 없습니다.

다음과 같이 종속 UID/GID 매핑을 사용하여 컨테이너를 구성합니다.

lxc.id_map = u 0 100000 100000
lxc.id_map = g 0 100000 100000

root호스트의 사용자가 지정된 범위의 하위 ID를 갖고 있는 경우 게스트를 더 효과적으로 제한할 수 있습니다.

그러나 이 경우 중요한 추가 이점이 있습니다(예, 작동하는 것을 확인했습니다). 시스템 시작 시 컨테이너를 자동으로 시작할 수 있습니다.

LXC에 대한 정보를 웹에서 검색할 때 권한이 없는 LXC 게스트는 자동으로 시작할 수 없다는 메시지를 자주 듣게 됩니다. 그러나 기본적으로 이는 시스템 전체 컨테이너 저장소(일반적으로 와 같은 /var/lib/lxc) 에 없는 컨테이너에만 작동합니다 . 만약 그렇다면(보통 루트에 의해 생성되고 루트에 의해 시작되었음을 의미), 그것은 완전히 다른 이야기입니다.

lxc.start.auto = 1

컨테이너 구성에 넣으면 작업이 훌륭하게 수행됩니다.

올바른 권한 및 구성 얻기

나 자신도 이 문제에 약간의 어려움을 겪고 있어 여기에 섹션을 추가했습니다.

lxc.include일반적으로 이름 /usr/share/lxc/config/$distro.common.conf( $distro배포 이름이 있는 경우)으로 포함되는 구성 조각 외에도 시스템에 이 있는지 확인하여 포함해야 합니다 /usr/share/lxc/config/$distro.userns.conf. 예를 들어:

lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.include = /usr/share/lxc/config/ubuntu.userns.conf

슬레이브 ID 매핑을 추가로 추가합니다.

lxc.id_map = u 0 100000 65535
lxc.id_map = g 0 100000 65535

이는 호스트 UID 100000이root ~에LXC 게스트의 사용자 네임스페이스입니다.

이제 권한이 올바른지 확인하세요. 게스트 이름이 환경 변수에 저장된 경우 $lxcguest다음 명령을 실행합니다.

# Directory for the container
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest
chmod ug=rwX,o=rX $(lxc-config lxc.lxcpath)/$lxcguest
# Container config
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest/config
chmod u=rw,go=r $(lxc-config lxc.lxcpath)/$lxcguest/config
# Container rootfs
chown 100000:100000 $(lxc-config lxc.lxcpath)/$lxcguest/rootfs
chmod u=rwX,go=rX $(lxc-config lxc.lxcpath)/$lxcguest/rootfs

이렇게 하면 첫 번째 시도 후에 컨테이너를 실행할 수 있으며 이로 인해 일부 권한 관련 오류가 발생할 수 있습니다.

답변2

0xC0000022L(솔루션이 나에게 잘 맞았음)에 대한 후속 조치를 취하기 위해 다음을 작성했습니다.추가-uid-gid.plLXC 컨테이너 내에서 파일을 올바르게 매핑하기 위해 필요한 소유권 변경을 자동화하는 perl 스크립트입니다.

이것이 없으면 이 권장 설정을 사용하면 마스터 호스트의 0/root에 속하는 LXC 컨테이너 rootfs의 파일은 LXC 컨테이너 자체 내에서 65534/nobody에 매핑됩니다. LXC 컨테이너 내에서 0/root에 매핑되려면 호스트의 100000에 속해야 합니다.

여기에 설명되어 있습니다.https://yeupou.wordpress.com/2017/06/23/setting-up-lxc-containers-with-mapped-giduid/그리고 스크립트는 gitlab에서 직접 얻을 수 있습니다https://gitlab.com/yeupou/stalag13/blob/master/usr/local/bin/increase-uid-gid.pl

관련 정보