Docker, namespaces de kernel e volumes

Ei pessoal!

Já faz um tempo, mas tenho usado isso como um bloco de notas para minhas ideias que valem a pena e com as quais luto em geral e também o tempo é um fator. De qualquer forma, tenho brincado muito com o Docker ultimamente para configurar coisas em um novo servidor e recentemente o Docker 1.10 foi lançado com novos recursos de segurança incríveis, principalmente namespaces do kernel.

Para aqueles que não conhecem os namespaces do kernel, não é um recurso novo. Já está presente no kernel há um certo tempo e basicamente (e colocado de forma muito simples) permite que você execute programas filhos em seu próprio namespace em uma subárvore completamente diferente que os isola do resto do sistema (com seu próprio PID mapeado para diferentes UID / GID). As vantagens disso é que seu programa filho está sendo executado em algum tipo de sandbox e não pode modificar seu sistema porque ele não tem direitos para fazer isso.

No caso do Docker anterior ao 1.10, era um recurso beta, mas agora está oficialmente integrado, permitindo que você inicialize o daemon do Docker com o --userns-remap. Lembre-se de que, ao habilitar este sinalizador, você terá que baixar novamente suas imagens e recriar seus contêineres. Quando habilitado, o que faz por padrão é: remapeia tudo que é executado dentro de contêineres com subuid / subgid na faixa de 100.000. Por exemplo, digamos que você tenha algo rodando como root no contêiner, na visão do contêiner o programa roda com 0 uid / gid, mas da perspectiva do host, ele roda sob 100000 uid / gid. O mesmo para o usuário, digamos que você crie um usuário dentro de seu contêiner que obtém automaticamente seu uid / gid como 1000 e, em seguida, no host, ele será mapeado como 101000 e assim por diante.

Agora as coisas ficam complicadas quando você precisa montar volumes do host para o contêiner e precisa de acesso de gravação a ele. Fiquei um pouco intrigado com isso quando comecei a experimentar e pensei que não era o único com esse problema, felizmente encontrei este post: http://stackoverflow.com/questions/35291520/docker-and-userns-remap- how-to-manage-volume-permissions-to-share-data-betwee semana passada que foi de alguma ajuda.

No referido post, amartynov remapeia manualmente os namespaces usados ​​pelo Docker no intervalo 500000, o que é bom, mas não obrigatório, você pode usar o intervalo padrão do Docker 100000. Se você já criou usuários em seu host e montou alguns de seus diretórios como volumes em seus contêineres, terá que alterar seu UID / GID e criar manualmente seu usuário em seu contêiner para enganar o sistema. Por exemplo, se você originalmente tinha um usuário com 1008 UID / GID e um usuário correspondente em seu contêiner agora, no host o usuário do contêiner será mapeado para o UID / GID 101008 (mas o contêiner o perceberá como 1008), que significa que você terá que modificar seu usuário host para usar o UID / GID 101008 com os seguintes comandos:

usermod -u 101008 foo
groupmod
-g 101008 foo

Em seguida, você terá que definir corretamente chowno diretório que está montando como um volume no contêiner no host e, agora, seu contêiner deve ter acesso de gravação ao volume montado, mantendo a vantagem de segurança dos recursos de namespace do usuário.

Por enquanto é isso. Foi rápido e se você tiver notas ou coisas que gostaria de adicionar / perguntar, é bem-vindo nos comentários.