, nosso diretor técnico, adora, usa ativamente e promove o Docker. Em um novo artigo, ele explica como criar usuários no Docker. A maneira correta de trabalhar com eles, por que os usuários não devem ser deixados com permissões de root e como resolver o problema de incompatibilidade de indicadores no Dockerfile.
Todos os processos no contêiner rodarão sob o usuário root, a menos que especificado de forma especial. Isso parece muito conveniente, pois esse usuário não tem restrições. É por isso que operar como root é incorreto do ponto de vista da segurança. Se ninguém no computador local opera sob permissões de root, muitos iniciam processos como root em contêineres.
Sempre existem bugs que podem permitir que um malware escape do contêiner e acesse o computador host. Presumindo o pior, devemos garantir que os processos dentro do contêiner sejam executados por um usuário que não tenha permissões na máquina host.
Criando usuário
A criação de um usuário em um contêiner não é diferente do seu criação em distribuições Linux. No entanto, os comandos podem variar para diferentes imagens base.
Para distribuições baseadas em debian, é necessário adicionar ao Dockerfile:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home nodePara alpine:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Executando processos como usuário
Para executar todos os processos subsequentes como usuário com UID 2000, execute:
USER 2000Para executar todos os processos subsequentes como usuário node, execute:
USER nodeSaiba mais em .
Montagem de volumes
Ao montar volumes dentro do contêiner, assegure que o usuário tenha permissão para ler e (ou) escrever arquivos. Para isso, o UID (GID) do usuário no contêiner e o usuário fora do contêiner, que tem as permissões apropriadas para acessar o arquivo, devem corresponder. Os nomes de usuário não têm importância.
Frequentemente, em um computador Linux, o usuário tem UID e GID iguais a 1000. Esses identificadores são atribuídos ao primeiro usuário do computador.
Para descobrir seus identificadores, é simples:
idVocê receberá informações detalhadas sobre seu usuário.
Substitua 2000 pelos seus identificadores e tudo ficará bem.
Atribuição de UID e GID ao usuário
Se o usuário foi criado anteriormente, mas é necessário alterar os identificadores, isso pode ser feito assim:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Se você estiver usando uma imagem base alpine, é necessário instalar o pacote shadow:
RUN apk add --no-cache shadowTransmissão do identificador do usuário para dentro do contêiner ao construir a imagem
Se seu identificador e os identificadores de todas as pessoas que trabalham no projeto coincidem, basta especificar esse identificador no Dockerfile. No entanto, muitas vezes os identificadores dos usuários não coincidem.
Como realizar isso não é imediatamente claro. Para mim, foi a parte mais difícil no processo de aprender Docker. Muitos usuários do Docker não percebem que existem diferentes fases na vida da imagem. Primeiro, a imagem é construída para isso usa-se o Dockerfile. Ao iniciar um contêiner a partir da imagem, o Dockerfile já não é mais utilizado.
A criação de usuários deve ocorrer ao construir a imagem. O mesmo se aplica à definição do usuário sob o qual os processos são executados. Isso significa que de alguma forma devemos passar o UID (GID) para dentro do contêiner.
As diretivas para usar variáveis externas no Dockerfile são e . Comparação detalhada das diretivas .
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Passar argumentos através do docker-compose pode ser feito assim:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
P.S. Para aprender todos os segredos do Docker, não basta ler a documentação ou artigos. É necessário praticar muito, é preciso sentir o Docker.
Fonte: habr.com
