Andrey Kopylov , nosso diretor técnico, ama, usa e promove ativamente o Docker. Em um novo artigo, ele fala sobre como criar usuários no Docker. Corrija o trabalho com eles, por que os usuários não podem ter privilégios de root e como resolver o problema de incompatibilidade de identificador no Dockerfile.
Todos os processos no contêiner serão executados como raiz, a menos que especificado de uma maneira especial. Parece muito conveniente, porque este usuário não tem restrições. É por isso que trabalhar sob a raiz está errado do ponto de vista da segurança. Se no computador local ninguém em sã consciência trabalha com direitos de root, muitos iniciam processos sob a raiz em contêineres.
Sempre existem erros que permitem que o malware saia do contêiner e chegue ao computador host. Supondo o pior, devemos garantir que os processos sejam iniciados dentro do contêiner por um usuário que não tenha nenhum direito na máquina host.
Criação de Usuário
Criar um usuário em um contêiner não é diferente de criá-lo em distribuições Linux. No entanto, para diferentes imagens básicas, as equipes podem variar.
Para distribuições baseadas em debian no Dockerfile, você deve adicionar:
RUN groupadd --gid 2000 node \ && useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Para alpino:
RUN addgroup -g 2000 node \ && adduser -u 2000 -G node -s /bin/sh -D node
Iniciando processos do usuário
Para iniciar todos os processos subseqüentes de um usuário com o UID 2000, execute:
USER 2000
Para iniciar todos os processos subseqüentes a partir do nó do usuário, execute:
USER node
Mais detalhes na documentação .
Montar volumes
Ao montar volumes dentro de um contêiner, forneça ao usuário a capacidade de ler e / ou gravar arquivos. Para isso, o UID (GID) do usuário no contêiner e o usuário fora do contêiner que possui os direitos de acesso apropriados ao arquivo devem corresponder. Ao mesmo tempo, os nomes de usuário não importam.
Geralmente, em um computador Linux, o usuário UID e GID são 1000. Esses identificadores são atribuídos ao primeiro usuário do computador.
É fácil obter seus identificadores:
id
Você receberá informações abrangentes sobre seu usuário.
Substitua 2000 dos exemplos pelo seu identificador e tudo ficará bem.
Atribuir UID e GID do usuário
Se o usuário foi criado anteriormente, mas é necessário alterar os identificadores, você pode fazer o seguinte:
RUN usermod -u 1000 node \ && groupmod -g 1000 node
Se você estiver usando a imagem alpina básica, precisará instalar o pacote de sombra:
RUN apk add —no-cache shadow
Passando o ID do usuário dentro do contêiner ao criar a imagem
Se o seu identificador e os identificadores de todas as pessoas que trabalham no projeto forem os mesmos, especifique esse identificador no Dockerfile. No entanto, frequentemente os identificadores de usuários não correspondem.
Como realizar o desejado não é imediatamente claro. Para mim, foi o mais difícil no processo de dominar o docker. Muitos usuários do Docker não acham que há estágios diferentes na vida de uma imagem. Primeiro, a imagem é coletada para isso usando o Dockerfile. Ao iniciar um contêiner a partir de uma imagem do Dockerfile, ele não é mais usado.
A criação de usuários deve ocorrer ao criar a imagem. O mesmo se aplica à definição do usuário a partir da qual os processos são iniciados. Isso significa que devemos, de alguma forma, passar o UID (GID) para o contêiner.
As diretivas ENV e ARG são usadas para usar variáveis externas no Dockerfile. Uma comparação detalhada das diretivas está aqui .
Dockerfile
ARG UID=1000 ARG GID=1000 ENV UID=${UID} ENV GID=${GID} RUN usermod -u $UID node \ && groupmod -g $GID node
Você pode passar argumentos por meio do docker-compondo como este:
docker-compor
build: context: ./src/backend args: UID: 1000 GID: 1000
PS Para dominar todos os truques do docker, não basta ler a documentação ou os artigos. Você precisa praticar muito, sentir a janela de encaixe.