Introdução ao AppArmor para confinamento de processos no Linux

1. O que é AppArmor e por que usá-lo?

AppArmor (Application Armor) é um sistema de controle de acesso mandatório (MAC) para o kernel Linux, projetado para restringir programas a um conjunto específico de recursos. Diferentemente de sistemas de controle de acesso discricionário (DAC) tradicionais, onde o proprietário do arquivo define permissões, o AppArmor impõe políticas que nem mesmo o root pode contornar sem autorização explícita.

A principal diferença entre AppArmor e SELinux está na abordagem: enquanto o SELinux utiliza rótulos de contexto para todos os objetos do sistema (arquivos, processos, portas), o AppArmor trabalha com caminhos de arquivo. Isso torna o AppArmor significativamente mais simples de configurar e entender, especialmente para administradores que não desejam mergulhar na complexidade das políticas de tipo do SELinux.

Casos de uso típicos incluem servidores web (Nginx, Apache), servidores de banco de dados (MySQL, PostgreSQL), containers Docker e qualquer aplicação crítica que precise de isolamento adicional. O AppArmor é particularmente útil em ambientes onde a simplicidade de gerenciamento é priorizada sobre a granularidade extrema.

2. Arquitetura e Modos de Operação

O AppArmor opera como um módulo LSM (Linux Security Module) no kernel, interceptando chamadas de sistema relacionadas a arquivos, redes e capacidades. Cada perfil AppArmor define quais operações um processo pode realizar.

Existem dois modos de operação para perfis:

Modo enforce (imposição): Bloqueia ativamente qualquer operação não permitida pelo perfil. Este é o modo padrão para perfis em produção.

Modo complain (reclamação): Permite todas as operações, mas registra violações no log do sistema. Ideal para desenvolvimento e teste de novos perfis.

O sistema inclui perfis padrão para aplicações comuns, localizados em /etc/apparmor.d/. Estes perfis são mantidos pela comunidade e podem ser ativados imediatamente. Perfis personalizados podem ser criados para qualquer aplicação.

3. Instalação e Ativação do AppArmor

Para verificar se o kernel suporta AppArmor:

cat /sys/kernel/security/lsm | grep apparmor

Se o comando retornar "apparmor", o suporte está presente. Caso contrário, pode ser necessário adicionar lsm=apparmor aos parâmetros de boot.

Instalação dos pacotes necessários (Debian/Ubuntu):

sudo apt update
sudo apt install apparmor apparmor-utils apparmor-profiles

Ativação do serviço:

sudo systemctl enable apparmor
sudo systemctl start apparmor

Comandos essenciais para gerenciamento:

# Verificar status do AppArmor e perfis carregados
sudo aa-status

# Colocar um perfil em modo enforce
sudo aa-enforce /caminho/para/perfil

# Colocar um perfil em modo complain
sudo aa-complain /caminho/para/perfil

4. Criação de Perfis Personalizados

Um perfil AppArmor básico tem a seguinte estrutura:

# Perfil para /usr/sbin/nginx
#include <tunables/global>

/usr/sbin/nginx {
  #include <abstractions/base>
  #include <abstractions/nameservice>

  /etc/nginx/** r,
  /var/log/nginx/** w,
  /var/www/** r,
  /run/nginx.pid rw,
  /usr/share/nginx/** r,
  network inet tcp,
}

Para criar um perfil interativamente, use aa-genprof:

sudo aa-genprof /usr/sbin/nginx

O comando inicia um assistente interativo que monitora o processo e pergunta quais permissões devem ser adicionadas ao perfil. Durante a execução, o administrador pode:

  1. Executar ações normais no servidor web
  2. Responder às perguntas do aa-genprof sobre permissões solicitadas
  3. Visualizar logs de violação em tempo real

Exemplo prático completo para um servidor HTTP simples:

# /etc/apparmor.d/usr.sbin.nginx
#include <tunables/global>

/usr/sbin/nginx {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/ssl_certs>

  # Arquivos de configuração
  /etc/nginx/** r,
  /etc/nginx/mime.types r,

  # Logs
  /var/log/nginx/*.log w,
  /var/log/nginx/ r,

  # Conteúdo estático
  /var/www/html/** r,

  # PID e socket
  /run/nginx.pid rw,
  /var/run/nginx/ rw,

  # Bibliotecas e binários
  /usr/sbin/nginx mr,
  /usr/lib/nginx/** mr,

  # Rede
  network inet tcp,
  network inet6 tcp,

  # Capacidades necessárias
  capability setgid,
  capability setuid,
  capability net_bind_service,
}

5. Gerenciamento e Manutenção de Perfis

Comandos para gerenciar perfis manualmente:

# Carregar um perfil
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

# Descarregar um perfil
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.nginx

# Verificar sintaxe do perfil
sudo apparmor_parser -Q /etc/apparmor.d/usr.sbin.nginx

Para depuração, utilize logs de auditoria:

# Visualizar violações recentes
sudo dmesg | grep -i apparmor

# Usar aa-logprof para analisar logs e sugerir ajustes
sudo aa-logprof

Estratégia recomendada para transição de modo complain para enforce:

  1. Coloque o perfil em modo complain
  2. Execute a aplicação por um período de teste
  3. Use aa-logprof para analisar violações e ajustar o perfil
  4. Repita até que não haja violações relevantes
  5. Mude para modo enforce

6. Integração com Containers e Systemd

Para usar AppArmor com Docker:

# Executar container com perfil AppArmor padrão
docker run --security-opt apparmor=docker-default nginx

# Usar perfil personalizado
docker run --security-opt apparmor=meuperfil nginx

Perfis pré-definidos para Docker estão em /etc/apparmor.d/docker/. Para criar um perfil personalizado para container:

# /etc/apparmor.d/containers/meu-container
#include <tunables/global>

profile meu-container flags=(attach_disconnected) {
  #include <abstractions/base>
  #include <abstractions/nameservice>

  # Montagens do container
  / r,
  /etc/** r,
  /usr/** r,
  /bin/** rix,
  /sbin/** rix,

  # Rede
  network inet tcp,
  network inet6 tcp,

  # Capacidades limitadas
  capability chown,
  capability dac_override,
}

Com systemd, configure perfis em arquivos .service:

# /etc/systemd/system/meu-servico.service
[Unit]
Description=Meu Serviço Confinado

[Service]
ExecStart=/usr/local/bin/meu-servico
AppArmorProfile=/caminho/para/perfil
Restart=on-failure

[Install]
WantedBy=multi-user.target

Exemplo com systemd-nspawn:

# Criar container
sudo systemd-nspawn -D /var/lib/machines/meu-container

# Executar com perfil AppArmor
sudo systemd-nspawn -D /var/lib/machines/meu-container --apparmor-profile=meu-container

7. Boas Práticas e Solução de Problemas Comuns

Boas práticas essenciais:

  1. Teste em modo complain primeiro: Nunca coloque um perfil novo em modo enforce sem testar. Use o modo complain por pelo menos 24-48 horas em produção leve.

  2. Atualize perfis após mudanças: Sempre que atualizar uma aplicação, revise e atualize seu perfil AppArmor. Novas versões podem exigir permissões adicionais.

  3. Mantenha perfis granulares: Evite perfis genéricos que permitem acesso amplo. Quanto mais específico, mais seguro.

  4. Documente exceções: Comente em cada permissão por que ela é necessária, facilitando futuras revisões.

Problemas comuns e soluções:

Problema: Aplicação não inicia após ativar perfil
Solução: Verifique logs com dmesg | grep DENIED e ajuste o perfil conforme necessário.

Problema: Violações excessivas em modo complain
Solução: Use aa-logprof para analisar e adicionar permissões automaticamente.

Problema: Perfil muito restritivo bloqueia funcionalidades legítimas
Solução: Compare logs de violação com as funcionalidades quebradas e adicione permissões específicas.

Problema: Recuperação de acesso negado urgente
Solução: Mude temporariamente para modo complain com sudo aa-complain /caminho/perfil, corrija o perfil e volte para enforce.

Problema: Perfil não carrega após reboot
Solução: Verifique se o perfil está em /etc/apparmor.d/ e se o serviço AppArmor está ativo.

Referências