Aller au contenu
Infrastructure as Code medium

Module SELinux Ansible : modes, booléens, contextes

9 min de lecture

Logo Ansible

SELinux est le système de contrôle d’accès obligatoire activé par défaut sur RHEL/AlmaLinux/Rocky en mode enforcing. Ansible expose 3 modules complémentaires pour le piloter :

  • ansible.posix.selinux: — état global (enforcing / permissive / disabled) + politique active.
  • ansible.posix.seboolean: — activer/désactiver les booléens SELinux.
  • community.general.sefcontext: — gérer les contextes de fichiers (avec restorecon pour appliquer).

Collections requises : ansible-galaxy collection install ansible.posix community.general. Prérequis paquets sur le managed node : python3-libselinux + policycoreutils-python-utils.

  • Vérifier et modifier l’état SELinux global (modes).
  • Activer un booléen avec persistance (persistent: true).
  • Définir un contexte de fichier custom + restorecon -R.
  • Comprendre pourquoi state: disabled nécessite un reboot.
  • Diagnostiquer un service qui plante “à cause de SELinux”.
  • Avoir ansible.posix et community.general installés.
  • Sur le managed node : python3-libselinux + policycoreutils-python-utils (les modules SELinux Ansible nécessitent ces bindings Python).
ModeEffet
enforcingContraintes appliquées + violations bloquées (production RHEL)
permissiveViolations loguées mais pas bloquées (debug)
disabledSELinux complètement désactivé (à éviter en prod)
- name: SELinux en enforcing (recommande prod)
ansible.posix.selinux:
policy: targeted
state: enforcing
- name: Passer en permissive (debug temporaire)
ansible.posix.selinux:
policy: targeted
state: permissive

Le module modifie /etc/selinux/config (effet après reboot) ET applique le mode maintenant (setenforce).

state: disabled nécessite un reboot pour prendre effet — le kernel doit recharger la politique. getenforce continue à afficher Enforcing jusqu’au reboot.

Les booléens sont des switches qui activent/désactivent des règles spécifiques de la politique. Sur RHEL 10, on en compte ~300.

BooléenEffet
httpd_can_network_connecthttpd peut faire des connexions sortantes
httpd_can_network_connect_dbhttpd peut se connecter à une DB distante
httpd_enable_homedirshttpd peut servir ~user/public_html/
nfs_export_all_rwNFS export en read-write
samba_enable_home_dirsSamba peut partager les homes
- name: Autoriser httpd a se connecter au reseau (persistant)
ansible.posix.seboolean:
name: httpd_can_network_connect
state: true
persistent: true

persistent: true est critique en production : sans, le changement est perdu au reboot et le service replante avec les mêmes erreurs SELinux.

getsebool -a | grep httpd liste les booléens disponibles.

Cas typique : déployer une app web dans un dossier custom (pas /var/www/html/). SELinux refuse à httpd de servir des fichiers qui n’ont pas le bon contexte.

- name: Definir le contexte httpd_sys_content_t pour /var/www/myapp
community.general.sefcontext:
target: '/var/www/myapp(/.*)?'
setype: httpd_sys_content_t
state: present
- name: Appliquer le contexte (restorecon)
ansible.builtin.command: restorecon -Rv /var/www/myapp
register: restorecon_result
changed_when: "'relabeled' in restorecon_result.stdout"

Étapes :

  1. sefcontext: ajoute la règle dans la politique (équivalent semanage fcontext -a).
  2. restorecon -R applique la règle aux fichiers existants (sinon ils gardent leur ancien contexte).

Convention regex : (/.*)? à la fin pour matcher le dossier ET tous ses sous-éléments.

Si SELinux bloque, audit.log contient des entries type=AVC msg=audit ... denied :

Fenêtre de terminal
ssh ansible@db1.lab 'sudo grep denied /var/log/audit/audit.log | tail -5'

L’outil audit2allow (paquet policycoreutils-python-utils) génère un module SELinux qui autorise exactement ce qui est bloqué :

Fenêtre de terminal
sudo audit2allow -a -M myapp_local
sudo semodule -i myapp_local.pp

Mais : ne jamais audit2allow -a -M aveuglément en prod — c’est souvent une mauvaise idée. Préférer corriger le contexte (sefcontext) ou activer un booléen.

Pattern dangereux observé en prod :

# ❌ Mauvaise pratique — desactive SELinux "pour que ca marche"
- ansible.posix.selinux:
state: disabled

Risques :

  • Surface d’attaque augmentée : SELinux est une couche de défense critique contre les exploits.
  • Audit échoué : RHCE EX294, CIS Benchmark, ANSSI exigent SELinux activé.
  • Drift dev/prod : le code marche en dev (SELinux off) mais plante en prod (SELinux on).

Bonne pratique : passer en permissive pour debug → identifier les contextes/booléens manquants → corriger → revenir en enforcing.

SymptômeCauseFix
state: disabled ignoréPas de rebootReboot nécessaire pour disabled
seboolean perdu au rebootOubli de persistent: trueToujours persistent: true en prod
Fichiers sans le bon contexte après deployOubli de restorecon -RLancer restorecon -R après sefcontext:
Module SELinux failedManque python3-libselinux ou policycoreutils-python-utilsInstaller les prérequis Python
  • ansible.posix.selinux: = état global (enforcing / permissive / disabled).
  • ansible.posix.seboolean: = booléens — toujours persistent: true en prod.
  • community.general.sefcontext: + restorecon -R = contextes de fichiers.
  • state: disabled nécessite un reboot.
  • policycoreutils-python-utils doit être installé sur le managed node.
  • Ne jamais désactiver SELinux sauf cas critique documenté.

Cette page a un lab d’accompagnement : labs/modules-rhel/selinux/ dans stephrobert/ansible-training.

Challenge — sur db1.lab :

  1. Installer les prérequis Python SELinux.
  2. SELinux en enforcing.
  3. Activer httpd_can_network_connect persistant.
  4. Définir httpd_sys_content_t sur /var/www/myapp/ + restorecon.

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook solution.yml
pytest -v labs/modules-rhel/selinux/challenge/tests/

4 tests vérifient enforcing, booléen on, et contexte appliqué.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn