kernel: suporte a namespaces

16

Eu estou querendo saber exatamente o que significa o recurso "Namespaces support" no kernel do Linux. Eu estou usando o kernel 3.11.1 (o mais novo kernel estável no momento).

Se eu decidir desativá-lo, notarei alguma alteração no meu sistema?

E no caso de alguém decidir usar namespaces, é suficiente apenas compilar NAMESPACES=Y no kernel, ou ele também precisa das ferramentas de espaço do usuário?

    
por Martin Vegter 24.09.2013 / 17:11

3 respostas

21

Em suma, os namespaces fornecem uma maneira de construir um sistema virtual Linux dentro de um sistema Linux maior. Isso é diferente da execução de uma máquina virtual que é executada como um processo sem privilégios: a máquina virtual aparece como um único processo no host, enquanto os processos em execução em um namespace ainda estão em execução no sistema host.

Um sistema virtual executado dentro de um sistema maior é chamado de contêiner . A idéia de um contêiner é que os processos em execução no contêiner acreditam que são os únicos processos no sistema. Em particular, o usuário root dentro do container não tem privilégios de root fora do container (note que isto é verdade apenas em versões recentes do kernel).

Os namespaces virtualizam um recurso por vez. Alguns exemplos de tipos de namespaces são:

  • Namespaces de usuário - permite que os processos se comportem como se estivessem sendo executados como usuários diferentes dentro e fora do namespace. Em particular, processos executados como UID 0 dentro do espaço de nomes têm privilégios de superusuário apenas em relação a processos em execução no mesmo espaço de nomes. Desde o kernel Linux 3.8, os usuários sem privilégios podem criar namespaces de usuário. Isso permite que um usuário comum faça uso de recursos reservados para a raiz (como alterar tabelas de roteamento ou recursos de configuração).
  • Espaços de nomes de PID - os processos dentro de um espaço de nomes PID não podem matar ou rastrear processos fora desse espaço de nomes.
  • Montar namespaces - isso permite que os processos tenham sua própria visão do sistema de arquivos. Essa visão pode ser uma visão parcial, permitindo que algumas partes do sistema de arquivos sejam ocultas e peças sejam recompostas para que as árvores de diretório apareçam em lugares diferentes. Os namespaces de montagem generalizam o tradicional recurso chroot do Unix, que permite que os processos sejam restritos a uma subárvore específica.
  • Namespaces de rede - permitem a separação de recursos de rede (dispositivos de rede) e, portanto, melhoram o isolamento de processos.

Os namespaces dependem do kernel para fornecer isolamento entre namespaces. Isso é bastante complicado para acertar, então ainda pode haver bugs de segurança por aí. O risco de erros de segurança seria o principal motivo para não ativar o recurso. Outra razão para não permitir isso seria quando você está fazendo um pequeno kernel para um dispositivo embutido. Em um kernel de propósito geral que você instalaria em um servidor ou estação de trabalho típica, os namespaces devem ser habilitados, como qualquer outro recurso de kernel maduro.

Ainda existem poucos aplicativos que usam namespaces. Aqui estão alguns:

  • O LXC está bem estabelecido. Ele depende de cgroups para fornecer contêineres.
  • O virt-sandbox é um projeto de sandboxing mais recente.
  • As versões recentes do Chromium também usam namespaces para sandboxing, quando disponíveis.
  • A estrutura uWSGI para aplicativos em cluster usa namespaces para um sandbox aprimorado.

Veja a série de artigos do LWN de Michael Kerrisk para mais informações.

    
por 25.09.2013 / 00:34
6

O namespace do kernel Linux é um conceito usado para isolar um grupo de processos de outros em relação ao acesso a um recurso do sistema. Por exemplo, dois namespaces PID diferentes podem conter processos com PIDs idênticos, mas imagens de processo completamente diferentes. Eles são frequentemente usados em virtualização no nível do sistema operacional, na qual um único kernel está executando simultaneamente vários sistemas operacionais - todos precisam ser baseados no Linux (porque eles compartilham o kernel, obviamente), mas podem ser distribuições e versões diferentes. Veja por exemplo LXC .

Você pode notar desativá-lo, por exemplo, em sistemas baseados em systemd, já que o systemd é capaz de usar namespaces para seus recurso de contêiner . Portanto, depende muito de qual distribuição você está usando e o que você pretende fazer com o sistema.

Como acontece com quase todos os recursos do kernel, você definitivamente precisa de algum tipo de programa de espaço do usuário - mesmo se você conversou com o kernel através de arquivos especiais (não sei se pode), geralmente é muito melhor contar com ferramentas especializadas , uma vez que eles oferecem API preliminar amigável.

    
por 25.09.2013 / 00:08
1

Para dar um exemplo de uso do namespace, em sistemas habilitados para SELinux (MLS ou Strict). O namespace é normalmente usado para criar diretórios /tmp e ou /home individuais para cada usuário. Esses diretórios são visíveis apenas para: o usuário, usuários com o mesmo rótulo, o kernel e usuários com acesso privilegiado. O diretório namespace-ed /tmp é rotulado pelo SELinux-MLS para corresponder ao rótulo SELinux-MLS do usuário. Nesse cenário, o diretório /tmp que o usuário vê pode estar montado em algum lugar diferente de /tmp ( /var/user-tmp ). No entanto, o usuário vê apenas /tmp com os arquivos criados devido à atividade do usuário. o usuário nunca verá nenhum arquivo em /tmp que seja produto de outros usuários.

    
por 27.12.2013 / 19:11