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
Writing updated profile for /usr/sbin/dhclient.
Setting /usr/sbin/dhclient to complain mode.

Before you begin, you may wish to check if a
profile already exists for the application you
wish to confine. See the following wiki page for
more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Profiling: /usr/sbin/dhclient

Please start the application to be profiled in
another window and exercise its functionality now.

Once completed, select the "Scan" option below in 
order to scan the system logs for AppArmor events. 

For each AppArmor event, you will be given the 
opportunity to choose whether the access should be 
allowed or denied.

[(S)can system log for AppArmor events] / (F)inish
S
Reading log entries from /var/log/syslog.

Profile:  /usr/sbin/dhclient 1
Execute:  /usr/sbin/dhclient-script
Severity: unknown

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

Should AppArmor sanitise the environment when
switching profiles?

Sanitising environment is more secure,
but some applications depend on the presence
of LD_PRELOAD or LD_LIBRARY_PATH.

[(Y)es] / (N)o
Y
Writing updated profile for /usr/sbin/dhclient-script.
Complain-mode changes:

Profile:    /usr/sbin/dhclient 2
Capability: net_raw
Severity:   8

 [1 - capability net_raw,]
(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)inish
A
Adding capability net_raw, to profile.

Profile:    /usr/sbin/dhclient
Capability: net_bind_service
Severity:   8

 [1 - #include <abstractions/nis>]
  2 - capability net_bind_service,
(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)inish
A
Adding #include <abstractions/nis> to profile.

Profile:  /usr/sbin/dhclient 3
Path:     /etc/ssl/openssl.cnf
New Mode: owner r
Severity: 2

 [1 - #include <abstractions/lightdm>]
  2 - #include <abstractions/openssl>
  3 - #include <abstractions/ssl_keys>
  4 - owner /etc/ssl/openssl.cnf r,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
2

Profile:  /usr/sbin/dhclient
Path:     /etc/ssl/openssl.cnf
New Mode: owner r
Severity: 2

  1 - #include <abstractions/lightdm> 
 [2 - #include <abstractions/openssl>]
  3 - #include <abstractions/ssl_keys>
  4 - owner /etc/ssl/openssl.cnf r, 
[(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)ore
A
[...]
Profile:  /usr/sbin/dhclient-script 4
Path:     /usr/bin/dash
New Mode: owner r
Severity: unknown

  1 - #include <abstractions/gvfs-open>
 [2 - #include <abstractions/lightdm>]
  3 - #include <abstractions/ubuntu-browsers.d/plugins-common>
  4 - #include <abstractions/xdg-open>
  5 - owner /usr/bin/dash r,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
A
Adding #include <abstractions/lightdm> to profile.
Deleted 2 previous matching profile entries.

= Changed Local Profiles =

The following local profiles were changed. Would you like to save them?

 [1 - /usr/sbin/dhclient]
  2 - /usr/sbin/dhclient-script
(S)ave Changes / Save Selec(t)ed Profile / [(V)iew Changes] / View Changes b/w (C)lean profiles / Abo(r)t
S
Writing updated profile for /usr/sbin/dhclient.
Writing updated profile for /usr/sbin/dhclient-script.

Profiling: /usr/sbin/dhclient

Please start the application to be profiled in
another window and exercise its functionality now.

Once completed, select the "Scan" option below in
order to scan the system logs for AppArmor events.

For each AppArmor event, you will be given the
opportunity to choose whether the access should be
allowed or denied.

[(S)can system log for AppArmor events] / (F)inish
F
Setting /usr/sbin/dhclient to enforce mode.
Setting /usr/sbin/dhclient-script to enforce mode.

Reloaded AppArmor profiles in enforce mode.

Please consider contributing your new profile!
See the following wiki page for more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Finished generating profile for /usr/sbin/dhclient.
Note that the program does not display back the control characters that you type but for the clarity of the explanation we have included them in the previous transcript.

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.