LXC é o tempo de execução de contêiner Linux de baixo nível bem conhecido e altamente testado. Está em desenvolvimento ativo desde 2008 e provou seu valor em ambientes de produção críticos em todo o mundo. Alguns de seus principais contribuidores são as mesmas pessoas que ajudaram a implementar vários recursos conhecidos de conteinerização dentro do kernel Linux.
Tipo | Serviço | Status |
---|---|---|
IC (Linux) | GitHub | |
IC (Linux) | Jenkins | |
Status do projeto | Melhores Práticas CII | |
Confuso | OSS Fuzz | |
Confuso | CI Fuzz |
O foco principal do LXC são os contêineres do sistema. Ou seja, contêineres que oferecem um ambiente o mais próximo possível daquele que você obteria de uma VM, mas sem a sobrecarga associada à execução de um kernel separado e à simulação de todo o hardware.
Isto é conseguido através de uma combinação de recursos de segurança do kernel, como namespaces, controle de acesso obrigatório e grupos de controle.
Contêineres sem privilégios são contêineres executados sem nenhum privilégio. Isso requer suporte para namespaces de usuário no kernel em que o contêiner é executado. LXC foi o primeiro tempo de execução a oferecer suporte a contêineres sem privilégios depois que os namespaces de usuário foram mesclados no kernel da linha principal.
Em essência, os namespaces de usuário isolam determinados conjuntos de UIDs e GIDs. Isto é conseguido estabelecendo um mapeamento entre um intervalo de UIDs e GIDs no host para um intervalo diferente (sem privilégios) de UIDs e GIDs no contêiner. O kernel traduzirá esse mapeamento de tal forma que dentro do contêiner todos os UIDs e GIDs apareçam como seria de esperar do host, enquanto no host esses UIDs e GIDs não têm privilégios. Por exemplo, um processo executado como UID e GID 0 dentro do contêiner pode aparecer como UID e GID 100000 no host. Os detalhes de implementação e funcionamento podem ser obtidos na página man do namespace do usuário correspondente.
Como os contêineres sem privilégios são um aprimoramento de segurança, eles naturalmente vêm com algumas restrições impostas pelo kernel. Para fornecer um contêiner sem privilégios totalmente funcional, o LXC interage com 3 partes do código setuid:
Todo o resto é executado como seu próprio usuário ou como um uid de propriedade do usuário.
Em geral, o objetivo do LXC é fazer uso de todos os recursos de segurança disponíveis no kernel. Isso significa que o gerenciamento de configuração do LXC permitirá que usuários experientes ajustem o LXC de acordo com suas necessidades.
Uma introdução mais detalhada à segurança LXC pode ser encontrada no seguinte link
Em princípio, o LXC pode ser executado sem nenhuma dessas ferramentas, desde que a configuração correta seja aplicada. Contudo, a utilidade de tais recipientes é geralmente bastante restrita. Apenas para destacar os dois problemas mais comuns:
Rede: Sem depender de um auxiliar setuid para configurar dispositivos de rede apropriados para um usuário sem privilégios (veja o binário lxc-user-nic
do LXC), a única opção é compartilhar o namespace da rede com o host. Embora isso deva ser seguro em princípio, compartilhar o namespace da rede do host ainda é uma etapa de isolamento a menos e aumenta o vetor de ataque. Além disso, quando o host e o contêiner compartilham o mesmo namespace de rede, o kernel recusará qualquer montagem do sysfs. Isso geralmente significa que o binário init dentro do contêiner não será capaz de inicializar corretamente.
Namespaces de usuário: conforme descrito acima, os namespaces de usuário são um grande aprimoramento de segurança. No entanto, sem depender de ajudantes privilegiados, os usuários sem privilégios no host só podem mapear seu próprio UID em um contêiner. Um sistema POSIX padrão, entretanto, requer que 65536 UIDs e GIDs estejam disponíveis para garantir funcionalidade total.
O LXC é configurado por meio de um simples conjunto de chaves. Por exemplo,
lxc.rootfs.path
lxc.mount.entry
Chaves de configuração de namespaces LXC usando pontos únicos. Isso significa que chaves de configuração complexas, como lxc.net.0
expõem várias subchaves, como lxc.net.0.type
, lxc.net.0.link
, lxc.net.0.ipv6.address
e outras para obter informações ainda mais precisas. configuração granulada.
LXC é usado como tempo de execução padrão para Incus, um hipervisor de contêiner que expõe uma API REST estável e bem projetada sobre ele.
O LXC roda em qualquer kernel a partir do 2.6.32. Tudo o que é necessário é um compilador C funcional. LXC funciona em todas as arquiteturas que fornecem os recursos necessários do kernel. Isso inclui (mas não está limitado a):
LXC também suporta pelo menos as seguintes bibliotecas padrão C:
A LXC sempre se concentrou em uma forte compatibilidade com versões anteriores. Na verdade, a API não foi quebrada desde a versão 1.0.0
. O LXC principal está atualmente na versão 4.*.*
.
O projeto LXC tem uma boa reputação no tratamento de questões de segurança de forma rápida e eficiente. Se você acha que encontrou um possível problema de segurança, informe-o por e-mail para security (at) linuxcontainers (dot) org.
Para mais detalhes, por favor dê uma olhada em
Sempre damos as boas-vindas a novos colaboradores e ficaremos felizes em fornecer orientação quando necessário. LXC segue as convenções de codificação do kernel. Isso significa que exigimos apenas que cada commit inclua uma linha Signed-off-by
. O estilo de codificação que usamos é idêntico ao usado pelo kernel Linux. Você pode encontrar uma introdução detalhada em:
e também deve dar uma olhada no arquivo CONTRIBUTING neste repositório.
Se você quiser se tornar mais ativo, geralmente também é uma boa ideia aparecer no canal IRC do LXC #lxc-dev em irc.libera.chat. Tentamos fazer todo o desenvolvimento abertamente e a discussão de novos recursos ou bugs é feita em questões apropriadas do GitHub ou no IRC.
Ao pensar em fazer contribuições críticas de segurança ou mudanças substanciais, geralmente é uma boa ideia primeiro enviar um ping aos desenvolvedores e perguntar se um PR seria aceito.
O LXC e seus projetos relacionados aderem estritamente a um esquema de versionamento semântico.
A fonte da última versão lançada sempre pode ser baixada em
Você pode navegar pelo código-fonte atualizado e alterar o histórico on-line
Sem considerar detalhes específicos da distribuição, um simples
meson setup -Dprefix=/usr build
meson compile -C build
geralmente é suficiente.
Quando você precisar de ajuda, os projetos LXC oferecem várias opções.
Mantemos um fórum de discussão em
onde você pode obter suporte.
Você pode nos encontrar em #lxc em irc.libera.chat.
Você pode verificar um dos dois arquivos da lista de discussão LXC e registrar-se se estiver interessado: