Olá!

Hoje vamos ver algumas features de segurança que pertencem não apenas ao Docker, mas sim ao LXC, 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.

Por hoje era isso, fiquem atentos para as novidades!

Entusiasta Open Source, seu principal foco é ir atrás de ideias novas e torna-las realidade através de soluções simples e eficientes, o menos é mais, e o dividir é multiplicar.