kernel: Suporte a namespaces

15

Gostaria de saber o que significa exatamente o recurso "Suporte a namespaces" no kernel do Linux. Estou usando o kernel 3.11.1 (o kernel estável mais novo no momento).

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

E caso alguém decida fazer uso de namespaces, basta compilar NAMESPACES=Yno kernel ou ele também precisa de ferramentas de espaço de usuário?

Martin Vegter
fonte
5
Os espaços para nome são explicados bastante bem aqui: lwn.net/Articles/531114 (não é uma resposta, porque eu realmente não estou respondendo às suas perguntas - estou apontando uma pilha de texto)
derobert

Respostas:

21

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

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

Os espaços para nome virtualizam um recurso por vez. Alguns exemplos de tipos de namespaces são:

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

Os espaços para nome dependem do kernel para fornecer isolamento entre os espaços para nome. Isso é bastante complicado de acertar, portanto ainda pode haver erros de segurança. O risco de erros de segurança seria o principal motivo para não ativar o recurso. Outro motivo para não habilitá-lo seria quando você estiver criando um pequeno kernel para um dispositivo incorporado. Em um kernel de uso geral que você instalaria em um servidor ou estação de trabalho típico, os namespaces devem ser ativados, como qualquer outro recurso maduro do kernel.

Ainda existem poucos aplicativos que usam espaços para nome. Aqui estão alguns:

  • O LXC está bem estabelecido. Ele conta com cgroups para fornecer contêineres.
  • O virt-sandbox é um projeto de sandbox mais recente.
  • Versões recentes do Chromium também usam namespaces para sandbox, quando disponíveis.
  • A estrutura uWSGI para aplicativos em cluster usa espaços de nome para melhorar o sandboxing.

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

Gilles 'SO- parar de ser mau'
fonte
6

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

Você pode desabilitá-lo, por exemplo, em sistemas baseados em systemd, pois o systemd pode usar espaços de nome para seu recurso de contêiner . Portanto, depende muito de qual distribuição você está usando e o que você pretende fazer com o sistema.

Como em quase todos os recursos do kernel, você definitivamente precisa de algum tipo de programa de espaço para o usuário - mesmo que tenha conversado com o kernel por meio de arquivos especiais (não sei se é possível), geralmente é uma idéia muito melhor confiar em ferramentas especializadas, pois elas oferecer API amigável.

peterph
fonte
1

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

guestUserX
fonte