GIDs / UIDs subordinados com LXC e usuários para usuários não privilegiados?

6

Ao usar userns (via LXC no meu caso), você atribui um intervalo de GIDs e UIDs subordinados a um usuário não privilegiado. Veja para recursos: subuid(5) , subgid(5) , newuidmap(1) , newgidmap(1) , user_namespaces(7) .

Esse intervalo pode ser usado e, por meio das , será mapeado para a conta do sistema.

Vamos supor que temos uma conta de sistema (host) john com um UID (e GID) de 1000. A faixa atribuído de GIDs e UIDs é 100000..165536.

Portanto, existe uma entrada em /etc/subgid e /etc/subuid , respectivamente:

john:100000:65536

Os arquivos que dentro do recipiente sem privilégios são de propriedade do "interior" john será agora propriedade de 101000 no host e aqueles de propriedade do "interior" root serão de propriedade da 100000.

Normalmente, esses intervalos não são atribuídos a nenhum nome no host.

Perguntas:

  1. está tudo bem criar um usuário para os respectivos UIDs / GIDs no host para ter uma saída mais significativa para ls e amigos?
  2. existe uma maneira de tornar esses arquivos / pastas acessíveis ao usuário do host que "possui" os usuários, ou seja, john no nosso caso? E se assim for, é o único método sensato para criar um grupo compartilhado entre os usuários válidos dentro do intervalo subordinado e o userns "owner" e definir as permissões de acordo? Bem, ou ACLs, obviamente.
por 0xC0000022L 22.12.2014 / 00:30

1 resposta

1

  1. Is it alright to create a user for those respective UIDs/GIDs on the host in order to have a more meaningful output for ls and friends?

Sim, está tudo bem. No entanto, você deve garantir que esse usuário não tenha nenhum direito sobre qualquer coisa no sistema host:

  • Acesso ou senha desativados,
  • Nenhum shell de login utilizável,
  • Não há diretório inicial gravável.

Certifique-se também de não criar duplicatas nos seus nomes de usuário.

Aqui está um exemplo de script, pegando os arquivos /etc/passwd e /etc/group do convidado para criar os usuários correspondentes no sistema host. Todos os nomes são prefixados com o nome do contêiner e todos os IDs são aumentados usando o valor fornecido para corresponder aos UIDs do contêiner:

#! /bin/sh

# Path to guest's '/etc' directory.
guest_etc=/var/lib/lxc/mycontainer/rootfs/etc
# Guest's name, used as login prefix and inside GECOS field.
guest_name=mycontainer
# Increment to be applied to UIDs and GIDs (= range start).
uid_incr=100000
gid_incr=$uid_incr

guest_passwd=${guest_etc}/passwd
guest_group=${guest_etc}/group

exec <$guest_group
while IFS=":" read name pass gid null; do
    gid_new=$( expr $gid + $gid_incr )
    if ! getent group $gid_new >/dev/null; then
        addgroup --system --gid $gid_new "${guest_name}_${name}"
    fi  
done

exec <$guest_passwd
while IFS=":" read login pass uid gid gecos null; do
    uid_new=$( expr $uid + $uid_incr )
    gid_new=$( expr $gid + $gid_incr )
    if ! getent passwd $uid_new >/dev/null; then
        adduser --system --home /nonexistent --no-create-home \
            --shell /bin/nologin --uid $uid_new --gid $gid_new \
            --gecos "\"$guest_name container user (${gecos})\"" \
            "${guest_name}_${login}"
    fi  
done

Os avisos sobre o diretório inicial inacessível são normais e esperados: este é o objetivo real de /nonexistent de não existir.

  1. is there a way to make those files/folder accessible to the host user who "owns" the userns, i.e. john in our case? And if so, is the only sensible method to create a group shared between those valid users inside the subordinate range and and the userns "owner" and set the permissions accordingly? Well, or ACLs, obviously.

Isso deve valer uma pergunta separada da IMO.

Como o conteúdo do contêiner é de propriedade de diferentes UIDs que o UID do proprietário do contêiner, ele não é acessível a ele. Posso imaginar uma exceção a essa regra para subusuários, mas atualmente não tenho conhecimento de nenhuma (criei uma pergunta relacionada há pouco tempo, mas ainda sem respostas).

Os arquivos /etc/subuid e /etc/subgid são atualmente usados apenas por newuidmap (1) para permitir ou negar a alternância de um UID / GID para outro de um determinado processo. Não dá ao proprietário do intervalo qualquer outro direito.

Portanto, a solução para esse problema deve ser projetada caso a caso. Cuidado com a sua idéia de ACL: digamos que você coloque algumas ACLs nos arquivos do contêiner para permitir que o UID 1000 do seu host as leia, isso significa que o usuário do contêiner com o contêiner UID 1000 também terá o mesmo nível de privilégio ...

    
por 24.03.2016 / 16:31