Privilegiado versus root no Docker: qual é a diferença?
O Docker pode executar comandos como usuário root, se você quiser, mas também oferece um sinalizador semelhante chamado Privilegiado. No contexto de containers. no entanto, isso é muito diferente do uso de root e é importante entender as diferenças para proteger seus sistemas.
O que significa “ Root ” Mesmo significa?
A diferença entre um usuário dentro de um contêiner e um usuário fora de um contêiner se resume em como o Docker funciona nos bastidores. A tecnologia subjacente por trás do Docker são os namespaces do Linux, que conseguem isolamento no nível do kernel.
O conceito central é muito simples. Da perspectiva do host, um contêiner do Docker pode armazenar seus dados em / var / lib / docker / container /, mas porque o contêiner está em uma “ Mount ” separada; namespace, é apresentado como / e o contêiner não é nem um pouco inteligente. Existem vários tipos de namespaces, como o namespace de processo e IPC, o namespace de rede e o namespace de usuário. O Docker usa todos eles para fazer os contêineres funcionarem.
O Docker daemon é executado como root na máquina host, portanto, por padrão, todos os contêineres também são executados como root. O usuário root dentro do container é igual ao usuário root fora do container. Geralmente, esse não é um problema grave, porque ainda está isolado dos outros contêineres com todos os outros namespaces. Um processo executado como root no contêiner não será capaz de acessar arquivos fora de seu diretório preso.
Isso ainda o deixa aberto a ataques teóricos de escalonamento de privilégios, então muitas pessoas escolherão remapear o usuário root do contêiner com a sinalização --user configurando-o para ser executado como um usuário menos privilegiado na máquina host e negando qualquer tipo de acesso root. Passe um ID de usuário arbitrário e o Docker mapeará a raiz (ID 0) dentro do contêiner para o ID de usuário especificado:
docker run -it --user 4000 ubuntu sh
Claro, este usuário root ainda terá acesso total ao container e as melhores práticas gerais de segurança do Linux ainda se aplicam. Você deve configurar seus próprios usuários e executar seus aplicativos como faria em um sistema Linux normal. Isso mantém a superfície de ataque potencial baixa e, quando combinada com o remapeamento do usuário, significa que o contêiner não terá possibilidade de quebrar facilmente.
Privilegiado permite escape de contêiner
Privilegiado é diferente. É um sinalizador especial que você pode definir no tempo de execução especificamente para permitir que um contêiner do Docker se liberte de seus namespaces e acesse todo o sistema diretamente. Geralmente, esta é uma ideia muito ruim, pois permite que o código malicioso do contêiner faça coisas desagradáveis, como sobrescrever o host &’ s . ssh / authorized_keys ou excluir partições do disco.
Ele também anula o propósito de isolamento do contêiner, mas possui alguns casos de uso. Executar como privilegiado é o mesmo que executar um processo na máquina host, exceto que você obtém os benefícios organizacionais de poder ser executado em um contêiner. Se você estiver executando processos que precisam acessar o hardware diretamente na máquina, como dispositivos de rede, ou precisam ter acesso de leitura / gravação à partição raiz, você pode executá-los com privilégios para permitir isso. Outro caso de uso importante é o Docker no Docker, ou DinD, que é usado pelo Jenkins para permitir a construção de contêineres do Docker dentro do contêiner do Jenkins.
Como instalar e usar Jenkins para construir um pipeline de CI / CD
No entanto, para qualquer outra coisa, isso provavelmente é desnecessário e apenas apresenta mais riscos. Se você sabe o que está fazendo e gostaria de executar um contêiner como privilegiado, será necessário passar o sinalizador --privileged.
docker run -it --privileged ubuntu sh
A mesma funcionalidade está disponível para Kubernetes, usando securityContext:
spec: containers: - name: nginx image: nginx securityContext: privileged: true
Nenhum comentário