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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn