권한이 없는 Linux 컨테이너를 구성하는 방법은 무엇입니까?

권한이 없는 Linux 컨테이너를 구성하는 방법은 무엇입니까?

설정하려고 하는데권한이 없는 LXC 컨테이너그리고 매번 실패합니다. 나는 가이드의 모든 관련 단계를 따랐다고 생각합니다.

  • 일반 사용자는 권한이 없는 컨테이너를 만들 수 있습니다.

    $ sysctl kernel.unprivileged_userns_clone
    kernel.unprivileged_userns_clone = 1
    
  • 제어 그룹 PAM 모듈이 활성화되었습니다.

    $ grep -F pam_cgfs.so /etc/pam.d/system-login
    session optional pam_cgfs.so -c freezer,memory,name=systemd,unified
    
  • UID 및 GID 매핑을 설정합니다.

    $ cat /etc/lxc/default.conf
    lxc.idmap = u 0 100000 65536
    lxc.idmap = g 0 100000 65536
    lxc.net.0.type = veth
    lxc.net.0.link = lxcbr0
    lxc.net.0.flags = up
    lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
    $ cat /etc/subuid
    root:100000:65536
    $ cat /etc/subgid
    root:100000:65536
    
  • 네트워크가 설정되었습니다:

    $ grep --invert-match --regexp='^#' --regexp='^$' /etc/default/lxc-net
    USE_LXC_BRIDGE="true"
    LXC_BRIDGE="lxcbr0"
    LXC_ADDR="10.0.3.1"
    LXC_NETMASK="255.255.255.0"
    LXC_NETWORK="10.0.3.0/24"
    LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
    LXC_DHCP_MAX="253"
    
  • 서비스가 좋아 보입니다.

    $ systemctl status --lines=0 --no-pager lxc.service lxc-net.service 
    ● lxc.service - LXC Container Initialization and Autoboot Code
       Loaded: loaded (/usr/lib/systemd/system/lxc.service; disabled; vendor preset: disabled)
       Active: active (exited) since Fri 2019-03-08 15:31:47 NZDT; 40min ago
         Docs: man:lxc-autostart
               man:lxc
     Main PID: 4147 (code=exited, status=0/SUCCESS)
        Tasks: 0 (limit: 4915)
       Memory: 0B
       CGroup: /system.slice/lxc.service
    
    ● lxc-net.service - LXC network bridge setup
       Loaded: loaded (/usr/lib/systemd/system/lxc-net.service; enabled; vendor preset: disabled)
       Active: active (exited) since Fri 2019-03-08 15:31:45 NZDT; 40min ago
     Main PID: 4099 (code=exited, status=0/SUCCESS)
        Tasks: 1 (limit: 4915)
       Memory: 8.4M
       CGroup: /system.slice/lxc-net.service
               └─4121 dnsmasq -u dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsm…
    
  • 패키지가 최신 상태이고 방금 재부팅했습니다.

그럼에도 불구하고 컨테이너를 만들 수 없습니다.

$ lxc-create -n test -t download
lxc-create: test: parse.c: lxc_file_for_each_line_mmap: 100 No such file or directory - Failed to open file "/home/user/.config/lxc/default.conf"
lxc-create: test: conf.c: chown_mapped_root: 3179 No uid mapping for container root
lxc-create: test: lxccontainer.c: do_storage_create: 1310 Error chowning "/home/user/.local/share/lxc/test/rootfs" to container root
lxc-create: test: conf.c: suggest_default_idmap: 4801 You do not have subuids or subgids allocated
lxc-create: test: conf.c: suggest_default_idmap: 4802 Unprivileged containers require subuids and subgids
lxc-create: test: lxccontainer.c: do_lxcapi_create: 1891 Failed to create (none) storage for test
lxc-create: test: tools/lxc_create.c: main: 327 Failed to create container test

이 설정에 명백한 문제가 있습니까?~/.config/lxc/default.conf는 링크된 기사에 언급되지 않았으며 왜 할당된 subuid 및 subgid가 없다고 말하는지 이해할 수 없습니다.

추가 정보:

  • 루트로 실행하면 lxc-create작동하지만 이는 명시적으로 일반 사용자로 컨테이너를 생성하는 것에 관한 것입니다.
  • cp /etc/lxc/default.conf ~/.config/lxc/default.conf구성 파일에 대한 불만 사항을 제거하지만 다음 메시지가 표시됩니다.

    lxc-create: 재생 시간: conf.c: chown_mapped_root: 3279 lxc-usernsexec 실패: 해당 파일 또는 디렉터리 없음 - tty를 열 수 없음 해당 파일 또는 디렉터리 없음 - tt를 열 수 없음

답변1

이것은 새로운 프로젝트입니까, 아니면 옵션이 있습니까? LXC 대신 LXD를 사용하는 것은 어떨까요? 사용하기가 더 쉽고 동일한 목적을 달성할 수 있습니다. lxc를 사용하기 시작했는데 비특권 컨테이너를 실행하는 데 관심이 있어서 빠르게 전환했는데, 이는 LXC에서는 쉽지 않지만 LXD에서는 기본입니다.

시작하려면 여기를 살펴보세요. https://discuss.linuxcontainers.org/t/comparing-lxd-vs-lxc/24

마지막으로 설치/사용한 지 몇 달이 지났지만 설치 참고 사항은 다음과 같습니다.

LXD는 매우 빠르게 발전하고 있으므로 Ubuntu 사용자는 PPA를 사용하는 것이 좋습니다.

# add-apt-repository ppa:ubuntu-lxc/lxd-stable
# apt-get update
# apt-get dist-upgrade
# apt-get install lxd     

이 패키지는 로컬 Unix 소켓을 통해 lxd와 통신할 수 있는 모든 사용자를 포함하는 새로운 "lxd" 그룹을 생성합니다. "admin" 및 "sudoers" 그룹의 모든 구성원이 자동으로 추가됩니다. 사용자가 이러한 그룹 중 하나의 구성원이 아닌 경우 사용자를 그룹에 수동으로 추가해야 합니다 lxd .

그룹 멤버십은 로그인 시에만 적용되므로 사용자 세션을 닫았다가 다시 열거나 newgrp lxd lxd와 상호 작용하려는 쉘에서 명령을 사용해야 합니다.

newgrp lxd

https://blog.ubuntu.com/2015/03/20/installing-lxd-and-the-command-line-tool 2018/10/22


내가 아는 한, 가상 머신에서 LXD를 실행할 수도 있으므로 작업 중인 시스템을 엉망으로 만들지 않고도 빠르게 시험해 볼 수 있습니다.

귀하가 요청한 질문에 대한 정확한 답변은 아니지만 유용한 옵션이 되었기를 바랍니다.

답변2

이 게시물이 오래된 게시물이라는 것을 알고 있지만 최근에 동일한 문제가 발생하여 다음과 같은 구체적인 오류를 따라 해결했습니다.

lxc-create: my-container: conf.c: suggest_default_idmap: 4738 You must either run as root, or define uid mappings
lxc-create: my-container: conf.c: suggest_default_idmap: 4739 To pass uid mappings to lxc-create, you could create
lxc-create: my-container: conf.c: suggest_default_idmap: 4740 ~/.config/lxc/default.conf:
lxc-create: my-container: conf.c: suggest_default_idmap: 4741 lxc.include = /etc/lxc/default.conf
lxc-create: my-container: conf.c: suggest_default_idmap: 4742 lxc.idmap = u 0 100000 65536
lxc-create: my-container: conf.c: suggest_default_idmap: 4743 lxc.idmap = g 0 100000 65536
lxc-create: my-container: lxccontainer.c: do_lxcapi_create: 1869 Failed to create (none) storage for my-container
lxc-create: my-container: tools/lxc_create.c: main: 327 Failed to create container my-container

매우 간단한 수정 사항은 다음과 같습니다.

mkdir -p ~/.config/lxc
touch ~/.config/lxc/default.conf
echo "lxc.include = /etc/lxc/default.conf" >> ~/.config/lxc/default.conf
echo "lxc.idmap = u 0 100000 65536" >> ~/.config/lxc/default.conf
echo "lxc.idmap = g 0 100000 65536" >> ~/.config/lxc/default.conf

사용자 및 그룹 ID를 업데이트하는 것을 잊지 마세요.

또한 오류가 발생하는 경우 다음 사항에 유의하세요.

Setting up the GPG keyring
ERROR: Unable to fetch GPG key from keyserver

바로 이것 때문에:https://github.com/lxc/lxc/issues/3068

이 문제를 해결하려면 -- --keyserver hkp://p80.pool.sks-keyservers.net:80다음과 같이 create 명령 끝에 추가하면 됩니다.

lxc-create -t download -n my-container -- --keyserver hkp://p80.pool.sks-keyservers.net:80

이것이 당신에게 최소한 도움이 되지 않는다면, 이것이 다른 사람에게 도움이 되기를 바랍니다.

답변3

클래식 LXC 컨테이너 권한을 비권한으로 변환하는 간단한 스크립트를 작성했습니다.

루트 사용자에 대한 두 번째 UID - GID(subuid guid)를 설정합니다.

usermod --add-subuids 1258512-1324047 root
usermod --add-subgids 1258512-1324047 root

하위 설정을 위한 대체 매뉴얼(UID-GID):

echo "root:1258512:65536" >> /etc/subuid
echo "root:1258512:65536" >> /etc/subgid

권한이 없는 컨테이너 디렉터리에 대한 권한 설정 참고: 모든 UID 및 GID에는 루트 하위(uid-gid)의 오프셋이 추가되어 있습니다.

subUid=$(grep root /etc/subuid | cut -d: -f2 | head -1) for i in $(find /var/lib/lxc/nameofcontainer/ -print) do
        ## Get numeric owner of current file/dir
        actProp=$(stat -c '%u:%g' "$i")
        actPropUid=$(echo ${actProp} | cut -d: -f1)
        actPropGid=$(echo ${actProp} | cut -d: -f2)
        ## Calculed shifted owner
        newUid=$(( $actPropUid + $subUid ))
        newGid=$(( $actPropGid + $subUid ))
        ## set new owner
        if [ $actPropUid -lt 65536 ] ; then
                chown ${newUid}:${newGid} "$i"
        fi done 
chown ${subUid}:${subUid} /var/lib/lxc/nameofcontainer/

/var/lib/lxc/nameofcontainer/config에서 권한 없는 시작 옵션을 설정합니다:

echo "lxc.include = /usr/share/lxc/config/debian.userns.conf" >> /var/lib/lxc/${CT}/config
echo "lxc.idmap = u 0 $subUid 65536" >> /var/lib/lxc/${CT}/config
echo "lxc.idmap = g 0 $subUid 65536" >> /var/lib/lxc/${CT}/config

사용자 네임스페이스 활성화:

echo "kernel.unprivileged_userns_clone=1" > /etc/sysctl.d/80-lxc-userns.conf
sysctl --system

AppArmor LXC의 기본 구성을 업데이트합니다.

cat <<EOF >> /etc/lxc/default.conf
lxc.apparmor.allow_incomplete = 1
EOF

cgroup 커널 기능을 활성화합니다. /etc/default/grub을 편집합니다.

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

도착하다:

GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1 quiet"

자세한 내용은 다음과 같습니다. https://github.com/lucapicio/LXC_to_Unprivileged/blob/main/convert.sh

Readme 파일에서 필요한 모든 정보를 찾을 수 있습니다.

관련 정보