Passer au contenu principal

Sécurité (Linux)

AppArmor

AppArmor est un module de sécurité du noyau Linux (LSM) qui restreint les actions des programmes via des profils de règles. Sur Debian, AppArmor est activé par défaut depuis Debian 10 : des profils sont en vigueur dès l'installation pour certains services système. Ignorer AppArmor mène à des heures de débogage de refus d'accès sans raison apparente.

État d'AppArmor

apt install apparmor-utils      # outils de gestion (si non installés)
aa-status                       # profils chargés, modes enforce/complain

aa-status affiche le nombre de profils chargés et leur mode :

  • enforce : actif. Les accès non autorisés sont refusés et journalisés.
  • complain : audit passif. Les violations sont journalisées mais non bloquées. Utile pour tester ou diagnostiquer.
  • disabled : chargé mais inactif.

Changer le mode d'un profil

aa-enforce  /etc/apparmor.d/usr.sbin.nginx    # passer en enforce
aa-complain /etc/apparmor.d/usr.sbin.nginx    # passer en complain
aa-disable  /etc/apparmor.d/usr.sbin.nginx    # désactiver

Lire les violations

Les refus AppArmor apparaissent dans le journal système :

journalctl -k | grep -i apparmor              # journal noyau
grep apparmor /var/log/syslog                 # syslog (si rsyslog actif)

Une ligne de violation typique :

apparmor="DENIED" operation="open" profile="/usr/sbin/nginx"
name="/etc/secrets/api_key" pid=1234 comm="nginx"

La lecture est directe : quel profil (profile=), quelle opération (operation=), sur quel fichier (name=).

Gérer les profils

# Recharger un profil après modification
apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

# Recharger tous les profils
apparmor_parser -r /etc/apparmor.d/

# Lister les profils disponibles
ls /etc/apparmor.d/

Structure d'un profil (lecture)

# /etc/apparmor.d/usr.sbin.nginx (extrait simplifié)
/usr/sbin/nginx {
    #include <abstractions/base>

    capability net_bind_service,   # écouter sur ports < 1024
    /etc/nginx/**  r,              # lire la configuration
    /var/log/nginx/* w,            # écrire les logs
    /var/www/**    r,              # lire les fichiers servis
}

Les règles sont : chemin + permissions (r lecture, w écriture, x exécution). ** matche récursivement.

En pratique

Le cas le plus courant : un service fraîchement installé ou reconfiguré refuse d'accéder à un fichier sans raison apparente. Réflexe : journalctl -k | grep apparmor. Si une violation est journalisée, passer le profil en mode complain pour la durée du diagnostic, identifier les accès nécessaires, puis ajuster le profil avec aa-genprof ou manuellement. La mauvaise réponse est de désactiver AppArmor globalement : elle supprime une couche de défense sans résoudre le problème sous-jacent.