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:
- Executar ações normais no servidor web
- Responder às perguntas do
aa-genprofsobre permissões solicitadas - 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:
- Coloque o perfil em modo complain
- Execute a aplicação por um período de teste
- Use
aa-logprofpara analisar violações e ajustar o perfil - Repita até que não haja violações relevantes
- 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:
-
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.
-
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.
-
Mantenha perfis granulares: Evite perfis genéricos que permitem acesso amplo. Quanto mais específico, mais seguro.
-
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
- Documentação Oficial do AppArmor — Wiki completa com guias de instalação, criação de perfis e referência de sintaxe
- Ubuntu AppArmor Documentation — Guia oficial da Canonical para uso do AppArmor no Ubuntu Server
- Debian AppArmor Wiki — Documentação da comunidade Debian com exemplos práticos e troubleshooting
- Docker Security with AppArmor — Documentação oficial do Docker sobre integração com AppArmor
- Linux Security Modules: AppArmor vs SELinux — Artigo da Red Hat comparando abordagens de segurança no kernel Linux
- AppArmor Profile Repository — Repositório oficial com perfis padrão mantidos pela comunidade
- Systemd and AppArmor Integration — Documentação do systemd sobre configuração de perfis AppArmor em serviços