O Linux contém vários mecanismos de segurança diferentes que podem ser usados para colocar restrições nos processos. A maioria deles pode ser usada em conjunto para construir caixas de areia e contêineres. Um breve resumo de alguns dos mecanismos:
-
DAC ( controle de acesso discricionário ): as permissões tradicionais de proprietário / grupo. Proprietário do processo, grupo (s), bits de permissão tradicionais em arquivos.
-
MAC ( controle de acesso obrigatório ), sendo o SELinux e o AppArmor as implementações mais comuns. Os sistemas MAC aplicam regras entre assuntos (processos, usuários, ...) e objetos (arquivos, soquetes, ...) para decidir o acesso permitido. As regras do MAC tornam possíveis políticas sofisticadas e permissões mais refinadas. No entanto, a configuração pode ser uma quantidade não trivial de trabalho.
-
recursos permitem que um processo seja mantenha um subconjunto de privilégios de superusuário. Um processo executado como root pode reter certos recursos antes de alternar para um usuário não privilegiado, reduzindo assim a superfície de ataque mantendo apenas a quantidade mínima de recursos de superusuário. No entanto, muitos recursos são muito amplos e podem ser quase iguais à raiz [1] Alguns binários setuid podem se tornar não-setuid usando recursos de arquivo.
-
cgroups são usados para o processo contabilidade, aplicando limites e gestão de recursos. Por exemplo, freezer oferece uma maneira confiável de congelar todos os processos dentro do grupo (que pode ser uma tarefa problemática).
-
namepsaces permite que o processo 'seja ter ambientes separados (montagem, rede, usuário, pid, ...). Os namespaces de rede não compartilham a mesma configuração de rede, cada namespace de pid não está ciente do PID de seu pai e assim por diante. É bastante fácil ver como os namespaces podem ser usados para construir um contêiner Linux.
(e existem mais mecanismos, como chroots, seccomp filters e ACLs.)
Alguns dos recursos estão sobrepostos (como DAC, MAC e recursos). Usá-los juntos ainda pode ser útil na criação de segurança em camadas. Uma vulnerabilidade devido a um bug ou má configuração é idealmente atenuada em uma das camadas.
Cada recurso inclui seus próprios utilitários e APIs. O LXC oferece uma maneira fácil de aproveitar esses recursos por meio de uma única interface. O LXC também permite configurações que usam apenas alguns dos recursos; por exemplo, compartilhando o espaço de nomes de montagem com o host enquanto possui um namespace de rede privada. Também é possível executar um userspace Linux completo dentro de um contêiner com seus próprios namespaces separados.