Olá!
Hoje vamos ver algumas features de segurança que pertencem não apenas ao
Docker, mas sim ao
LXC (uma das tecnologias utilizadas pelo Docker), são as
capabilities.
Em sistemas Unix like, há basicamente duas categorias de processos: processos privilegiados, que executam com ID 0 (superusuário) e os não-privilegiados, que executam com ID maior que 0.
Basicamente os processos privilegiados ignoram todas as verificações de permissões de kernel, enquanto os processos não-privilegiados estão sujeitos a algumas checagens para sua correta execução, normalmente: UID efetivo (usuário dono do arquivo/binário, etc), GID efetivos (grupo dono do arquivo/binário, etc) ou lista de grupo suplementar (mais conhecidas como ACL's - Access Control List).
Do kernel 2.2 em diante o
Linux dividiu as formas tradicionais de privilégios associados ao superusuários em unidades diferentes, conhecidas como capacidades, que podem ser habilitadas e desabilitadas independentemente umas das outras. Essas capacidades são atribuídas por thread, ou seja, threads do mesmo processos podem ter suas capacidades de execução modificadas.
No Docker é possível modificar essas capacidades, habilitando ou desabilitando conforma sua necessidade, vale lembrar que todo container executa de forma não privilegiada, ou seja, ele tem sua execução restrita, quando é adicionada uma capacidade a execução de um container, é dado o privilegio para que o mesmo possa executar alguma ação como root, isso pode ser um problema de segurança, dependendo do seu ambiente.
Vamos ver algumas capacidades que podem ser atribuídas a um container, e que são normalmente utilizadas:
- CAP_SETPCAP :: Modifica capacidades de um processo
- CAP_SYS_MODULE :: Insere ou remove módulos do kernel
- CAP_SYS_RAWIO :: Modifica memória do Kernel
- CAP_SYS_PACCT :: Configura quota de processo
- CAP_SYS_NICE :: Modifica prioridade do processo
- CAP_SYS_RESOURCE :: Sobrescreve os limites de recursos
- CAP_SYS_TIME :: Modifica a hora de sistema
- CAP_SYS_TTY_CONFIG :: Configura interface tty
- CAP_AUDIT_WRITE :: Escreve logs de auditoria
- CAP_AUDIT_CONTROL :: Configura auditoria dos subsistema
- CAP_MAC_OVERRIDE :: Ignora politicas de MC do Kernel
- CAP_MAC_ADMIN :: Configuração de MAC
- CAP_SYSLOG :: Modifica o comportamento de logs
- CAP_NET_ADMIN :: Configura funções de rede
- CAP_SYS_ADMIN :: Possibilita execução totalmente privilegiada.
Agora, para habilitar alguma capacidade (ou CAP) no Docker, pode ser utilizado o parâmetro: --cap-add=NOMEDACAP, algo parecido com isso:
# docker run --cap-add=NOMEDACAP -i -t --rm centos /bin/bash
Para remover alguma CAP basta adicionar o parâmetro --drop-cap, ficaria assim:
# docker run --cap-add=ALL --cap-drop=NET_ADMIN -i -t --rm centos /bin/bash
Seguindo os parâmetros acima, todas as CAPs serão habilitadas para este container, menos a CAP NET_ADMIN, com isso todas as demais operações serão permitidas ao container, menos as operações de rede, como modificação de ip, configurações de rotas etc.
Quer saber mais sobre Docker, veja nosso blog:
Referências: