Criando o contêiner LXC sem privilégios (userns) do zero, migrando um contêiner privilegiado para ser não privilegiado

5

Como posso criar um contêiner LXC (1.0.3) privilegiado (a parte que conheço) e depois migrá-lo com êxito para ser executado sem privilégios? Ou seja, eu gostaria de debootstrap ou ajustar o modelo lxc-ubuntu (geralmente em /usr/share/lxc/templates ) para que isso funcione.

Veja por que estou fazendo esta pergunta. Se você olhar para o modelo lxc-ubuntu , perceberá:

# Detect use under userns (unsupported)
for arg in "$@"; do
    [ "$arg" = "--" ] && break
    if [ "$arg" = "--mapped-uid" -o "$arg" = "--mapped-gid" ]; then
        echo "This template can't be used for unprivileged containers." 1>&2
        echo "You may want to try the \"download\" template instead." 1>&2
        exit 1
    fi
done

Após o uso de LXC_MAPPED_GID e LXC_MAPPED_UID no modelo lxc-download referenciado, parece não haver nada particularmente especial. Na verdade, tudo o que isso faz é ajustar a propriedade do arquivo ( chgrp + chown ). Mas é possível que os atributos estendidos no modelo download já estejam bem ajustados para realizar qualquer "mágica" necessária.

Nos comentários para este post de Stéphane Graber Stéphane diz a um comentarista que

There’s no easy way to do that unfortunately, you’d need to update your container config to match that from an unprivileged container, move the container’s directory over to the unprivileged user you want it to run as, then use Serge’s uidshift program to change the ownership of all files.

... e para:

  • dê uma olhada no link para os pacotes criados para o download template
  • confira uidmapshift de aqui
    • Este programa parece ter aproximadamente lxc-usernsexec -m b:0:1000:1 -m b:1:190000:1 -- /bin/chown 1:1 $file , conforme explicado em lxc-usernsexec(1)

Mas não há mais referências.

Então, minha pergunta é: como posso usar um contêiner LXC comum (privilegiado) que criei (tendo root e todos) e migrá-lo para se tornar um contêiner sem privilégios? Se você não puder fornecer um script, seria ótimo saber quais pontos considerar e como eles afetam a capacidade de executar o contêiner LXC sem privilégios. Eu posso criar um script e prometer publicá-lo como uma resposta a essa pergunta se uma solução puder ser encontrada:)

Nota: Embora eu esteja usando o Ubuntu 14.04, esta é uma questão genérica .

    
por 0xC0000022L 02.05.2014 / 14:46

4 respostas

5

Eu estava fazendo algo muito semelhante, movendo as VMs do KVM para LXC sem privilégios.

Eu estava usando contêineres de sistema para isso (para que eles possam ser iniciados automaticamente na inicialização), mas com UID / GIDs mapeados (namespaces de usuário).

  1. edite / etc / subuid, subgid (mapeei o uid / gids 10M-100M para fazer o root e use 100K por container)
  2. para o primeiro contêiner, use u / gids 10000000-10099999 em / var / lib / lxc / CTNAME / config
  3. monte o armazenamento do contêiner em / var / lib / lxc / CTNAME / rootfs (ou não faça nada se você não usar volume / conjunto de dados / o que for separado por contêiner)
  4. chown 10000000: 10000000 / var / lib / lxc / CTNAME / rootfs
  5. setfacl -m u: 10000000: x / var / lib / lxc (ou simplesmente chmod o + x / var / lib / lxc)
  6. lxc-usernsexec -m b: 0: 10000000: 100000 - / bin / bash

Agora você está no primeiro namespace de usuário do contêiner. Tudo é o mesmo, mas seu processo acha que é uid é 0, quando na verdade, no namespace host é uid 10000000. Verifique / proc / self / uid_map para ver se o seu uid está mapeado ou não. Você notará que não pode mais ler / root e parece ser de propriedade de nobody / nogroup.

Enquanto no namespace de usuário, eu rsync do host original.

Fora do namespace do usuário, você verá que os arquivos em / var / lib / lxc / CTNAME / rootfs agora são de propriedade não dos esperados (mesmos) uids da instalação de origem, mas 10000000 + remote_uid. É isso que você quer.

É isso. Quando você tiver seus dados sincronizados, remova tudo do arquivo / etc / fstab do contêiner para que ele não tente montar as coisas, e isso deve começar. Pode haver outras coisas para mudar, verifique o que o modelo LXC para a distro conteinerizada faz. Você pode definitivamente remover o kernel, grub, ntp e qualquer pacote de testes de hardware no container (você não precisa nem executá-lo, você pode chroot para o container a partir do namespace do usuário)

Se você não tiver uma VM remota em execução, também poderá montar o armazenamento da VM original no namespace do host e o rsync / SSH novamente no host local. O efeito será o mesmo.

Se você (como parece) simplesmente deseja alterar seu contêiner privilegiado para sem privilégio, é melhor adicionar o mapeamento uid / gid, adicionar um mapeamento como acima à sua configuração de contêiner e, em seguida, fazer algo como:

for i in 'seq 0 65535'; do
  find /var/lib/lxc/CTNAME/rootfs -uid $i -exec chown $((10000000+i)) \{\} \;
  find /var/lib/lxc/CTNAME/rootfs -gid $i -exec chgrp $((10000000+i)) \{\} \;
done

Isso deve ser tudo o que precisa ser feito, agora você deve ser capaz de executar o container sem privilégios. Este exemplo acima é extremamente ineficiente, o uidshift provavelmente fará um trabalho melhor nisso (mas ainda não o usei).

HTH.

    
por 24.05.2014 / 17:16
3

Eu queria avisar que o código de exemplo do Borut Mrak vai mudar a propriedade dos arquivos no sistema host, assim como quando links simbólicos apontam para esses arquivos no container! Não é o que você gostaria de ter!

Você deve usar o sinalizador -h para chown / chgrp e / ou -mount para encontrar caso você tenha um sistema de arquivos dedicado.

Aqui está minha versão mais rápida e inteligente:

find "/var/lib/lxc/$name/rootfs" -mount -uid '-65536' -printf '%U\n'|sort -n|uniq|while read i; do
        find "/var/lib/lxc/$name/rootfs" -mount -uid "$i" -exec chown -h "$((200000+i))" \{\} \;
done

find "/var/lib/lxc/$name/rootfs" -mount -gid '-65536' -printf '%G\n'|sort -n|uniq|while read i; do
        find "/var/lib/lxc/$name/rootfs" -mount -gid "$i" -exec chgrp -h "$((200000+i))" \{\} \;
done
    
por 19.09.2015 / 19:55
1

O Alpine Linux agora usa uidmapshift convertido em lua para converter contêineres privilegiados para sem privilégios . Dê uma olhada no initd script para ver as outras permissões de pasta & ; requisitos que são definidos / criados. ( /etc/subuid e /etc/subgid )

    
por 16.09.2016 / 00:00
0

para recipiente de palhaçada

SUBUID_OFFSET=-65536
SUBGID_OFFSET=-65536
cd rootfs || exit 1
find .|while read i; do SUBUID=$(stat --format=%u $i); SUBGID=$(stat --format=%g $i); NEW_SUBUID=$((SUBUID+SUBUID_OFFSET)); NEW_SUBGID=$((SUBGID+SUBGID_OFFSET)); echo "chown -h $NEW_SUBUID.$NEW_SUBGID $i"; done

para migrar o sistema linux

SUBUID=100000
SUBGID=100000
cd rootfs || exit 1
find .|while read i; do CURRENT_UID=$(stat --format=%u $i); CURRENT_GID=$(stat --format=%g $i); NEW_SUBUID=$((CURRENT_UID+SUBUID)); NEW_SUBGID=$((CURRENT_GID+SUBGID)); echo "chown -h $NEW_SUBUID.$NEW_SUBGID $i"; done
    
por 29.01.2018 / 02:12