| name | sysadmin-selinux |
| description | SELinux : contextes, booleans, politiques personnalisées, audit2allow, semanage, enforcing/permissive, dépannage des denials et intégration avec services. |
| version | 1.0.0 |
| author | EVA |
| license | Privée EVA St-Étienne |
| platforms | ["linux"] |
| metadata | {"EVA":{"tags":["selinux","security","mandatory-access-control","policy","enforcement","audit","centos","rhel","fedora"],"related_skills":["os-rhel-engineering","os-linux-admin","sysadmin-logging","sysadmin-kernel-tuning"]}} |
SELinux (Security-Enhanced Linux)
Vue d'ensemble
SELinux est un module de sécurité du noyau Linux implémentant le Mandatory Access Control (MAC). Contrairement aux permissions traditionnelles (DAC - Discretionary Access Control) qui permettent à un utilisateur de modifier les droits de ses fichiers, SELinux applique une politique globale définie par l'administrateur — même root est limité.
Concepts fondamentaux :
- Contexte SELinux : étiquette (label) attachée à chaque fichier, processus, port, etc.
- Politique : ensemble de règles définissant ce qui est autorisé
- Sujet : processus (ex:
httpd_t)
- Objet : ressource (ex: fichier
httpd_sys_content_t)
- AVC : décision de contrôle d'accès (Allow/Deny)
Modes SELinux
| Mode | Comportement | Usage |
|---|
| Enforcing | Applique la politique, bloque les accès non autorisés | Production |
| Permissive | Log les violations sans bloquer | Débogage, transition |
| Disabled | SELinux désactivé complètement | Non recommandé |
getenforce
sestatus
sudo setenforce 0
sudo setenforce 1
sudo sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
Quand l'utiliser
- Un service refuse de démarrer ou d'accéder à ses fichiers → denial SELinux probable
- Configurer un service sur un port non standard (nginx sur 8080, SSH sur 2222)
- Déployer une application avec des chemins de fichiers personnalisés
- Durcir un serveur en production
- Diagnostiquer des "Permission denied" alors que les permissions DAC sont correctes
1. Contextes SELinux
Chaque fichier, processus, port et répertoire possède un contexte :
ls -Z /var/www/html/index.html
Restaurer le Contexte
sudo restorecon -v /var/www/html/index.html
sudo restorecon -Rv /var/www/
sudo restorecon -Rv /etc/
Modifier un Contexte
sudo semanage fcontext -a -t httpd_sys_content_t "/data/custom/nginx(/.*)?"
sudo restorecon -Rv /data/custom/nginx/
sudo semanage fcontext -l | grep httpd
2. Booleans SELinux
Les booleans permettent d'activer/désactiver des fonctionnalités sans réécrire la politique :
getsebool -a
semanage boolean -l | head -20
getsebool httpd_can_network_connect
getsebool httpd_enable_homedirs
sudo setsebool -P httpd_can_network_connect on
sudo setsebool -P httpd_enable_homedirs on
sudo setsebool -P samba_export_all_rw on
Booleans Fréquents
httpd_can_network_connect
httpd_can_network_connect_db
httpd_can_sendmail
httpd_enable_homedirs
ftpd_full_access
allow_ftpd_full_access
samba_export_all_rw
pgsql_use_nfs
ssh_chroot_rw_homes
3. Dépannage des Denials (AVC)
Avec auditd
sudo tail -f /var/log/audit/audit.log | grep AVC
sudo ausearch -m avc --start today
sudo ausearch -m avc --start today -i
Avec journald (si auditd pas installé)
journalctl -k | grep -i "denied\|avc\|selinux"
dmesg | grep -i selinux
Audit2allow — Générer une Politique Personnalisée
L'outil le plus important pour résoudre les denials SELinux :
sudo setenforce 0
sudo setenforce 1
sudo grep "denied" /var/log/audit/audit.log | audit2allow -M monapp_policy
sudo semodule -i monapp_policy.pp
journalctl -k | grep -i denied | audit2allow -M monapp_policy
sudo semodule -i monapp_policy.pp
Audit2why — Expliquer les Denials
sudo ausearch -m avc --start today | audit2why
4. Ports — Définir un Contexte pour un Port Non Standard
sudo semanage port -a -t http_port_t -p tcp 8080
sudo semanage port -l | grep http
sudo semanage port -a -t ssh_port_t -p tcp 2222
5. Politiques Personnalisées (Avancé)
cat > myapp.te << 'EOF'
policy_module(myapp, 1.0.0)
require {
type httpd_t;
type httpd_sys_content_t;
class tcp_socket connect;
class file { read write };
}
allow httpd_t myapp_data_t:file { read write create unlink };
EOF
sudo checkmodule -M -m -o myapp.mod myapp.te
sudo semodule_package -o myapp.pp -m myapp.mod
sudo semodule -i myapp.pp
6. SELinux et Conteneurs (Docker, Podman)
docker info | grep -i selinux
{
"selinux-enabled": true
}
podman run --security-opt label=type:svirt_sandbox_t -d nginx
7. Procédure de Diagnostic Rapide
#!/bin/bash
set -euo pipefail
echo "=== MODE SELINUX ==="
getenforce
echo -e "\n=== 10 DERNIERS DENIALS ==="
sudo ausearch -m avc --start today -i --just-one 2>/dev/null | tail -10 || \
journalctl -k --no-pager | grep -i "denied" | tail -10
echo -e "\n=== SOLUTION RAPIDE ==="
sudo ausearch -m avc --start today 2>/dev/null | audit2allow -a || \
echo "Aucun denial trouvé"
echo -e "\n=== BOOLEANS COURANTS ==="
getsebool httpd_can_network_connect httpd_enable_homedirs httpd_can_sendmail 2>/dev/null || true
Pièges Courants
-
Désactiver SELinux au lieu de le configurer : setenforce 0 en permanence supprime la couche de sécurité MAC. Toujours utiliser audit2allow pour créer une politique.
-
SELinux disabled vs permissive : Disabled signifie que les labels ne sont même pas appliqués au boot. Si vous passez de disabled à enforcing, tous les contextes système doivent être relabelés :
sudo fixfiles onboot
sudo reboot
-
Contextes perdus après mv/cp : cp préserve le contexte, mv aussi (car le fichier ne change pas). Mais une archive tar extraite aura des contextes inconnus → toujours faire restorecon -Rv après extraction.
-
Oublier le flag -P sur setsebool : Sans -P, la modification est perdue au reboot.
-
auditd pas installé : SELinux envoie les AVC à auditd. Si auditd n'est pas en service, les logs sont dans dmesg / journalctl -k mais pas dans ausearch.
Liste de vérification (Checklist)