Portal do Governo Brasileiro

capacidades


Descrição

Conjunto de capacidades

Existem quatro conjuntos de capacidades por thread, onde cada conjunto é representado no sistema por um mapa de bits.

Além disso, existe o mapa de bits bset (bounding set) que indica quais as capacidades suportadas pelo sistema.

Implementação

Uma implementação completa das capacidades requer que:

  1. Para todas as operações privilegiadas, o kernel verifique se o thread tem a capacidade correspondente no seu conjunto de capacidades efetivas.
  2. O kernel forneça chamadas de sistema que permitam alterar o conjunto de capacidades dos threads.
  3. O sistema de arquivos suporte alterações nas capacidades durante a execução de um arquivo.

Lista das capacidades

A tabela abaixo mostra um resumo das capacidades usadas no Linux. Para obter mais detalhes, veja o arquivo /usr/include/linux/capability.h ou use o comando "man capabilities".

BitNome Descrição
0CAP_CHOWN Altera UID e GID do arquivo
1CAP_DAC_OVERRIDENão verifica permissões do arquivo para ler, escrever e executar (DAC significa "discretionary access control")
2CAP_DAC_READ_SEARCH Não verifica permissões de leitura e faz pesquisa em arquivos e diretórios (DAC significa "discretionary access control")
3CAP_FOWNER Não verifica se o UID do usuário é igual ao UID do processo
4CAP_FSETID Ignora a necessidade do UID do usuário ser igual ao UID do processo quando os bits S_ISUID e S_ISGID estão marcados
5CAP_KILL Não verifica permissões para enviar sinal
6CAP_SETGID Altera o GID do processo
7CAP_SETUID Altera o UID do processo
8CAP_SETPCAP Remove todas as capacidades ou autoriza todas as capacidades
9CAP_LINUX_IMMUTABLE Modifica os atributos S_IMMUTABLE e S_APPEND dos arquivos
10CAP_NET_BIND_SERVICEAbre um soquete de rede com um número de porta menor que 1024 (portas privilegiadas)
11CAP_NET_BROADCAST Envia mensagens broadcasts (para todos) e receber mensagens multicasts (de todos)
12CAP_NET_ADMINExecuta várias operações de rede
13CAP_NET_RAW Abre soquetes de rede
14CAP_IPC_LOCK Bloqueia compartilhamento de memória
15CAP_IPC_OWNER Não verifica permissões nas operações de comunicação entre processos
16CAP_SYS_MODULE Carrega/descarrega módulos do kernel
17CAP_SYS_RAWIO Executa várias operações de I/O
18CAP_SYS_CHROOT Pode alterar o diretório-raiz do processo
19CAP_SYS_PTRACE Permite observar e controlar a execução de um outro processo
20CAP_SYS_PACCTConfigura monitoramento dos processos
21CAP_SYS_ADMIN Executa várias operações de administração do sistema
22CAP_SYS_BOOTReinicializa o sistema
23CAP_SYS_NICE Altera prioridades de execução de processos
24CAP_SYS_RESOURCE Configura recursos do sistema
25CAP_SYS_TIME Altera relógio do sistema
26CAP_SYS_TTY_CONFIG Executa várias operações em terminais virtuais
27CAP_MKNOD Cria um arquivo especial (caracteres, blocos ou FIFO)
28CAP_LEASE Estabelece locação em outros arquivos
29CAP_AUDIT_WRITE Grava registros no log de auditoria do kernel
30CAP_AUDIT_CONTROL Habilita/desabilita auditoria do processo pelo kernel
31CAP_SETFCAP Altera as capacidades do arquivo
32CAP_MAC_OVERRIDE Configura o controle para acesso aos recursos (Mandatory Access Control)
33CAP_MAC_ADMIN Ignora a política de controle para acesso aos recursos (Mandatory Access Control)
34CAP_SYSLOG Configura o syslog do kernel
35CAP_WAKE_ALARM Inicializa relógio para despertar o sistema
36CAP_BLOCK_SUSPEND Impede que o sistema seja suspenso

Exemplo

A melhor forma de mostrar a utilização das capacidades e a melhoria que este tipo de implementação traz para a segurança do sistema é por meio de um exemplo. Para isto, vamos usar o programa ping.

O comando ping precisa de privilégio de root para abrir um soquete de redes e, assim, transmitir/receber pacotes ICMP. Por isto, o comando ganha, normalmente, permissão especial SUID. Este tipo de permissão é representada pela letra "s" no grupo de permissões do dono do arquivo e autoriza qualquer pessoa a executar o programa como se fosse o próprio root.

-rwsr-xr-x 1 root root 44168 Mai 7 2014 /bin/ping
Podemos, por exemplo, usar comando ping para verificar a página do Google.
ping www.google.com.br
Abaixo uma possível saída para o comando.
PING www.google.com.br (173.194.42.184) 56(84) bytes of data. 64 bytes from rio01s06-in-f24.1e100.net (173.194.42.184): icmp_seq=1 ttl=55 time=9.41 ms
64 bytes from rio01s06-in-f24.1e100.net (173.194.42.184): icmp_seq=2 ttl=55 time=9.69 ms
64 bytes from rio01s06-in-f24.1e100.net (173.194.42.184): icmp_seq=3 ttl=55 time=10.7 ms
Note que o SUID permite que QUALQUER comando dentro do ping seja executado como root. Isto pode representar uma falha grave de segurança. Vamos então usar o comando chmod para remover o bit SUID das permissões.
sudo chmod u-s /bin/ping
O novo conjunto de permissões do ping é mostrado abaixo. Não existe mais a permissão SUID.
-rwxr-xr-x 1 root root 44168 Mai 7 2014 /bin/ping
Se testarmos novamente o comando ping, veremos que ocorre um erro.
ping: icmp open socket: Operation not permitted
Isto significa que o programa precisa de permissão para abrir soquetes de rede. Este tipo de permisão é fornecida pela capacidade cap_net_raw (bit 13). Podemos então usar o comando setcap para adicioná-la ao conjunto das capacidades permitidas (p) do programa.
sudo setcap cap_net_raw+p /bin/ping
Podemos usar o comando getcap para verificar as capacidades do comando ping.
getcap /bin/ping
A resposta obtida é mostrada abaixo.
/bin/ping = cap_net_raw+p
Se usarmos novamente o comando ping, veremos que ele não mais apresenta problema de permissão.
PING www.google.com.br (173.194.42.184) 56(84) bytes of data. 64 bytes from rio01s06-in-f24.1e100.net (173.194.42.184): icmp_seq=1 ttl=55 time=12.2 ms
64 bytes from rio01s06-in-f24.1e100.net (173.194.42.184): icmp_seq=2 ttl=55 time=11.6 ms
64 bytes from rio01s06-in-f24.1e100.net (173.194.42.184): icmp_seq=3 ttl=55 time=11.4 ms
Da discussão acima podemos deduzir que não há necessidade de dar permissão geral para o programa ping executar como root. Basta permitir que o programa use soquetes de rede.

A substituição da permissão SUID pela capacidade cap_net_raw trouxe mais segurança ao sistema. O ping não tem mais permissão para executar qualquer comando como se fosse o root. Ele agora só tem permissão para agir como root quando for abrir um soquete de rede.

Observações

 

  Topo   |   Guia   |   Home