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.