Linux LXC vs prisão FreeBSD

62

Existem diferenças notáveis ​​entre as cadeias do LXC (Linux containers) e do FreeBSD em termos de segurança, estabilidade e desempenho?

À primeira vista, ambas as abordagens parecem muito semelhantes.

Philipp Claßen
fonte
11
O LXC é uma tecnologia bastante nova, então eu esperaria uma melhor segurança e estabilidade nas cadeias. Nem sequer um palpite sobre desempenho. Existem alguns problemas de segurança conhecidos com o LXC que podem ser mitigados usando o selinux, por exemplo. Eu pessoalmente gosto do LXC, no entanto.
Pavel Šimerda
11
@ PavelŠimerda Acabei de ouvir falar do LXC hoje, mas fiquei surpreso ao descobrir que o Heroku e provavelmente o Google App Engine já usam o LXC.
Philipp Claßen 29/04
3
Se você acabou de se deparar com o LXC, deve dar uma olhada no Docker, que usa o LXC sob o capô: docker.io/the_whole_story
Kev
11
O Docker não usa mais o lxc.
11
@nwildner ele não usa mais o liblxc, mas usa exatamente os mesmos conceitos: namespaces do kernel.
0xC0000022L

Respostas:

101

Não importa o nome sofisticado usado aqui, ambas são soluções para um problema específico: uma solução de segregação melhor do que o chroot clássico do Unix . Virtualização no nível do sistema operacional, contêineres, zonas ou mesmo "chroot with steroids" são nomes ou títulos comerciais que definem o mesmo conceito de separação do espaço do usuário, mas com recursos diferentes.

O Chroot foi introduzido em 18 de março de 1982, meses antes do lançamento do 4.2 BSD , como uma ferramenta para testar sua instalação e construção do sistema, mas hoje ainda possui suas falhas. Como o primeiro objetivo do chroot era apenas fornecer um caminho de nova raiz , outros aspectos do sistema que precisavam ser isolados ou controlados foram descobertos (rede, exibição de processo, taxa de transferência de E / S). É aqui que os primeiros contêineres (virtualização no nível do usuário) aparecem.

Ambas as tecnologias (FreeBSD Jails e LXC) fazem uso do isolamento do espaço do usuário para fornecer outra camada de segurança. Essa compartimentação garantirá que um determinado processo se comunique apenas com outros processos no mesmo contêiner no mesmo host e, se estiver usando algum recurso de rede para obter uma comunicação "fora do mundo", tudo será encaminhado para a interface / canal atribuído ao qual esse contêiner tem.

Recursos

Cadeias do FreeBSD:

  • Considerada tecnologia estável, já que é um recurso do FreeBSD desde 4.0;
  • É preciso o melhor do sistema de arquivos ZFS no ponto em que você pode clonar cadeias e criar modelos de prisão para implantar facilmente mais cadeias. Um pouco mais de loucura do ZFS ;
  • Bem documentado e em evolução ;
  • Cadeias hierárquicas permitem que você crie cadeias dentro de uma prisão (precisamos ir mais fundo!). Combine com allow.mount.zfspara obter mais potência, e outras variáveis ​​como children.maxdefinem cadeias máximas de filhos.
  • O rctl (8) manipulará os limites de recursos das cadeias (memória, CPU, disco, ...);
  • As cadeias do FreeBSD lidam com o espaço do usuário do Linux ;
  • Isolamento de rede com vnet, permitindo que cada prisão tenha sua própria pilha de rede, interfaces, tabelas de endereçamento e roteamento;
  • nullfs para ajudar a vincular pastas àquelas localizadas no servidor real e dentro de uma prisão;
  • utilitário ezjail para ajudar implementações em massa e gerenciamento de cadeias;
  • Muitos ajustáveis ​​do kernel ( sysctl). security.jail.allow.*Os parâmetros limitarão as ações do usuário raiz dessa prisão.
  • Talvez, as cadeias do FreeBSD estendam alguns dos recursos do projeto VPS, como a migração ao vivo em um futuro próximo.
  • Há algum esforço na integração do ZFS e do Docker em execução. Ainda experimental.
  • O FreeBSD 12 suporta bhyve dentro de uma prisão e PF dentro de uma prisão, criando mais isolamento para essas ferramentas
  • Muitas ferramentas interessantes foram desenvolvidas nos últimos anos. Alguns deles estão indexados nesta postagem do blog .
  • Alternativas: projeto VPS do FreeBSD

Contentores Linux (LXC):

  • Nova tecnologia "no kernel", mas sendo endossada pelas grandes (especialmente Canonical);
  • Contêineres sem privilégios a partir do LXC 1.0 dão um grande passo na segurança dentro de contêineres;
  • Mapeamento de UID e GID dentro de contêineres;
  • Namespaces do kernel, para fazer a separação do IPC, montagem, pid, rede e usuários. Esses namespaces podem ser tratados de maneira desanexada, onde um processo que usa um namespace de rede diferente não será necessariamente isolado em outros aspectos, como armazenamento;
  • Grupos de Controle (cgroups) para gerenciar recursos e agrupá-los. CGManager é o cara para conseguir isso.
  • Perfis Apparmor / SELinux e recursos do Kernel para aplicar melhor os recursos do Kernel acessíveis por contêineres. O Seccomp também está disponível nos contêineres lxc para filtrar as chamadas do sistema. Outros aspectos de segurança aqui .
  • Funcionalidade de migração ao vivo em desenvolvimento. É realmente difícil dizer quando estará pronto para uso na produção, pois o docker / lxc terá que lidar com a pausa do processo no espaço do usuário, capturar instantâneos, migrar e consolidar - ref1 , ref2 .A migração ao vivo está funcionando com contêineres básicos (nenhum dispositivo passa nem serviços de rede complexos nem configurações especiais de armazenamento).
  • Ligações de APIs para permitir o desenvolvimento em python3 e 2, lua, Go, Ruby e Haskell
  • Área centralizada "O que há de novo". Bastante útil sempre que você precisar verificar se algum bug foi corrigido ou se um novo recurso foi confirmado. Aqui .
  • Uma alternativa interessante poderia ser o lxd , que funciona sob o capô, mas possui alguns recursos interessantes, como uma API REST, integração do OpenStack, etc.
  • Outra coisa interessante é que o Ubuntu parece estar enviando o zfs como o sistema de arquivos padrão para contêineres no 16.04 . Para manter os projetos alinhados, o lxd lançou a versão 2.0 e alguns dos recursos estão relacionados ao zfs .
  • Alternativas : OpenVZ , Docker
  • Docker . Observe aqui que o Docker usa namespaces, cgroups criando isolamento "por aplicativo" / "por software". Principais diferenças aqui . Enquanto o LXC cria contêineres com vários processos, o Docker reduz um contêiner o máximo possível para um único processo e, em seguida, gerencia isso pelo Docker.
  • Esforço para integrar o Docker ao SELinux e reduzir os recursos dentro de um contêiner para torná-lo mais seguro - Docker e SELinux, Dan Walsh
  • Qual é a diferença entre Docker, LXD e LXC

O Docker não usa mais o lxc. Agora eles têm uma lib específica chamada libcontainer que lida com a integração com o namespace de baixo nível do Kernel e os recursos do cgroups diretamente.

Nenhuma das tecnologias é uma panacéia de segurança, mas ambas são maneiras muito boas de isolar um ambiente que não requer virtualização completa devido à infraestrutura mista de sistemas operacionais. A segurança virá após muita documentação, leitura e implementação de ajustáveis ​​do kernel, MAC e isolamentos que essas virtidades no nível do sistema operacional oferecem a você.

Veja também:


fonte
11
Vale ressaltar que fora da caixa, o lxc não faz nenhum esforço para fornecer o isolamento adequado do hóspede. O lxd , no entanto, tenta fornecer isolamento, como cadeias BSD ou zonas Solaris.
allquixotic
O lxd é uma "melhor experiência" do LXC, colocando outros recursos em cima dele. No entanto, parece bom citar esse carinha aqui
@ allquixotic você quer dizer se estiver usando a configuração inalterada criada a partir de modelos? Contêineres verdadeiros, mas sem privilégios (habilitados para usuários) estavam disponíveis no LXC 1.x e podem até ser iniciados automaticamente na inicialização do sistema, desde que sejam de propriedade deles root(e, portanto, localizados no local do sistema para contêineres).
0xC0000022L