Permissões de usuário dentro e fora dos contêineres LXC?

25

Estou executando alguns serviços dentro dos contêineres do Docker LXC no meu servidor e estou começando a fazer coisas sérias com eles.

Uma coisa que não estou claro é como as permissões de usuário funcionam dentro e fora do contêiner. Se, por exemplo, eu estiver executando o MySQL em um contêiner e tiver seu diretório de dados configurado como /data , que é um volume do Docker, como as permissões dentro e fora do contêiner afetam as políticas de acesso?

Obviamente, a idéia é executar o MySQL como seu próprio usuário no container (ie mysql:mysql ) e dar a ele direitos de leitura e gravação para aquele diretório. Suponho que isso seria bastante simples, apenas chmod ing do diretório, etc. Mas como isso funciona fora do contêiner? Agora que tenho esse volume compartilhado do Docker chamado 'data', como gerencio o controle de acesso?

Eu estou especificamente procurando ser capaz de rodar um usuário não privilegiado fora do contêiner do Docker que acessará periodicamente o volume compartilhado do MySQL e faça o backup dos dados.

Como posso configurar permissões, usuários e grupos para que um usuário específico no host possa ler / gravar arquivos e pastas no volume compartilhado do Docker?

    
por Naftuli Kay 04.04.2014 / 05:02

1 resposta

19

Desde que o lançamento do 0.9 Docker caiu LXC e usa seu próprio ambiente de execução, libcontainer . Sua pergunta é um pouco antiga, mas acho que minha resposta ainda se aplica à versão que você está usando.

Resposta rápida: Para entender as permissões de volumes, você pode fazer a analogia de mount --bind Host-Dir Container-Dir . Então, para cumprir sua exigência, você pode usar qualquer método tradicional para gerenciar permissões. Eu acho que o ACL é o que você precisa .

Longa resposta: Assim como no seu exemplo, temos um contêiner chamado dock com um volume /data .

docker run -tid --name dock -v /usr/container/Databases/:/data \
    centos:latest /bin/bash

Dentro do container nosso servidor MySQL foi configurado para usar o /data como seu diretório de dados. Portanto, temos nossos bancos de dados no /data dentro do contêiner. E fora do contêiner no sistema operacional host, montamos esse /data volume de /usr/container/Databases/ e atribuímos um usuário normal bob para fazer backups dos bancos de dados. A partir da máquina host, configuraremos as ACLs para o usuário bob .

useradd -u 3000 bob
usermod -R o=--- /usr/container/Databases/
setfacl -R -m u:bob:rwx /usr/container/Databases/
setfacl -R -d -m u:bob:rwx /usr/container/Databases/

Para testar, vamos fazer um backup com o usuário bob .

su - bob
tar -cvf container-data.tar /usr/container/Databases/

E o tar será listado e você poderá ver que nosso usuário conseguiu acessar todos os arquivos.

Agora, de dentro do container, se você verificar com getfacl , você notará que em vez de bob ele mostra 3000. Isso ocorre porque o UID de bob é 3000 e não existe esse usuário no contêiner, para exibir simplesmente o UID que recebe dos metadados. Agora, se você criar um usuário em seu contêiner com useradd -u 3000 bob , você notará que agora o getfacl mostra o nome bob em vez de 3.000.

Resumo : as permissões de usuário que você atribui de dentro ou de fora do contêiner são refletidas nos dois ambientes. Portanto, para gerenciar as permissões de volumes, os UIDs na máquina host devem ser diferentes dos UIDs no container .

    
por 06.09.2014 / 16:06