‫Tudo certo. Sabemos que não devemos executar como root no contêiner.
‫Mas, fora do contêiner, a raiz no contêiner, a
‫propósito, não tem acesso direto a nada no host,
‫certo. Só porque você está
‫enraizado em um contêiner, você ainda está preso lá.
‫Mas, se você
‫quiser passar para o próximo nível, em que se o usuário ainda tiver
‫raiz no contêiner, deseja ir para o
‫host, porque existe um núcleo de vulnerabilidade
‫como falamos, como Cow sujo ou outra vulnerabilidade no Docker
‫ou alguma coisa.
‫Em seguida, a próxima etapa que você executa aqui é ativar os namespaces do
‫usuário, que não são ativados por padrão.
‫Eu tenho um link aqui que leva a um artigo de
‫blog que fala tudo sobre isso.
‫Basicamente, é uma configuração por host que você define na configuração
‫do Docker. O JSON do Docker.
‫Ele informa ao Docker que sempre que ele cria um
‫novo contêiner para executá-lo
‫como um usuário não raiz no host.
‫Portanto, basicamente existem alguns programas
‫lá, containerd e runC, que são outros programas que o
‫Docker usa para iniciar seu contêiner.
‫Por padrão, esses são executados como raiz.
‫Um recurso que o Docker possui é ativar os espaços
‫de nome de usuário, o que
‫significa que, à medida que o Docker cria esses contêineres, eles não
‫serão gerados como um subprocesso que está executando como root, como o Docker.
‫Irá gerá-los como um usuário de grande número.
‫Uma espécie de, não necessariamente um usuário aleatório, mas um usuário
‫de alto nível.
‫Isso significa que, se esse contêiner
‫tiver alguma vulnerabilidade de segurança na qual
‫o usuário possa escapar do contêiner, ainda haverá apenas um
‫usuário no host. Porque é isso que eles estarão
‫agindo como o usuário que o processo que está executando esse contêiner
‫está usando. O runC essencialmente.
‫O programa runC é o que inicia esse contêiner e
‫ele estará sendo executado como um usuário de grande
‫número, não como root. Esse usuário realmente não
‫tem privilégios fora desse contêiner. Portanto, esse recurso é
‫uma configuração por host, não por contêiner e nem
‫tudo funciona nos espaços de nome do usuário.
‫Você só vai ter que tentar praticar.
‫Você precisará habilitá-lo em alguns servidores, tente seus aplicativos
‫nesse servidor e veja se eles funcionam.
‫Caso contrário, você precisará segmentar
‫sua arquitetura. Sempre que implemento espaços
‫de nome de usuário em um cluster, normalmente temos nós de trabalho específicos que
‫têm os espaços de nome de usuário ativados.
‫É aí que os programas executados que podem suportá-lo, que
‫trabalham com ele.
‫Todo o resto precisa ser executado em servidores Docker regulares
‫em outro lugar. É assim que segmentamos.
‫Nós segmentamos em duas classes de servidores.
‫Você sabe, como se estivesse executando uma DMZ, o que
‫eu faria seria executar, permitiria, na DMZ, todos os
‫namespaces de usuário, em todos os servidores e,
‫em seguida, os contêineres executados teria que haver, teria que suportar
‫namespaces de usuário.
‫Você não pode procurar aplicativos e descobrir se eles oferecem suporte
‫a namespaces de usuário.
‫É um... namespaces de usuário não é necessariamente
‫um recurso específico do Docker. Essencialmente, significa que seu contêiner
‫está sendo executado em um espaço para nome e
‫agora o aplicativo que está executando esse contêiner também está bloqueado
‫um pouco.
‫Nem tudo pode suportar isso. Você só
‫precisa praticar ou talvez fazer alguma pesquisa
‫para ver se outras pessoas conseguiram
‫fazê-lo funcionar lá embaixo. Você sabe, para coisas comuns como
‫MySQL e coisas assim. Mas, obviamente, para
‫os seus próprios programas que você está desenvolvendo, você precisará testá-los
‫para ver se eles funcionarão. Eu diria que a maioria
‫dos programas e idiomas comuns que eu corro, eles funcionam muito
‫bem nos espaços de nomes de usuário. O problema real com
‫os espaços de nome de usuário é quando você tem um
‫aplicativo que precisa gravar em volumes ou vincular montagens,
‫que talvez tenha uploads de arquivos do usuário e
‫que esteja compartilhando-os em vários contêineres diferentes. É aí que os namespaces de usuário não são impossíveis.
‫Isso fica um pouco complicado porque os arquivos que
‫agora estão gravados no disco do host estão sendo gravados
‫como um usuário diferente.
‫Porque esse processo no host que está gerenciando o
‫contêiner é um usuário diferente.
‫Então, você verá diferentes IDs de usuário nesses arquivos e
‫precisará lidar com isso.
‫Há permissões padrão do Linux nesse ponto, e você
‫só precisa automatizar e resolver esses problemas de várias
‫maneiras padrão do Linux.
‫Não é realmente um problema do Docker nesse momento.
‫É apenas um problema de permissões no host.