Product SiteDocumentation Site

14.4. Introdução ao AppArmor

14.4.1. Princípios

AppArmor é um sistema de Controle de Acesso Mandatório (MAC - Mandatory Access Control) construído sobre a interface LSM (Linux Security Modules) do Linux. Na prática, o kernel consulta o AppArmor antes de cada chamada do sistema para saber se o processo está autorizado a fazer a operação dada. Através desse mecanismo, o AppArmor confina programas a um conjunto limitado de recursos.
O AppArmor aplica um conjunto de regras (conhecidas como “perfil”) em cada programa. O perfil aplicado pelo kernel depende do caminho de instalação do programa sendo executado. Ao contrário do SELinux (discutido em Seção 14.5, “Introdução ao SELinux”), as regras aplicadas não dependem do(a) usuário(a). Todos(as) os(as) usuários(as) encontram o mesmo conjunto de regras quando executam o mesmo programa (mas permissões tradicionais de usuário(a) ainda se aplicam e podem resultar em comportamentos diferentes!).
Os perfis AppArmor são armazenados em /etc/apparmor.d/ e eles contém uma lista de regras de controle de acesso em recursos que cada programa pode fazer uso. Os perfis são compilados e carregados no núcleo pelo comando apparmor_parser. Cada perfil pode ser carregado tanto em modo de aplicação ("enforcing") quanto em modo de registro ("complaining"). O primeiro aplica a política e reporta as tentativas de violação, enquanto que o último não aplica a política mas mantém os registros de chamadas de sistema que deveriam ter sido negadas.

14.4.2. Habilitando o AppArmor e gerenciando os perfis AppArmor

O suporte do AppArmor está embutido nos kernels padrão fornecidos pelo Debian. Habilitar o AppArmor é, portanto, apenas uma questão de instalar alguns pacotes executando apt install apparmor apparmor-profiles apparmor-utils com privilégios de root.
O AppArmor está agora funcional após a instalação e o comando aa-status confirmará isso rapidamente:
# aa-status
o módulo apparmor é carregado.
32 perfis são carregados.
15 perfis estão no modo de imposição.
/usr/bin/man
[...]
17 perfis estão em modo de reclamação.
/usr/sbin/dnsmasq
[...]
1 processos têm perfis definidos.
1 processos estão em modo de imposição.
/usr/sbin/libvirtd (468) libvirtd
0 processos estão em modo de reclamação.
0 processos não são confinados, mas têm um perfil definido.
O estado de cada perfil pode ser alterado entre aplicação (enforcing) e registro (complaining) com chamadas para aa-enforce e aa-complain, passando como parâmetro tanto o caminho para o executável como o caminho para o arquivo de políticas. Além disso, um perfil pode ser inteiramente desabilitado com aa-disable ou posto em modo auditar (audit) (para também aceitar chamadas de sistema) com aa-audit.
# aa-enforce /usr/bin/pidgin
Setting /usr/bin/pidgin to enforce mode.
# aa-complain /usr/sbin/dnsmasq
Setting /usr/sbin/dnsmasq to complain mode.

14.4.3. Criando um novo perfil

Mesmo sendo bem fácil criar um perfil AppArmor, a maioria dos programas não tem um. Essa seção irá mostrar a você como criar um novo perfil a partir do zero apenas usando o programa alvo e deixando o AppArmor monitorar a chamada de sistema que ele faz e os recursos que ele acessa.
Os programas mais importantes que precisam ser confinados são os programas voltados para a rede, pois são mais atrativos à ataques remotos. É por isso que o AppArmor convenientemente fornece o comando aa-unconfined para listar os programas que não tem perfil associado e que expõem um soquete de rede aberto. Com a opção --paranoid você tem todos os processos não confinados que tem ao menos uma conexão de rede ativa.
# aa-não confinado
451 /usr/bin/containerd não confinado
467 /usr/sbin/sshd (sshd: /usr/sbin/sshd -D [ouvinte] 0 de 10-100 inicializações) não confinado
892 /usr/sbin/exim4 não confinado
No exemplo a seguir, tentaremos criar um perfil para /sbin/dhclient (já existe um perfil enviado por apparmor-profiles, então você pode comparar seus resultados com o oficial). Para isso usaremos aa-genprof dhclient. Ele irá convidá-lo a usar o aplicativo em outra janela e, quando terminar, voltar para aa-genprof para verificar eventos do AppArmor nos logs do sistema e converter esses logs em regras de acesso. Para cada evento registrado, ele fará uma ou mais sugestões de regras que você pode aprovar ou editar posteriormente de várias maneiras:
# aa-genprof dhclient
Gravando perfil atualizado para /usr/sbin/dhclient.
Configurando /usr/sbin/dhclient para modo de reclamação.

Antes de começar, você pode querer verificar se um
já existe um perfil para o aplicativo que você
deseja confinar. Veja a seguinte página wiki para
Mais Informações:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Criação de perfil: /usr/sbin/dhclient

Por favor, inicie o aplicativo para ser perfilado
outra janela e exercite sua funcionalidade agora.

Depois de concluído, selecione a opção "Scan" abaixo em 
para verificar os logs do sistema em busca de eventos do AppArmor. 

Para cada evento do AppArmor, você receberá o 
oportunidade de escolher se o acesso deve ser 
permitido ou negado.

[(S)can system log for AppArmor events] / (F)inish
S
Lendo entradas de log de /var/log/syslog.

Perfil: /usr/sbin/dhclient 1
Execute: /usr/sbin/dhclient-script
Gravidade: desconhecida

(I)herit / (C)hild / (P)rofile / (N)amed / (U)nconfined / (X) ix On / (D)eny / Abo(r)t / (F)inish
P

O AppArmor deve higienizar o ambiente quando
trocar de perfil?

A higienização do ambiente é mais segura,
mas algumas aplicações dependem da presença
de LD_PRELOAD ou LD_LIBRARY_PATH.

[(S)im] / (N)ão
S
Escrevendo perfil atualizado para /usr/sbin/dhclient-script.
Mudanças no modo de reclamação:

Perfil: /usr/sbin/dhclient 2
Capacidade: net_raw
Gravidade: 8

  [1 - capacidade net_raw,]
(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)finish
A
Adicionando o recurso net_raw ao perfil.

Perfil:    /usr/sbin/dhclient
Capacidade: net_bind_service
Gravidade:   8

 1 - #include <abstrações/nis>]
  2 - capacidade net_bind_service,
(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)finise
A
Adicionando #include <abstractions/nis> ao perfil.

Perfil:  /usr/sbin/dhclient 3
Caminho: /etc/ssl/openssl.cnf
Novo modo: proprietário r
Gravidade: 2

[1 - #include <abstrações/lightdm>]
2 - #include <abstrações/openssl>
3 - #include <abstractions/ssl_keys>
4 - proprietário /etc/ssl/openssl.cnf r,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob com (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r) t / (F)concluir
2

Perfil: /usr/sbin/dhclient
Caminho: /etc/ssl/openssl.cnf
Novo modo: proprietário r
Gravidade: 2

   1 - #include <abstrações/lightdm> 
  [2 - #include <abstrações/openssl>]
   3 - #include <abstractions/ssl_keys>
   4 - proprietário /etc/ssl/openssl.cnf r, 
[(A)llow] / (D)eny / (I)gnore / (G)lob / Glob com (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)ore
A
[...]
Perfil: /usr/sbin/dhclient-script 4
Caminho: /usr/bin/dash
Novo modo: proprietário r
Gravidade: desconhecida

   1 - #include <abstrações/gvfs-open>
  [2 - #include <abstrações/lightdm>]
   3 - #include <abstractions/ubuntu-browsers.d/plugins-common>
   4 - #include <abstrações/xdg-open>
   5 - proprietário /usr/bin/dash r,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob com (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r) t / (F)concluir
A
Adicionando #include <abstractions/lightdm> ao perfil.
Excluídas 2 entradas de perfil correspondentes anteriores.

= Perfis locais alterados =

Os seguintes perfis locais foram alterados. Você gostaria de salvá-los?

  [1 - /usr/sbin/dhclient]
   2 - /usr/sbin/dhclient-script
(S)salvar alterações / Salvar perfil selecionado(t)ed / [(V)visualizar alterações] / Visualizar alterações b/w (C)perfis enxutos / Abo(r)t
S
Escrevendo perfil atualizado para /usr/sbin/dhclient.
Escrevendo perfil atualizado para /usr/sbin/dhclient-script.

Criação de perfil: /usr/sbin/dhclient

Por favor, inicie o aplicativo para ser perfilado
outra janela e exercite sua funcionalidade agora.

Depois de concluído, selecione a opção "Scan" abaixo em
para verificar os logs do sistema em busca de eventos do AppArmor.

Para cada evento do AppArmor, você receberá o
oportunidade de escolher se o acesso deve ser
permitido ou negado.

[(S)can system log for AppArmor events] / (F)inish
F
Configurando /usr/sbin/dhclient para impor o modo.
Configurando /usr/sbin/dhclient-script para impor o modo.

Perfis do AppArmor recarregados no modo de imposição.

Considere contribuir com seu novo perfil!
Consulte a seguinte página wiki para obter mais informações:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Concluída a geração do perfil para /usr/sbin/dhclient.
Note que o programa não exibe de volta os caracteres de controle que você digitou, mas para clarear a explicação nós incluimos eles na transcrição prévia.

1

O primeiro evento detectado é a execução de outro programa. Neste caso, você tem múltiplas escolhas: você pode rodar o programa com o perfil do processo pai (a escolha “Inherit”), você pode rodá-lo com seu próprio e dedicado perfil (as escolhas “Profile” e “Named”, diferindo apenas pela possibilidade de usar um nome de perfil arbitrário), você pode rodá-lo com um sub-perfil do processo pai (a escolha “Child”), você pode rodá-lo sem qualquer perfil (a escolha “Unconfined”) ou você pode decidir não rodá-lo de forma alguma (a escolha “Deny”).
Note que quando você opta por rodá-lo sob um perfil dedicado que não existe ainda, a ferramenta irá criar o perfil em falta para você e irá fazer sugestões de regras para esse perfil nesta mesma execução.

2

A nível do kernel, os poderes especiais do usuário root foram divididos em "recursos" ("capabilities"). Quando uma chamada de sistema requer um recurso específico, o AppArmor irá verificar se o perfil permite ao programa fazer uso desse recurso.

3

Aqui o programa busca por permissões de leitura para /etc/ssl/openssl.cnf. O aa-genprof detectou que essa permissão foi também obtida por múltiplas "abstrações” e as oferece como escolhas alternativas. Uma abstração fornece um conjunto de regras de acesso reutilizável, reunindo múltiplos recursos que são comumente usados juntos. Nesse caso específico, o arquivo é geralmente acessado através das funções relacionadas ao serviço de nomes da biblioteca C e nós digitamos “2” para primeiro selecionarmos a opção “#include <abstractions/openssl>” e então “A” para dar a permissão.

4

Note que essa requisição de acesso não é parte do perfil do dhclient, mas do novo perfil que nós criamos quando permitimos /usr/sbin/dhclient-script executar com seu próprio perfil.
Após termos passado por todos os eventos registrados, o programa se oferece para salvar todos os perfis que foram criados durante sua execução. Neste caso, nós temos dois perfis que nós salvamos ao mesmo tempo com "Salvar" (“Save”) (mas você pode salvá-los individualmente também) antes de sair do programa com "Terminar" (“Finish”).
O aa-genprof é na realidade apenas um envoltório inteligente em volta do aa-logprof: ele cria um perfil vazio, carrega-o em modo de registro ("complain mode") e então roda o aa-logprof que é uma ferramenta para atualizar um perfil com base nas violações de perfil que foram registradas. Então você pode rodar novamente essa ferramenta mais tarde para aprimorar o perfil que você acabou de criar.
Se desejar que o perfil gerado fique completo, você deve usar o programa de todas as maneiras legítimas. No caso do dhclient, isso significa executá-lo via Network Manager, executá-lo via ifupdown, executando-o manualmente, etc. No final, você deve obter um /etc/apparmor.d/usr.sbin.dhclient próximo ao perfil enviado por apparmor-profiles em /usr/share/apparmor/extra-profiles/sbin.dhclient.
E /etc/apparmor.d/usr.sbin.dhclient-script pode ser semelhante a /usr/share/apparmor/extra-profiles/sbin.dhclient, enviado em apparmor-profiles também.