Linux 컨테이너(LXC 컨테이너)를 "권한 없음"이라고 하면 무슨 뜻인가요?
답변1
권한이 없는 LXC 컨테이너는 이를 악용하는 컨테이너입니다.사용자 네임스페이스(사용자 이름). 즉, 호스트의 UID 범위를 네임스페이스에 매핑할 수 있는 커널 함수입니다.~에UID 0을 가진 사용자가 다시 존재할 수 있습니다.
권한이 없는 LXC 컨테이너에 대한 나의 초기 생각과는 달리, 이것이 권한이 없는 호스트 사용자가 컨테이너를 소유해야 한다는 의미는 아닙니다. 이것은 단지 가능성일 뿐입니다.
관련 사항은 다음과 같습니다:
- 호스트 사용자에 대한 일련의 하위 UID 및 GID 정의(
usermod [-v|-w|--add-sub-uids|--add-sub-gids]
) - ...범위는 컨테이너 구성(
lxc.id_map = ...
) 에 매핑됩니다.
따라서 root
호스트에 있는 컨테이너 프로세스의 유효 UID가 매핑에 의해 정의된 범위 내에 있게 되므로 권한 없는 컨테이너를 갖는 것도 가능합니다.
그러나 root
먼저 슬레이브 ID를 정의해야 합니다. 을 통해 생성된 사용자와 달리 adduser
하위 root
ID 범위는 기본적으로 정의되지 않습니다.
또한 제공하는 전체 범위를 사용할 수 있으므로 다음 구성 줄을 사용하여 3개의 컨테이너를 가질 수 있습니다(UID 매핑만 표시).
lxc.id_map = u 0 100000 100000
lxc.id_map = u 0 200000 100000
lxc.id_map = u 0 300000 100000
알아채다:댓글에 따르면 최신 버전에서는 lxc.idmap
!
root
100000에서 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