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, lireaa-status(enforce / complain / unconfined), explorer/etc/apparmor.d/, créer un profil lab sous/tmp/lab-apparmor, passer complain → enforce, lireapparmor="DENIED"dans journalctl, recharger avecapparmor_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
- Hub Linux Réseau & Sécurité
- Lot voisin : hardening baseline, auditd, SSH hardening
- Pare-feu / bannissement déjà vus : nftables, fail2ban, socle ufw + fail2ban
- Console provider / IPMI / SSM ouverte avant d’enforce un profil trop strict sur un binaire critique
- Lab sous
/tmp/lab-apparmor;sudo; pas de secrets dans le dépôt ni dans les profils
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/ → complain → apparmor="DENIED" → ajustement → apparmor_parser -r → enforce → rollback. En prod : pas d’édition à l’aveugle des profils paquets ; console pour tout profil critique (SSH / boot).
Ressources & suite
man apparmor,man aa-status,man apparmor_parser,man aa-genprof- Hub : Linux Réseau & Sécurité
- Voisins : hardening baseline · auditd · SSH hardening
- Réseau : nftables · fail2ban · ufw + fail2ban
- Suite prévue : nginx rate-limit
- Quiz série : Sécurité quiz & FAQ
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.