Aller au contenu

AppArmor

Mise à jour :

La sécurité est un enjeu majeur pour tout système Linux, qu’il s’agisse d’un serveur exposé sur Internet ou d’une machine de développement. Or, renforcer la sécurité ne devrait pas rimer avec complexité excessive. C’est précisément là qu’intervient AppArmor, une solution de contrôle d’accès qui permet de confiner vos applications dans des profils de permissions clairement définis.

Contrairement à d’autres systèmes plus stricts et parfois difficiles à maîtriser, Apparmor mise sur la simplicité. Grâce à ses profils personnalisables, vous pouvez aisément restreindre les ressources accessibles à chaque logiciel, qu’il s’agisse de fichiers, de répertoires, de sockets réseau ou de bibliothèques système. Le résultat ? Une couche de protection supplémentaire, sans devoir passer des heures à peaufiner des politiques de sécurité incompréhensibles.

Bref rappel historique

AppArmor est né au début des années 2000 au sein de l’entreprise Immunix, avec l’idée de créer une alternative plus simple que SELinux, trop complexe pour de nombreux utilisateurs. Racheté en 2005 par Novell, il a été intégré à SUSE Linux Enterprise avant de rejoindre d’autres distributions comme Ubuntu et Debian.

Pourquoi utiliser AppArmor ?

AppArmor est bien plus qu’un simple outil de configuration. Il joue un rôle essentiel dans la protection de vos systèmes Linux en mettant en place un contrôle d’accès obligatoire (MAC) qui limite les actions des applications, même si elles sont compromises. Voici pourquoi AppArmor est indispensable pour renforcer la sécurité de vos serveurs et applications :

AppArmor agit comme une couche de défense supplémentaire en limitant les permissions des applications aux seules ressources nécessaires. En cas de faille de sécurité ou d’exploit dans une application (comme un serveur web), AppArmor empêche l’attaquant d’accéder à des fichiers critiques, d’exécuter des commandes ou de compromettre l’ensemble du système. Par exemple :

  • Si une vulnérabilité est exploitée dans Nginx, AppArmor peut empêcher l’accès aux répertoires sensibles comme /etc/passwd ou /root/.

Chaque application est confinée dans un profil de permissions strict qui détermine exactement ce qu’elle peut faire :

  • Lecture ou écriture dans des fichiers spécifiques.
  • Accès réseau ou exécution de commandes.

En minimisant les permissions, AppArmor limite les dégâts potentiels d’une attaque, même si une application est compromise.

Contrairement aux outils de sécurité réactifs comme les antivirus ou les pare-feu, AppArmor agit en amont. Il prévient les actions non autorisées avant qu’elles ne se produisent, en appliquant des politiques de sécurité préventives.

AppArmor permet une isolation complète des applications, empêchant leurs interactions non souhaitées avec le reste du système ou avec d’autres applications.

AppArmor offre aussi une traçabilité complète des accès système grâce à ses journaux détaillés :

  • Mode enforce : Les actions non autorisées sont bloquées et consignées.
  • Mode complain : Les violations sont enregistrées pour ajuster les profils sans perturber l’application.

Ces journaux permettent d’auditer les comportements des applications et d’identifier rapidement les problèmes ou tentatives d’accès suspectes.

AppArmor est donc un outil incontournable pour toute infrastructure Linux soucieuse de maintenir un haut niveau de sécurité. En limitant les permissions des applications et en renforçant leur confinement, il protège vos systèmes contre une large gamme de menaces, rendant vos serveurs plus robustes et résilients face aux attaques.

Est-compliqué à mettre en oeuvre ?

Contrairement à SELinux, qui s’appuie sur une politique de sécurité globale et souvent ardue à configurer, AppArmor mise sur la simplicité et la modularité. Plutôt que d’examiner le système dans son ensemble, il concentre sa protection sur chaque application grâce à des profils individuels, décrivant précisément les ressources auxquelles celle-ci a droit. Cette approche granulaire, plus intuitive, a séduit un large public, du débutant à l’administrateur confirmé, permettant de renforcer rapidement la sécurité sans se noyer dans des règles complexes.

Fonctionnalités et concepts

Avant de mettre AppArmor en pratique, il est essentiel de comprendre ses mécanismes. Grâce à une approche basée sur des profils individuels et une grande granularité dans la définition des permissions, AppArmor offre une solution de sécurité à la fois simple et efficace. Voici les principaux concepts à retenir :

  • Modes de fonctionnement :
    • Enforce : Toutes les actions non autorisées par le profil sont bloquées.
    • Complain : Les actions non autorisées ne sont pas bloquées, mais enregistrées, ce qui permet de comprendre et d’ajuster progressivement le profil sans interrompre le fonctionnement de l’application.
  • Profils AppArmor : Chaque application est régie par un profil spécifiant les fichiers, répertoires, bibliothèques et ressources réseau auxquels elle peut accéder. Cela permet d’isoler chaque programme dans son propre périmètre de sécurité.
  • Granularité des permissions : Les règles sont définies jusqu’au niveau du chemin des fichiers, permettant un contrôle très fin sur ce que l’application est autorisée à lire, écrire ou exécuter.
  • Audit et reporting : Lorsqu’une application tente d’accéder à une ressource non prévue, AppArmor génère des journaux détaillés. Ceux-ci aident à comprendre les besoins réels de l’application, à peaufiner les profils, et à suivre l’évolution de la politique de sécurité au fil du temps.
  • Simplicité et flexibilité : Les outils en ligne de commande tels que aa-genprof, aa-complain, aa-enforce, ou apparmor_parser facilitent la création, la modification et le déploiement des profils, sans exiger une expertise profonde en sécurité. Cette flexibilité permet d’adapter facilement Apparmor aux évolutions du système et aux nouveaux services déployés.

Installation et configuration

Avant de commencer à créer ou à modifier des profils, il est important de s’assurer qu’Apparmor est correctement installé et opérationnel sur votre système. Sur la plupart des distributions Linux populaires, comme Ubuntu ou Debian, Apparmor est souvent déjà présent et activé par défaut. Toutefois, si ce n’est pas le cas, l’installation reste simple et rapide.

Pour vérifier l’état actuel d’Apparmor, vous pouvez utiliser la commande suivante :

Terminal window
sudo apparmor_status
apparmor module is loaded.
134 profiles are loaded.
39 profiles are in enforce mode.
4 profiles are in complain mode.
transmission-cli
transmission-daemon
transmission-gtk
transmission-qt
91 profiles are in unconfined mode.
wpcom
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are in prompt mode.
0 processes are in kill mode.
0 processes are unconfined but have a profile defined.
0 processes are in mixed mode.

Ce rapport vous indiquera si le démon Apparmor est actif, dans quel mode fonctionnent vos profils actuels, et s’il existe des profils chargés sur votre système.

Si vous constatez qu’Apparmor n’est pas installé, vous pouvez le faire via votre gestionnaire de paquets. Par exemple, sur Ubuntu ou Debian, entrez :

Terminal window
sudo apt update
sudo apt install apparmor apparmor-utils apparmor-profiles apparmor-profiles-extra

Ces outils, incluant apparmor-utils, vous apporteront les fonctionnalités nécessaires pour gérer vos profils, les passer en mode complain ou enforce, et en créer de nouveaux.

Une fois l’installation terminée, assurez-vous qu’Apparmor est activé au démarrage. Sur les distributions modernes, utilisant systemd, vous pouvez vérifier le service avec :

Terminal window
sudo systemctl status apparmor
apparmor.service - Load AppArmor profiles
Loaded: loaded (/usr/lib/systemd/system/apparmor.service; enabled; preset: enabled)
Drop-In: /run/systemd/system/service.d
└─zzz-lxc-service.conf
Active: inactive (dead)
Docs: man:apparmor(7)
https://gitlab.com/apparmor/apparmor/wikis/home/

Si le service n’est pas activé, vous pouvez le démarrer et l’activer pour les prochains redémarrages :

Terminal window
sudo systemctl start apparmor
sudo systemctl enable apparmor

Sur certaines distributions ou configurations spécifiques, il peut être nécessaire de s’assurer que le noyau est lancé avec l’option security=apparmor. Pour cela, éditez la configuration de votre chargeur d’amorçage (par exemple, GRUB) et ajoutez cette option à la ligne de commande du noyau, puis régénérez la configuration de GRUB et redémarrez. Une fois le système relancé, AppArmor devrait être opérationnel.

Création et gestion de profils

L’une des principales forces d’AppArmor réside dans sa gestion par profils individuels. Chaque profil définit précisément les ressources auxquelles une application donnée est autorisée à accéder, ce qui permet de l’isoler et de limiter l’impact en cas de faille de sécurité.

Les profils AppArmor sont généralement stockés dans le répertoire /etc/apparmor.d/, avec un fichier par application. Par exemple, un service comme ping aura un profil nommé bin.ping. Il s’agit de fichiers texte simples, modifiables avec votre éditeur préféré, ce qui facilite leur adaptation à vos besoins.

Générer un profil initial

Pour créer un profil de base, utilisez l’outil aa-genprof :

Terminal window
sudo apt install nginx curl
sudo aa-genprof /usr/sbin/nginx

Par exemple en cherchant à démarrer le service Nginx :

Terminal window
sudo systemctl restart nginx
root@calm-tadpole:~# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.

Dans la fenetre de terminal, ou vous avez lancé aa-genprof, vous verrez apparaître les tentatives d’accès bloquées par AppArmor. Vous pouvez les autoriser ou les refuser, en fonction des besoins de votre application.

Terminal window
[(S)can system log for AppArmor events] / (F)inish
Reading log entries from /var/log/syslog.
Complain-mode changes:
Enforce-mode changes:
Profile: /usr/sbin/nginx
Path: /var/log/nginx/error.log
New Mode: w
Severity: 8
[1 - /var/log/nginx/error.log w,]
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / Abo(r)t / (F)inish
Profile: /usr/sbin/nginx
Path: /var/log/nginx/error.log
New Mode: w
Severity: 8
[1 - /var/log/nginx/error.log w,]
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / Abo(r)t / (F)inish
Adding /var/log/nginx/error.log w, to profile.
= Changed Local Profiles =
The following local profiles were changed. Would you like to save them?
[1 - /usr/sbin/nginx]
(S)ave Changes / Save Selec(t)ed Profile / [(V)iew Changes] / View Changes b/w (C)lean profiles / Abo(r)t
Writing updated profile for /usr/sbin/nginx.

Cet outil vous guidera en observant le comportement de l’application. En mode “complain”, AppArmor n’empêche pas les accès, mais les journalise. En testant Nginx, par exemple en redémarrant le service, vous verrez apparaître toutes les tentatives d’accès, qu’il suffit ensuite d’autoriser ou de refuser.

Le fichier constitué par aa-genprof est un bon point de départ, mais il peut nécessiter des ajustements pour correspondre exactement à vos besoins.

Terminal window
# Last Modified: Fri Dec 13 06:45:45 2024
abi <abi/3.0>,
include <tunables/global>
/usr/sbin/nginx {
include <abstractions/base>
include <abstractions/dovecot-common>
include <abstractions/postfix-common>
include <abstractions/totem>
capability dac_override,
/usr/sbin/nginx mr,
/var/log/nginx/access.log w,
/var/log/nginx/error.log w,
owner /etc/group r,
owner /etc/nginx/mime.types r,
owner /etc/nginx/nginx.conf r,
owner /etc/nginx/sites-available/default r,
owner /etc/nsswitch.conf r,
owner /etc/passwd r,
owner /run/nginx.pid r,
owner /run/nginx.pid w,
}

Ce fichier contient les règles de base pour Nginx, autorisant l’accès en lecture et écriture à certains fichiers de configuration et de logs. Vous pouvez l’affiner en ajoutant ou en retirant des règles, en fonction des besoins de votre application.

Ajuster et personnaliser les profils

Si on teste la consultation de la page d’accueil de Nginx, on obtient :

Terminal window
curl http://localhost
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.24.0 (Ubuntu)</center>
</body>
</html>

On peut voir dans les logs que l’accès a été bloqué :

Terminal window
sudo journalctl | grep -i apparmor | tail -n 10
Dec 13 06:44:54 calm-tadpole kernel: audit: type=1400 audit(1734072294.310:319): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbin/nginx" pid=2276 comm="apparmor_parser"
Dec 13 06:45:00 calm-tadpole kernel: audit: type=1400 audit(1734072300.682:320): apparmor="DENIED" operation="capable" class="cap" profile="/usr/sbin/nginx" pid=2286 comm="nginx" capability=7 capname="setuid"
Dec 13 06:45:45 calm-tadpole kernel: audit: type=1400 audit(1734072345.725:321): apparmor="STATUS" operation="profile_replace" profile="unconfined" name="/usr/sbin/nginx" pid=2444 comm="apparmor_parser"
Dec 13 06:54:22 calm-tadpole kernel: audit: type=1400 audit(1734072862.240:322): apparmor="DENIED" operation="open" class="file" profile="/usr/sbin/nginx" name="/var/www/html/index.nginx-debian.html" pid=2534 comm="nginx" requested_mask="r" denied_mask="r" fsuid=33 ouid=0

Une fois le profil initial créé, vous pouvez l’affiner en éditant directement le fichier dans /etc/apparmor.d/. Les règles précisent les actions autorisées (lecture, écriture, exécution) pour chaque fichier ou répertoire. Par exemple, on pourrait ajouter les droits de lecture du répertoire /var/www/html/ :

Terminal window
abi <abi/3.0>,
include <tunables/global>
/usr/sbin/nginx {
include <abstractions/base>
include <abstractions/dovecot-common>
include <abstractions/postfix-common>
include <abstractions/totem>
capability dac_override,
/usr/sbin/nginx mr,
/var/log/nginx/access.log w,
/var/log/nginx/error.log w,
/var/www/html/ rw,
owner /etc/group r,
owner /etc/nginx/mime.types r,
owner /etc/nginx/nginx.conf r,
owner /etc/nginx/sites-available/default r,
owner /etc/nsswitch.conf r,
owner /etc/passwd r,
owner /run/nginx.pid r,
owner /run/nginx.pid w,
}

Mais nous allons voir qu’il existe une méthode plus simple pour ajouter des règles à un profil existant, en utilisant les include.

Inclure des profils existants

Pour éviter de répéter des règles communes à plusieurs profils, AppArmor propose la directive include. Celle-ci permet d’ajouter des règles d’un profil à un autre, simplifiant la gestion des permissions partagées.

Dans notre exemple, Nginx partage des règles communes avec d’autres services, comme lighttpd ou Apache. Pour éviter de les répéter, nous pouvons les inclure directement dans le profil Nginx :

Terminal window
abi <abi/3.0>,
include <abstractions/base>
include <abstractions/dovecot-common>
include <abstractions/postfix-common>
include <abstractions/totem>

Ces directives incluent les règles communes à tous les profils, simplifiant la gestion des permissions partagées. Vous pouvez également créer vos propres fichiers d’inclusion, pour regrouper des règles spécifiques à votre environnement.

Les fichiers d’inclusion sont stockés dans le répertoire /etc/apparmor.d/abstractions/.

Terminal window
apache2-common
apparmor_api
aspell
audio
...
wayland
web-data
winbind
wutmp
X
xad
xdg-desktop
xdg-open

Dans les derniers fichiers de configuration, on peut voir que les règles web-data existent. Vérifions ce qu’elles contiennent :

Terminal window
cat /etc/apparmor.d/abstractions/web-data
# ------------------------------------------------------------------
#
# Copyright (C) 2002-2006 Novell/SUSE
# Copyright (C) 2014 Canonical Ltd
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public
# License published by the Free Software Foundation.
#
# ------------------------------------------------------------------
abi <abi/4.0>,
/srv/www/htdocs/ r,
/srv/www/htdocs/** r,
# virtual hosting
/srv/www/vhosts/ r,
/srv/www/vhosts/** r,
# mod_userdir
@{HOME}/public_html/ r,
@{HOME}/public_html/** r,
/srv/www/rails/*/public/ r,
/srv/www/rails/*/public/** r,
/var/www/html/ r,
/var/www/html/** r,
# Include additions to the abstraction
include if exists <abstractions/web-data.d>

On peut donc les inclure dans notre profil Nginx :

Terminal window
abi <abi/3.0>,
include <abstractions/base>
include <abstractions/dovecot-common>
include <abstractions/postfix-common>
include <abstractions/totem>
include <abstractions/web-data>

Après chaque modification, rechargez le profil :

Terminal window
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

Et refaîtes vos tests. Ca fonctionne. Nous avons créé notre profil Nginx, en quelques minutes.

Changer le mode d’un profil

Après avoir ajusté notre profil, nous pouvons le passer en mode “enforce” pour bloquer réellement les accès non autorisés :

Terminal window
sudo aa-enforce /usr/sbin/nginx

Un nouveau test. Tout fonctionne !

À l’inverse, si vous souhaitez repasser un profil en mode “complain” pour observer de nouvelles actions, utilisez :

Terminal window
sudo aa-complain /usr/sbin/nginx

Maintenir les profils sur le long terme

Les applications évoluent. De nouvelles fonctionnalités, mises à jour ou modules peuvent nécessiter des ajustements de profil. Remettez temporairement le profil en mode “complain” pour observer les nouveaux besoins, puis modifiez et appliquez à nouveau le mode “enforce”.

Cette approche itérative vous permet de conserver des profils précis et adaptés, renforçant la sécurité de vos services sans en perturber le fonctionnement.

Conclusion

AppArmor est un outil puissant et flexible pour renforcer la sécurité de vos systèmes Linux, tout en restant simple à configurer grâce à son approche basée sur des profils. À travers ce guide, nous avons exploré ses fonctionnalités clés, de l’installation à la création et la gestion de profils, ainsi que des cas pratiques concrets. Grâce à des abstractions comme web-data, AppArmor permet de centraliser les permissions et de simplifier la configuration des applications courantes.

Que vous soyez administrateur système ou utilisateur avancé, AppArmor vous offre un moyen efficace de limiter les accès des applications aux seules ressources nécessaires, réduisant ainsi la surface d’attaque de votre système. Avec des outils interactifs comme aa-genprof et aa-logprof, il devient facile d’adapter vos profils aux besoins spécifiques de vos applications tout en maintenant un haut niveau de sécurité.

Pour aller plus loin, n’hésitez pas à :

  • Tester AppArmor sur d’autres services et applications de votre infrastructure.
  • Exploiter les abstractions existantes pour simplifier vos profils.
  • Créer des règles personnalisées adaptées à vos environnements spécifiques.

En intégrant AppArmor dans votre stratégie de sécurité, vous faites un pas de plus vers un système Linux robuste, protégé et mieux maîtrisé. Sécurisez vos applications dès maintenant et prenez le contrôle de vos ressources système grâce à AppArmor.