Document

SUBSCRIBE TO GET FULL ACCESS TO THE E-BOOKS FOR FREE 🎁SUBSCRIBE NOW

Professional Dropdown with Icon

SUBSCRIBE NOW TO GET FREE ACCESS TO EBOOKS

AppArmor Linux : profils MAC, enforce et complain

À la fin de ce tutoriel AppArmor, vous saurez distinguer MAC et DAC, situer AppArmor face à SELinux (bref), vérifier apparmor / apparmor-utils, lire aa-status (enforce / complain / unconfined), explorer /etc/apparmor.d/, créer un profil lab sous /tmp/lab-apparmor, passer complain → enforce, lire apparmor="DENIED" dans journalctl, recharger avec apparmor_parser -r, et rollback — console de secours ouverte. Pas un cours SELinux, ni un redo hardening baseline / auditd.

Niveau : Intermédiaire+ · Temps estimé : 45–55 min · Versions testées : Ubuntu 22.04 / 24.04, Debian 12 ; notes Rocky/Alma 9 (SELinux souvent à la place) · Dernière vérification : 2026-09-11

Slug proposé : linux-apparmor · Série : Linux Réseau & Sécurité · Remplace / fusionne : N/A — création (chapitre 8)

Prérequis

Coût : 0 €. Risque : un profil enforce trop serré peut casser un service (nginx, sshd packagé, etc.). Sur VM jetable, commencez en complain ; gardez la console.

Ce que nous allons construire

MAC vs DAC · AppArmor vs SELinux (contraste bref)
  → Install / statut : apparmor, apparmor-utils, systemctl, aa-status
  → Modes : enforce · complain · unconfined
  → Chemins : /etc/apparmor.d/ · includes · profils packagés
  → Lab : script /tmp/lab-apparmor · profil custom · aa-complain / aa-enforce
  → DENIED journalctl · ajuster · apparmor_parser -r · rollback

(Schéma à remplacer par une image locale Excalidraw / draw.io, alt : « AppArmor : profils MAC, modes enforce/complain, aa-status, lab /tmp/lab-apparmor ».)

Chapitre 8 Sécurité. nft / fail2ban filtrent le réseau ; auditd enregistre ; AppArmor confine un programme (chemins, caps, sockets), même sous un user « autorisé » en DAC.

Étape 1 — MAC vs DAC, AppArmor vs SELinux

Modèle Idée Exemple Linux
DAC Le propriétaire décide (user/group/autres, ACL) chmod, chown, sudo
MAC La politique système confine même root/local user AppArmor, SELinux

Un binaire root qui lit /etc/shadow peut être légitime en DAC et refusé en MAC si le profil l’interdit — limiter le blast radius d’un exploit dans un démon packagé.

AppArmor SELinux (aperçu)
Style Profils par chemin de binaire Labels / types sur objets
Distros typiques Ubuntu, Debian, SUSE RHEL, Rocky, Alma, Fedora
Outils lab aa-status, aa-genprof, aa-logprof getenforce, ausearch, semanage

Sur Rocky/Alma, SELinux est souvent le MAC par défaut : ne forcez pas AppArmor sans besoin. Lab cible : Ubuntu/Debian.

Étape 2 — Installer et lire le statut

# Ubuntu / Debian
sudo apt update
sudo apt install -y apparmor apparmor-utils
sudo systemctl status apparmor --no-pager
sudo aa-status
# Kernel LSM (aperçu)
cat /sys/kernel/security/lsm 2>/dev/null || true
Mode Effet
enforce Violations bloquées + loguées
complain Violations autorisées + loguées (apprentissage)
unconfined Pas de profil actif pour ce binaire

aa-status liste profils chargés, compte enforce/complain et processus confinés. Si le service est inactif ou le LSM absent (certains containers), documentez l’écart : lab = VM avec AppArmor.

mkdir -p /tmp/lab-apparmor && cd /tmp/lab-apparmor
sudo aa-status 2>&1 | tee aa-status-before.txt | head -n 40

Étape 3 — Chemins et profils packagés

Les profils vivent sous /etc/apparmor.d/. Des #include tirent des abstractions (base, nameservice…). Les paquets (tcpdump, cups…) livrent souvent un profil prêt à l’emploi.

ls /etc/apparmor.d/ | head -n 30
# Exemples fréquents (présents selon paquets)
ls /etc/apparmor.d/ | grep -Ei 'tcpdump|cups|ping|usr.bin' | head || true
# Ne pas éditer à la va-vite un profil paquet : préférer un profil lab dédié
sudo head -n 40 /etc/apparmor.d/usr.bin.tcpdump 2>/dev/null || 
  sudo head -n 40 /etc/apparmor.d/usr.sbin.tcpdump 2>/dev/null || 
  echo "tcpdump profile absent — OK, on crée un profil lab custom"
Chemin Rôle
/etc/apparmor.d/ Profils (noms = chemin binaire avec /.)
abstractions/ Blocs réutilisables #include
local/ (si présent) Ajustements locaux sans écraser le profil paquet
disable/ Symlinks pour désactiver un profil

Prod : complain d’abord, lire les denies, puis enforce. Évitez de patcher le fichier paquet sans local/ / drop-in : un upgrade peut écraser vos changements.

Étape 4 — Lab : script + profil custom

On confine un wrapper sûr sous /tmp/lab-apparmor (pas sshd, pas de secret) : voir un DENIED, ajuster, passer en enforce.

cd /tmp/lab-apparmor
cat > lab-tool.sh << 'EOF'
#!/bin/bash
# Lab AppArmor — lit un fichier autorisé, tente un chemin hors profil
set -euo pipefail
echo "lab-tool start $(date -Is)"
cat /tmp/lab-apparmor/allowed.txt
echo "--- tentative hors profil ---"
cat /etc/hostname 2>&1 || true
echo "lab-tool end"
EOF
chmod 755 lab-tool.sh
echo "contenu autorise lab" > /tmp/lab-apparmor/allowed.txt

# Profil minimal (chemin exact du binaire = nom de fichier avec / → .)
# Si /tmp est noexec : déplacez sous /usr/local/bin/lab-tool
PROF_NAME="tmp.lab-apparmor.lab-tool.sh"
sudo tee /etc/apparmor.d/${PROF_NAME} >/dev/null << 'EOF'
#include <tunables/global>

/tmp/lab-apparmor/lab-tool.sh {
  #include <abstractions/base>

  /tmp/lab-apparmor/lab-tool.sh r,
  /tmp/lab-apparmor/allowed.txt r,
  /usr/bin/bash ix,
  /usr/bin/cat ix,
  /usr/bin/date ix,
  /usr/bin/echo ix,
  # /etc/hostname volontairement ABSENT → DENIED en enforce
}
EOF

# Charger en complain d’abord
sudo apparmor_parser -r -C /etc/apparmor.d/${PROF_NAME} 2>/dev/null || 
  sudo apparmor_parser -r /etc/apparmor.d/${PROF_NAME}
sudo aa-complain /tmp/lab-apparmor/lab-tool.sh 2>/dev/null || 
  sudo aa-complain /etc/apparmor.d/${PROF_NAME}
sudo aa-status | grep -E 'lab-tool|complain|enforce' | head -n 20 | tee /tmp/lab-apparmor/status-complain.txt

Exécutez le script (complain = logs, blocage souple selon version) :

/tmp/lab-apparmor/lab-tool.sh | tee /tmp/lab-apparmor/run-complain.txt
# Alternative guidée si vous préférez l’assistant :
# sudo aa-genprof /tmp/lab-apparmor/lab-tool.sh
# puis aa-logprof pour itérer sur les events

Passez en enforce, relancez, observez le refus sur /etc/hostname :

sudo aa-enforce /tmp/lab-apparmor/lab-tool.sh 2>/dev/null || 
  sudo aa-enforce /etc/apparmor.d/${PROF_NAME}
/tmp/lab-apparmor/lab-tool.sh | tee /tmp/lab-apparmor/run-enforce.txt || true
Outil Usage
aa-complain / aa-enforce Changer le mode d’un profil
aa-disable Désactiver (symlink disable/)
aa-genprof / aa-logprof Générer / itérer depuis les logs
apparmor_parser -r Recharger un profil après édition

Étape 5 — Lire les DENIED et ajuster

# Denies AppArmor récents (journal + dmesg)
sudo journalctl -b --no-pager | grep -i 'apparmor="DENIED"' | grep -i lab-tool | tail -n 20 | 
  tee /tmp/lab-apparmor/denied-sample.txt || true
sudo dmesg | grep -i apparmor | tail -n 15 | tee /tmp/lab-apparmor/dmesg-apparmor.txt || true

Pour autoriser la lecture de /etc/hostname en lab, ajoutez la règle puis rechargez :

# Ajout contrôlé (lab) — une ligne, puis reload
echo '  /etc/hostname r,' | sudo tee -a /etc/apparmor.d/${PROF_NAME}
sudo apparmor_parser -r /etc/apparmor.d/${PROF_NAME}
/tmp/lab-apparmor/lab-tool.sh | tee /tmp/lab-apparmor/run-after-fix.txt
sudo aa-status | grep lab-tool | tee /tmp/lab-apparmor/status-after.txt

Validé si : profil listé, DENIED vu (ou tentative documentée), script OK après apparmor_parser -r, mode enforce confirmé.

Étape 6 — Bonnes pratiques prod et nettoyage

Prod : nouveaux démons en complain → revue journal → enforce ; documentez ; ne coupez pas un profil paquet critique sans plan. Complémente nftables / fail2ban et auditd — ne les remplace pas.

# Rollback / nettoyage lab UNIQUEMENT
sudo aa-disable /tmp/lab-apparmor/lab-tool.sh 2>/dev/null || true
sudo rm -f /etc/apparmor.d/tmp.lab-apparmor.lab-tool.sh
sudo rm -f /etc/apparmor.d/disable/tmp.lab-apparmor.lab-tool.sh 2>/dev/null || true
# Recharger le cache / parser si besoin
sudo systemctl reload apparmor 2>/dev/null || sudo systemctl restart apparmor 2>/dev/null || true
rm -rf /tmp/lab-apparmor
sudo aa-status | head -n 25
echo "lab AppArmor nettoyé — profils paquets inchangés"

Erreurs fréquentes

Symptôme Cause Correction
aa-status vide / erreur AppArmor non chargé / conteneur VM Ubuntu/Debian ; vérifier LSM
Profil ignore le script Mauvais chemin dans le nom de profil Alignement exact path ↔ fichier /etc/apparmor.d/
Permission denied inattendu Enforce trop tôt aa-complain ; lire DENIED ; ajuster ; apparmor_parser -r
/tmp noexec Montage sécurisé Déplacer le binaire lab sous /usr/local/bin
Profil paquet écrasé à l’upgrade Édition directe du fichier distro Préférer local/ / profil dédié documenté
Rocky : pas d’AppArmor SELinux par défaut Rester sur SELinux ou lab Ubuntu
Service cassé après enforce Règles incomplètes Console ; aa-complain ou aa-disable immédiat

Quiz (5 questions)

1. Différence clé MAC vs DAC ?
– A. MAC = uniquement le firewall
– B. MAC impose une politique système même si le DAC autorise l’user/owner
– C. DAC remplace AppArmor

2. Que fait le mode complain ?
– A. Chiffre les profils
– B. Logue les violations sans les bloquer (apprentissage)
– C. Désactive le noyau LSM

3. Où vivent typiquement les profils AppArmor ?
– A. /var/log/apparmor/ seulement
– B. /etc/apparmor.d/ (avec abstractions / local)
– C. ~/.ssh/

4. Comment recharger un profil après édition ?
– A. Uniquement reboot obligatoire
– B. apparmor_parser -r /etc/apparmor.d/<profil> (ou outils aa-*)
– C. nft reload

5. Première réaction si un service casse juste après aa-enforce ?
– A. Réinstaller le noyau
– B. Console : aa-complain / aa-disable sur ce profil, lire les DENIED, ajuster
– C. Supprimer fail2ban

Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B

Récapitulatif

Vous avez posé AppArmor comme couche MAC complémentaire au DAC et au duo réseau (nftables, fail2ban). Workflow : aa-status → profil /etc/apparmor.d/complainapparmor="DENIED" → ajustement → apparmor_parser -renforce → rollback. En prod : pas d’édition à l’aveugle des profils paquets ; console pour tout profil critique (SSH / boot).

Ressources & suite

Maillage série Linux Réseau & Sécurité

← Précédent Hardening baseline : updates, users, services
→ Suivant Pare-feu applicatif : nginx rate-limit
Hub Linux Réseau & Sécurité
Latéral auditd · SSH hardening

Meta publication (à remplir dans Rank Math / SEO)

  • Title SEO : AppArmor Linux : profils MAC, enforce et complain (2026)
  • Meta description (≤ 155) : AppArmor Linux : profils MAC, modes enforce/complain, aa-status et lab pratique. Chapitre 8 Sécurité — DevOps 2026.
  • Focus keyphrase : AppArmor
  • KW secondaires : MAC, profils AppArmor, enforce, complain, aa-status
  • Schemas Rank Math : Article + HowTo (étapes lab) + FAQ/Quiz (5 questions)
  • Image mise en avant : assets/web/devopelastichayway/cover-linux-apparmor-1200x630.webp (Visuels Linux — WebP 1200×630)
  • Catégorie : Linux · Niveau : Intermédiaire+
  • Slug : linux-apparmor
  • Statut : FEU VERT — batch WP-CLI (plus HOLD)

← Retour parcours Linux — Basics, Admin, Réseau & Sécurité, Shell & Automation.