Como conceder privilégios granulares a utilizadores não-root no Docker

DockerBeginner
Pratique Agora

Introdução

Docker é uma poderosa plataforma de contentores que revolucionou a forma como aplicações são desenvolvidas, implantadas e geridas. No entanto, executar contentores Docker como utilizador root pode apresentar riscos de segurança. Este tutorial irá guiá-lo através do processo de concessão de privilégios granulares a utilizadores não-root no Docker, permitindo-lhes executar tarefas específicas sem comprometer a segurança geral do sistema.

Compreendendo os Privilégios de Utilizador no Docker

Os contentores Docker são projetados para executarem como utilizadores não privilegiados por padrão, o que ajuda a melhorar a segurança geral do sistema. No entanto, pode haver cenários em que é necessário conceder permissões granulares a utilizadores não-root dentro de um contendor Docker para executar tarefas específicas.

Privilégios de Utilizador Padrão no Docker

Por padrão, os contentores Docker executam como o utilizador root, que possui o nível mais elevado de privilégios dentro do contendor. Isto pode ser um risco de segurança, pois quaisquer vulnerabilidades ou atividades maliciosas dentro do contendor podem potencialmente afetar o sistema hospedeiro.

Para mitigar este risco, o Docker recomenda executar contentores como utilizadores não-root. Pode fazer isto especificando um utilizador no Dockerfile ou utilizando a flag --user ao executar um contendor.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
USER myuser
## Executar o contendor como utilizador não-root
docker run -it --user myuser ubuntu:22.04 bash

Compreendendo os Espaços de Nomes de Utilizador

O Docker utiliza espaços de nomes de utilizador para fornecer uma camada adicional de isolamento e segurança para utilizadores não-root dentro de um contendor. Os espaços de nomes de utilizador permitem mapear IDs de utilizador e grupo do contendor para IDs diferentes no sistema hospedeiro, criando efetivamente um espaço de utilizador separado para o contendor.

graph TD A[Sistema Hospedeiro] --> B[Contendor] B[Contendor] --> C[ID de Utilizador Mapeado] B[Contendor] --> D[ID de Grupo Mapeado]

Este mapeamento garante que, mesmo que um utilizador não-root dentro do contendor tenha altos privilégios, ele não pode afetar o sistema hospedeiro ou outros contentores que estejam a executar no mesmo hospedeiro.

Verificando os Privilégios de Utilizador

Pode utilizar o comando id dentro do contendor para verificar os IDs de utilizador e grupo aos quais o utilizador atual foi mapeado:

$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lxd),128(systemd-journal),129(systemd-journal-gateway)

Esta saída mostra que o utilizador myuser foi mapeado para um ID de utilizador de 1000 e um ID de grupo de 1000 dentro do contendor.

Atribuindo Permissões Granulares a Utilizadores Não-Root

Embora executar contentores como utilizadores não-root seja uma boa prática de segurança, pode haver casos em que é necessário conceder permissões específicas a estes utilizadores para executar determinadas tarefas. O Docker fornece várias formas de atribuir permissões granulares a utilizadores não-root dentro de um contendor.

Utilizando as Flags --cap-add e --cap-drop

O Docker suporta o uso de capacidades Linux, que permitem conceder ou revogar privilégios específicos a um utilizador ou processo. Pode utilizar as flags --cap-add e --cap-drop ao executar um contendor para adicionar ou remover capacidades para o utilizador não-root.

## Conceder a capacidade "CAP_SYS_ADMIN" ao utilizador não-root
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

## Remover a capacidade "CAP_CHOWN" do utilizador não-root
docker run -it --user myuser --cap-drop=CHOWN ubuntu:22.04 bash

Montando Volumes com Permissões Específicas

Também pode conceder permissões granulares a utilizadores não-root montando volumes com propriedade e permissões específicas. Isto permite controlar os direitos de acesso do utilizador não-root dentro do contendor.

## Montar um volume com permissões específicas
docker run -it --user myuser -v /path/on/host:/path/in/container:rw,uid=1000,gid=1000 ubuntu:22.04 bash

Neste exemplo, o volume montado é acessível pelo utilizador não-root com um ID de utilizador de 1000 e um ID de grupo de 1000.

Utilizando a Flag --group-add

Se o utilizador não-root precisar de executar tarefas que exijam a pertença a grupos específicos, pode utilizar a flag --group-add para adicionar o utilizador a grupos adicionais dentro do contendor.

## Adicionar o utilizador não-root ao grupo "docker"
docker run -it --user myuser --group-add docker ubuntu:22.04 bash

Isto permite que o utilizador não-root execute tarefas que exigem a pertença ao grupo "docker", como interagir com o daemon do Docker.

Personalizando o Dockerfile

Também pode personalizar o Dockerfile para criar um utilizador não-root com permissões e pertenças a grupos específicos. Isto garante que o utilizador não-root tenha as permissões necessárias para executar as suas tarefas dentro do contendor.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

Este Dockerfile cria um utilizador não-root chamado myuser e adiciona-o ao grupo "docker", permitindo-lhe interagir com o daemon do Docker.

Casos de Uso e Exemplos Práticos

Atribuir permissões granulares a utilizadores não-root no Docker pode ser benéfico numa variedade de cenários. Apresentam-se aqui alguns casos de uso e exemplos práticos:

Cenário 1: Executando um Servidor Web

Suponha que tem uma aplicação web a executar num contendor Docker e pretende que o utilizador não-root tenha as permissões necessárias para iniciar e gerir o processo do servidor web.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN apt-get update && apt-get install -y nginx
RUN chown -R myuser:myuser /var/www/html
USER myuser
CMD ["nginx", "-g", "daemon off;"]

Neste exemplo, o utilizador não-root myuser recebe a propriedade do diretório /var/www/html, que é o local predefinido para o servidor web Nginx. Isto permite que o utilizador não-root inicie e gere o processo Nginx dentro do contendor.

Cenário 2: Aceder a Ficheiros Sensíveis

Se o seu contendor precisar de aceder a ficheiros ou diretórios sensíveis, pode conceder ao utilizador não-root as permissões necessárias para ler ou escrever nesses locais.

## Executar o contendor com permissões de volume específicas
docker run -it --user myuser -v /path/to/sensitive/files:/sensitive:rw,uid=1000,gid=1000 ubuntu:22.04 bash

Neste exemplo, o utilizador não-root com um ID de utilizador de 1000 e um ID de grupo de 1000 recebe permissão de leitura e escrita para o diretório /path/to/sensitive/files dentro do contendor.

Cenário 3: Interagir com o Daemon do Docker

Se o seu utilizador não-root precisar de interagir com o daemon do Docker, pode adicioná-lo ao grupo "docker" dentro do contendor.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

Este Dockerfile cria um utilizador não-root chamado myuser e adiciona-o ao grupo "docker", permitindo-lhe executar tarefas relacionadas com o Docker, como construir e gerir contentores.

Cenário 4: Executar Comandos com Privilégios

Em alguns casos, o seu utilizador não-root pode precisar de executar comandos com privilégios que exigem capacidades específicas. Pode utilizar a flag --cap-add para conceder as capacidades necessárias ao utilizador não-root.

## Executar o contendor com capacidade específica
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

Neste exemplo, o utilizador não-root recebe a capacidade "CAP_SYS_ADMIN", que lhe permite executar tarefas de administração do sistema que exigem privilégios elevados.

Compreendendo estes casos de uso e exemplos práticos, pode atribuir eficazmente permissões granulares a utilizadores não-root no Docker, garantindo que eles têm o acesso necessário para executar as suas tarefas, mantendo um ambiente seguro e isolado.

Resumo

Neste tutorial abrangente sobre Docker, aprenderá a atribuir permissões granulares a utilizadores não-root, permitindo-lhes interagir com contentores e recursos Docker sem elevar os seus privilégios. Compreendendo os princípios dos privilégios de utilizador no Docker e explorando casos de uso práticos, poderá implementar um ambiente Docker mais seguro e eficiente, adaptado às necessidades da sua organização.