Header Ads

O que são namespaces do Linux e para que são usados?

Os namespaces do Linux são a tecnologia subjacente às tecnologias de contêiner, como Docker. Eles são um recurso do kernel do Linux que permite ao sistema restringir os recursos que os processos em contêineres veem e que garante que nenhum deles possa interferir em outro.

O que são namespaces?

Quando você está executando muitos processos e aplicativos diferentes em um único servidor, como é o caso de ferramentas de implantação como o Kubernetes, é importante ter cada processo isolado, principalmente por segurança.

Um contêiner não deve ser capaz de obter controle sobre os recursos de outro, porque se esse contêiner for comprometido, poderá comprometer todo o sistema. Este método de ataque é semelhante ao funcionamento do bug da CPU Meltdown; diferentes threads de um processador devem ser isolados uns dos outros. Da mesma forma, os processos em execução em diferentes sistemas virtuais (contêineres) devem ser isolados de outros contêineres.

Os namespaces conseguem esse isolamento no nível do kernel. Semelhante a como o chroot do aplicativo funciona, que prende um processo em um diretório raiz diferente, os namespaces separam outros aspectos do sistema. Existem sete namespaces disponíveis:

  • Monte, ou mnt. Muito semelhante ao chroot, o namespace Mount particiona virtualmente o sistema de arquivos. Os processos em execução em namespaces de montagem separados não podem acessar arquivos fora de seu ponto de montagem. Como isso é feito no nível do kernel, é muito mais seguro do que alterar o diretório raiz com chroot.
  • Processo ou pid. No Linux, os primeiros processos são gerados como filhos do PID 1, que forma a raiz da árvore de processos. O namespace do processo corta um ramo da árvore PID e não permite o acesso mais acima no ramo. Os processos em namespaces filhos terão, na verdade, vários PIDs — o primeiro representando o PID global usado pelo sistema principal e o segundo PID representando o PID na árvore de processos filho, que será reiniciado a partir de 1.
  • Comunicação entre processos ou ipc. Este namespace controla se os processos podem ou não se comunicar diretamente entre si.
  • Rede ou rede. Este namespace gerencia quais dispositivos de rede um processo pode ver. No entanto, isso não configura nada automaticamente para você — você ainda precisará criar dispositivos de rede virtuais e gerenciar a conexão entre interfaces de rede global e interfaces de rede filho. Um software de conteinerização como o Docker já descobriu isso e pode gerenciar a rede para você.
  • Usuário. Este namespace permite que o processo tenha “ raiz virtual ” dentro de seu próprio namespace, sem ter acesso root real ao sistema pai. Ele também particiona as informações de UID e GID, para que os namespaces filhos possam ter suas próprias configurações de usuário.
  • UTS. Este namespace controla o nome do host e as informações do domínio e permite que os processos pensem que estão sendo executados em servidores com nomes diferentes.
  • Cgroup é outro recurso do kernel muito semelhante aos namespaces. Os cgroups permitem que o sistema defina os limites de recursos (CPU, memória, espaço em disco, tráfego de rede, etc.) para um grupo de processos. Este é um recurso útil para aplicativos em contêineres, mas não faz nenhum tipo de “ isolamento de informações ” como os namespaces fariam. O namespace cgroup é uma coisa separada, e apenas controla quais cgroups um processo pode ver, e não o atribui a um cgroup específico.

Por padrão, qualquer processo que você executa usa os namespaces globais e a maioria dos processos em seu sistema também usa, a menos que especificado de outra forma.

Trabalhando com namespaces

Você pode usar o comando lsns (ls-namespaces) para ver os namespaces atuais que seu sistema possui. Este comando precisa ser executado como root, ou a lista pode estar incompleta.

Acima está a saída lsns de uma nova instalação do Ubuntu. Cada namespace é listado ao lado do ID do processo, usuário e comando que o criou. Os sete namespaces gerados de / sbin / init com PID 1 são os sete namespaces globais. Os únicos outros namespaces são namespaces mnt para daemons do sistema, junto com o serviço Livepatch da Canonical &’ s.

Se você estivesse trabalhando com contêineres, esta lista seria muito mais longa. Você pode gerar essa lista no formato JSON com a sinalização -J, que pode ser usada com muito mais facilidade com uma linguagem de script.

Você pode alterar seu namespace atual com o utilitário nsenter. Este comando permite que você “ insira ” o namespace de outro processo, geralmente para fins de depuração. Na verdade, ele pode executar qualquer comando nesse namespace, mas, por padrão, apenas tenta carregar um shell (geralmente / bin / bash).

Você especifica um ID de processo e, em seguida, cada namespace que deseja inserir:

 sudo nsenter -t PID --mount --net --pid //etc.

Por exemplo, tentar inserir o namespace de montagem para kdevtmpfs irá carregá-lo nesse namespace, mas posteriormente falhará porque não pode &’ encontrar / bin / bash, o que na verdade significa que funcionou, porque o diretório raiz aparente foi alterado .

Se o namespace mnt de seu filho incluísse / bin / bash, você poderia inseri-lo e carregar um shell. Isso pode ser feito manualmente, mas deve ser feito por meio de montagens de ligação, que podem manipular a árvore de diretórios e vincular arquivos em namespaces mnt. Isso pode levar a alguns casos de uso interessantes, como fazer dois processos lerem conteúdos diferentes do mesmo arquivo.

Para criar novos namespaces, você deve bifurcar a partir de um existente (geralmente global) e especificar quais namespaces deseja alterar. Isso é feito com o comando unshare, que executa um comando com um novo namespace “ unshared ” do mestre.

Para cancelar o compartilhamento do namespace do nome do host, use:

 comando sudo unshare -u 

Se o comando for deixado em branco, o unshare executa o bash por padrão. Isso cria um novo namespace que aparecerá na saída de lsns & # 8216; s:

A tela do multiplexador de terminal é usada aqui para manter o bash em execução em segundo plano, caso contrário, o namespace desapareceria quando o processo fosse encerrado.

A menos que você esteja fazendo uma programação de nível muito baixo, provavelmente não precisará alterar os namespaces sozinho. Programas de conteinerização, como o Docker, gerenciam os detalhes para você e, na maioria dos casos em que você precisa de isolamento do processo, deve apenas usar uma ferramenta existente. No entanto, é importante entender como os namespaces funcionam no contexto da conteinerização, especialmente se você estiver fazendo alguma configuração de baixo nível de seus contêineres do Docker ou precisar fazer qualquer depuração manual.

Nenhum comentário