Menu Fermer

AppArmor pour sécuriser Linux

AppArmor (Application Armor) est une fonctionnalité de sécurité de type MAC (Mandatory Access Control) implémenté sur les modules de sécurité Linux (LSM).
Il a pour but de contrôler l’accès des processus Linux afin de s’assurer que ce dernier ne dispose pas de privilège trop élevé par rapport à ce qu’il est censé effectué.
Apparmor est une amélioration du noyau qui vise à limiter les programmes à un ensemble limité de ressources. Ce qui rend Apparmor différent des autres outils de sécurité, c’est qu’il lie les attributs de contrôle d’accès aux programmes plutôt qu’aux utilisateurs individuels.

De nombreuses distributions Linux. SLES (SUSE Linux Enterprise Server), OpenSUSE et Ubuntu sont quelques-unes des distributions Linux qui intègrent cette solution. Bien entendu, on peut aussi l’installer sur Debian.

Voici quelques explications sur le fonctionnement général d’AppArmor.

AppArmor pour sécuriser Linux

Qu’est-ce que AppArmor et comment ça marche

Apparmor est un produit que Novell a acquis lorsqu’ils ont acheté l’entreprise Immunix en mai 2005.
Il a été conçu comme une alternative à Security-Enhanced Linux (SELinux) ou GRSecurity.
AppArmor est beaucoup plus simple d’utilisation.

D’après Novell, il protège de manière proactive le système d’exploitation et les applications contre les menaces externes ou internes, même les attaques zero day, en appliquant un bon comportement de programme et en empêchant même les défauts logiciels inconnus d’être exploités.

Pour y parvenir, Apparmor installe un module dans le noyau Linux qui surveille l’utilisation des ressources des programmes en fonction de leurs profils.
Un profil peut être interprété dans deux modes: appliquer le enforce mode et le complain mode.
Apparmor enregistre une ligne dans /var/log/syslog ou /var/log/audit/audit.log via le démon de journalisation du noyau Klogd pour chaque ressource accès à l’application.

Voici une entrée typique où le serveur Web Lighttpd tente de lire /etc/passwd :

type=AVC msg=audit(1657717711.397:12089): apparmor="DENIED" operation="open" profile="/usr/sbin/lighttpd" name="/etc/passwd" pid=209454 comm="php-cgi" requested_mask="r" denied_mask="r" fsuid=33 ouid=0FSUID="www-data" OUID="root"
Sécuriser Linux avec AppArmor

AppArmor peut aider à sécuriser un serveur Linux contre les attaques du type Remote Command Execution (RCE) et Remote File Inclusion (RFI).
Par exemple ci-dessous, une backdoor PHP qui tente d’exécuter ls est bloquée.

Sécuriser un serveur WEB (Nginx+php-fpm) avec AppArmor

Comment bien utiliser AppArmor

AppArmor n’est pas destiné à fournir une protection contre l’exécution d’utilitaires exécutés par les utilisateurs Linux. Vous avez déjà le modèle de sécurité Linux classique en place pour limiter les activités de ces programmes.
AppArmor est destiné à être utilisé sur des serveurs qui ont généralement peu ou pas de comptes d’utilisateurs réguliers. En effet, il n’y a aucun moyen de définir les profils spécifiques à l’utilisateur dans AppArmor, et il n’y a pas de concept de rôle.

Apparmor doit être utilisé pour contraindre les programmes qui (citant le guide de l’utilisateur) «médiatisent les privilèges». Autrement dit, les programmes qui ont accès aux ressources que la personne qui utilise le programme n’a pas. Par exemple, cela peut comprendre :

  • Les programmes qui utilisent setuid ou setgid (qui fonctionnent avec l’identité du propriétaire ou du groupe du programme). Essentiellement, il s’agit des daemons et services Linux
  • Les programmes fonctionnent par des travaux CRON. Vous pouvez les trouver en fermant dans les fichiers Crontab dans des répertoires tels que /etc/cron.d, /etc/cron.daily, /etc/cron.weekly, etc
  • Des applications Web. Par exemple, les scripts CGI ou les pages PHP invoquées par un serveur Web
  • Des applications réseau qui ont des ports ouverts

Pour vous aider, AppArmor fournit l’utilitaire aa-unconfined qui liste les processus avec des ports TCP ou UDP qui n’ont pas de profils configurés.

La commande aa-unconfined qui liste les applications sensubles non confinés

Qu’est-ce qu’un profile AppArmor

Les profils de sécurité d’AppArmor définissent complètement les ressources du système.
C’est à dire comment les programmes individuels peuvent accéder et avec quels privilèges.
Un certain nombre de politiques par défaut sont incluses avec AppArmor, et en utilisant une combinaison d’analyse statique avancée et d’outils basés sur l’apprentissage, les politiques d’AppArmor pour des applications même très complexes peuvent être déployées avec succès en quelques heures.

Les profils sont stockés dans /etc/apparmor.d/.
Il convient de créer un profil par binaire.
Pour cela, AppArmor fournit des profils pour les binaires les plus courants via les paquets apparmor-profiles et apparmor-profiles-extra.
Il est aussi possible de gérer automatiquement un profil grâce à aa-genprof.
Enfin il est possible d’en télécharger sur le net.

Quelle est structure d’un profile AppArmor

Voici à quoi ressemble un profil AppArmor :

Exemple de profile AppArmor
  •  Détermine les privilèges qu’un processus restreint est autorisé à utiliser :
/usr/bin/nginx {

  capability dac_override,
  capability dac_read_search,
  capability net_bind_service,
  capability setgid,
  capability setuid,
  • Détermine les accès aux binaires en lecture ou écriture. Cela peut être d’autres binaires, des fichiers ou dossiers :
    • a : append – peut écrire à la fin du fichier
    • r : lecture
    • w : écriture
    • m : memory map comme exécutable
    • k : verrouillage de fichiers
    • l : créer des liens durs
    • rl : le mode de liaison accorde l’autorisation de créer un lien vers des fichiers arbitraires, à condition que le lien ait un sous-ensemble des autorisations accordées par la cible (test d’autorisation de sous-ensemble).
    • ix : exécution et héritage de ce profil
    • px : exécution sous un autre profil, après le nettoyage de l’environnement
    • ux : exécution non raffiné, Après avoir nettoyé l’environnement
/usr/bin/nginx mr,
/run/nginx.pid rw,
/etc/nginx/mime.types r,
/etc/nginx/nginx.conf r,
/etc/nginx/nginx.d/* r, 
/etc/nginx/snippets/* r,
owner /etc/nginx/nginx.d/ r,
owner /etc/nginx/snippets/ r,

Ci-dessous on donne accès aux fichiers et sous-répertoires où sont stockés les sites

/var/www/ r,
/var/www/** r,
  • Il faut pouvoir écrire dans le dossier des logs
 # logs
 /var/log/nginx/* w,
  • Puis les accès selon les besoins, par exemple dans le cas où letsencrypt est installé :
# letsencrypt
 /etc/letsencrypt/live/** r,

 # letsencrypt renew dir
 /var/lib/letsencrypt/ r,
 /var/lib/letsencrypt/.well-known r,
 /var/lib/letsencrypt/.well-known/* r,
 /var/lib/letsencrypt/.well-known/acme-challenge/* r,

Pour plus d’informations et apprendre à créer un profile AppArmor, suivez ce tutoriel :

Les modes de fonctionnement d’AppArmor

Le mode complain

Le mode complain est un mode d’apprentissage où AppArmor ne bloque au accès.
Simplement, il rapporte les accès interdits dans les logs.
Cela permet d’affiner le profil avant de le passer en mode enforce.

Le mode enforce

Dans le mode enforce, AppArmor bloque les accès qui ne sont pas autorisés dans le profil de l’exécutable.
Les blocages sont aussi reportés dans les logs.

Comment visualiser les profils

La commande aa-status permet de vérifier les profils et leurs modes respectifs.

Comment installer AppArmor sur Linux ?

Si vous souhaitez mettre en place AppArmor sur Linux, dans le cas de Debian ou Ubuntu suivez ce tutoriel :

AppArmor sur Debian/Ubuntu : Installation et configuration