Usuário no Docker

Andrey Kopylov, nosso CTO, adora, usa e promove ativamente o Docker. Em um novo artigo, ele explica como criar usuários no Docker. Trabalho correto com eles, por que os usuários não devem ficar com direitos de root e como resolver o problema de indicadores incompatíveis no Dockerfile.

Todos os processos no contêiner serão executados como usuário root, a menos que você o especifique de uma maneira especial. Isto parece muito conveniente, porque este usuário não tem restrições. É por isso que trabalhar como root é errado do ponto de vista da segurança. Se ninguém em sã consciência trabalha no computador local com direitos de root, muitos executam processos sob root em contêineres.

Sempre há bugs que permitem que o malware escape do contêiner e entre no computador host. Supondo o pior, devemos garantir que os processos dentro do contêiner sejam executados por um usuário que não tenha quaisquer direitos na máquina host.

Criando um usuário

Criar um usuário em um contêiner não é diferente de criá-lo em distribuições Linux. No entanto, os comandos podem variar para diferentes imagens base.

Para distribuições baseadas em Debian, você precisa adicionar o seguinte ao Dockerfile:

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

Executando processos do usuário

Para executar todos os processos subsequentes como usuário com UID 2000, execute:

USER 2000

Para executar todos os processos subsequentes como usuário do nó, execute:

USER node

Mais em documentação.

Montando volumes

Ao montar volumes dentro de um contêiner, forneça ao usuário a capacidade de ler e/ou gravar arquivos. Para fazer isso, o UID (GID) do usuário no contêiner e o usuário fora do contêiner que possui as permissões apropriadas para acessar o arquivo devem corresponder. Neste caso, os nomes de usuário não importam.

Freqüentemente, em um computador Linux, o UID e o GID de um usuário são iguais a 1000. Esses identificadores são atribuídos ao primeiro usuário do computador.

Descobrir seus identificadores é fácil:

id

Você receberá informações abrangentes sobre seu usuário.
Substitua 2000 dos exemplos pelo seu identificador e tudo ficará bem.

Atribuindo um UID e GID a um usuário

Se o usuário foi criado anteriormente, mas você precisa alterar os identificadores, você pode fazer assim:

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Se você estiver usando a imagem base alpina, será necessário instalar o pacote shadow:

RUN apk add —no-cache shadow

Passando o ID do usuário dentro do contêiner ao construir a imagem

Se o seu ID e os IDs de todas as pessoas que trabalham no projeto corresponderem, basta especificar esse ID no Dockerfile. No entanto, muitas vezes os IDs de usuário não coincidem.

Como conseguir o que deseja não está imediatamente claro. Para mim, essa foi a parte mais difícil no processo de domínio do Docker. Muitos usuários do Docker não percebem que existem diferentes estágios na vida de uma imagem. Primeiro, a imagem é montada usando um Dockerfile. Ao executar um contêiner a partir de uma imagem, o Dockerfile não é mais usado.

A criação do usuário deve ocorrer quando a imagem é construída. O mesmo se aplica à determinação do usuário sob o qual os processos são iniciados. Isso significa que devemos de alguma forma passar o UID (GID) dentro do contêiner.

Diretivas são usadas para usar variáveis ​​externas no Dockerfile ENV и ARG. Comparação detalhada de diretivas 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 via docker-compose assim:

docker-compose

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

PS Para dominar todos os meandros do Docker, não basta ler a documentação ou os artigos. Você precisa praticar muito, precisa conhecer o Docker.

Fonte: habr.com

Adicionar um comentário