USER

A instrução USER em um Dockerfile é usada para especificar o usuário sob o qual os comandos subsequentes serão executados no contêiner. Isso é importante para segurança, pois a execução de processos como o usuário root (o padrão) pode expor o sistema a riscos. Definir um usuário não-root ajuda a minimizar os privilégios e limitar o impacto potencial de falhas de segurança.

Sintaxe Básica

USER <usuário>[:<grupo>]
  • usuário: O nome ou o ID do usuário que será usado.

  • grupo (opcional): O nome ou o ID do grupo ao qual o usuário pertence. Se não for especificado, o grupo principal do usuário será usado.

Funcionalidades do USER

  • Segurança: Executar processos com um usuário de privilégios limitados é uma prática recomendada para reduzir riscos de segurança.

  • Personalização: Você pode criar e configurar usuários específicos para diferentes tarefas no contêiner, ajustando permissões conforme necessário.

Exemplos de Uso

Usando um Usuário Não-Root Existente

FROM ubuntu:20.04
USER nobody

Neste exemplo, todos os comandos subsequentes serão executados pelo usuário nobody, que é um usuário padrão de baixíssimo privilégio em sistemas Unix.

Especificando Usuário e Grupo

FROM ubuntu:20.04
USER www-data:www-data

Aqui, o contêiner executará comandos como o usuário www-data do grupo www-data, comum em servidores web como Apache e NGINX.

Criando e Usando um Novo Usuário

Neste exemplo:

  • Um novo grupo meugrupo é criado.

  • Um novo usuário meuusuario é adicionado e associado ao grupo meugrupo.

  • Os comandos subsequentes serão executados pelo usuário meuusuario.

Considerações de Segurança

  • Evitar o Uso de Root: Sempre que possível, evite usar o usuário root, especialmente para serviços de longa duração ou expostos ao público. Executar contêineres com privilégios de root aumenta o risco de uma falha de segurança comprometer o sistema host.

  • Privilégios Mínimos: Aplique o princípio do menor privilégio. O usuário definido pelo USER deve ter apenas as permissões necessárias para executar a aplicação, minimizando os riscos em caso de comprometimento.

Impacto no Dockerfile

  • Instruções Sucessivas: Após definir USER, todas as instruções seguintes (como RUN, CMD, ENTRYPOINT) serão executadas sob esse usuário, até que o USER seja alterado novamente, se necessário.

  • Permissões de Arquivos: Se você definir um usuário não-root antes de operações de cópia de arquivos (COPY, ADD), certifique-se de que o usuário tenha as permissões necessárias para acessar e modificar esses arquivos.

Exemplo Avançado

Configuração de um Contêiner para um Serviço Web

Neste exemplo:

  • Um usuário nginxuser e um grupo nginxgroup são criados.

  • O contêiner executa o NGINX como nginxuser.

  • Os arquivos da aplicação são copiados com as permissões corretas.

Resumo

  • USER define o usuário sob o qual os comandos subsequentes serão executados, aumentando a segurança e controlando os privilégios.

  • Evitar Root: Execute processos com um usuário não-root sempre que possível para minimizar riscos de segurança.

  • Flexibilidade: Você pode definir e configurar usuários e grupos específicos para diferentes necessidades dentro do contêiner.

Laboratório

Na execução do container, o usuário logado é o root que é o super-usuário da distribuição Linux.

Boa prática: criar um usuário para a execução do container

Criação e definição do usuário

A ordem no Dockerfile é importante, pois em determinados pontos estão sendo executados comandos de atualização, instalação etc.

USER marcelo altera o usuário logado

useradd não adiciona uma camada ao filesystem, mas é utilizado como metadado:

COPY com definição do usuário criado

Last updated