SELinux (Security-Enhanced Linux) protège les ressources en permettant de définir une politique de contrôle d’accès obligatoire aux ressources d’un système Linux.
SELinux applique des règles d’accès définissant les actions autorisées entre les différents processus et ressources. Toute action non définie dans une règle n’est pas autorisée.
Sa principale fonction est de protéger les données utilisateurs contre toute utilisation inappropriée des services, ports, processus ou applications.
Ces protections n’empêchent cependant pas des accès non souhaités, elles ne contrôlent pas l’utilisation d’un fichier mais les personnes autorisées à le lire, l’exécuter ou écrire.
Modes de fonctionnement, Contextes SELinux et booléens
Modes de fonctionnement
SELinux a 3 modes de fonctionnement :
- Enforcing : Applique les politiques chargées
- Mode par défaut dans RHEL
- Permissive : Charge les politiques et est actif
- N’applique pas les règles de contrôle d’accès
- Logue les accès non autorisés
- Pour tester les applications et les règles, et résoudre les problèmes
- Disabled : SELinux est désactivé (déconseillé)
- Les actions ne sont ni refusées ni loguées
Ces 3 modes peuvent être définis de façon persistante ou pas, il s’agit de la configuration génerale du système.
Contextes SELinux
Chaque ressource (fichier, répertoire, processus, port, …) possède une étiquette appelée contexte SELinux et se terminent généralement par _t
.
Les contextes sont stockés dans les attributs étendus des fichiers dans le filsystem.
L’étiquette correspond à une règle définie pour autoriser un processus à accéder à la ressource étiquetée.
Exemple d’étiquette :
unconfined_u:objetc_r:httpd_sys_content_t:S0/var/www/html/index.html |
Signification des champs de cette étiquette :
- user :
unconfined_u
- role :
objetc_r
- type :
httpd_sys_content_t
- security level :
S0
- cible :
/var/www/html/index.html
Soit :
SELinuxUser:Role:Type:Level/Chemin_Cible |
Les booléens
Les booléens permettent de gérer les règles de politique SELinux de façon plus granulaire (propre aux applications).
Gestion des modes de fonctionnement, des Contextes et des booléens
Difference entre changement de contexte, contexte et booléen ?
- Changement de contexte : il s’agit de la configuration génerale du système
getenforce
setenforce
- Contexte : c’est une étiquette sur un fichier pour que SELinux puisse prendre des decisions sur les règles déjà en place
chcon
restorecon
semanage fcontext
semanage boolean
(affichage)ls -Z
- Booléen : c’est une modification dans les règles elles-mêmes
setsebool
passage àon
|off
getsebool
passage àon
|off
Gestion des modes de fonctionnement
Modification
La commande getenforce
affiche le mode SELinux actuel et setenforce
modifie le mode SELinux :
# getenforce |
Definition persistante
Pour configurer SELinux de façon PERSISTANTE il faut modifier /etc/selinux/config
:
# This file controls the state of SELinux on the system. |
Pour que la configuration soit prise en compte il faudra reboot la machine.
Gestion des contextes de fichiers
Les commandes semanage fcontext
, restorecon
et chcon
permettent de gérer le contexte SELinux des fichiers.
Il est également possible de le lister avec ls -Z
.
contexte de fichier par défaut et héritage
Les fichiers héritent ou concervent leur contexte en fonction d’une copie ou d’un déplacement.
Ici 2 fichiers dans /tmp
avec le contexte propre au dossier /tmp
:
# ls -Z /tmp |
unconfined_u:object_r:user_tmp_t:s0 /tmp/file_ToMove.txt |
En déplaçant file_ToMove.txt
et en copiant file_ToCopy.txt
, on voit que seul le contexte de file_ToCopy.txt
a changé (puiqu’il s’agit d’un nouveau fichier, avec un inode différent, il a hérité du contexte du répertoire parent) :
# ls -Z /var/www/html/ |
unconfined_u:object_r:user_tmp_t:s0 /var/www/html/file_ToMove.txt |
Modifier le contexte de fichier
Les commandes chcon
et restorecon
permettent de changer et de restaurer un contexte de fichiers.
Ce répertoire a un contexte SELinux default_t
hérité de son répertoire parent :
# ls -Zd /My_Directory |
unconfined_u:object_r:default_t:s0 /My_Directory |
On change son contexte en httpd_sys_content_t
avec chcon
:
# chcon -t httpd_sys_content_t /My_Directory |
Résultat :
# ls -Zd /My_Directory |
unconfined_u:object_r:httpd_sys_content_t:s0 /My_Directory |
On rétabli la valeur par défaut du contexte avec restorecon
:
# restorecon -v /My_Directory |
Relabeled /My_Directory from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 |
Résultat :
# ls -Zd /My_Directory |
unconfined_u:object_r:default_t:s0 /My_Directory |
Gérer les politiques de contexte de fichier
Les commandes semanage fcontext
et restorecon
permettent de gérer et de restaurer un contexte de fichiers.
Pour lister TOUTES les politiques de contexte :
# semanage fcontext -l |
[...] |
Pour ajouter une politique de contexte de fichier SELinux sur un répertoire :
# semanage fcontext -a -t httpd_sys_content_t '/MyDirectory(/.*)?' |
Pour restaurer le contexte par défaut sur un répertoire et toute sa sous-arboressence :
# restorecon -RFvv /MyDirectory |
Pour afficher les modifications :
# semanage fcontext -l -C |
/!\ Important : Page du Manuel semanage fcontext
MANUEL
– EXAMPLE
– – Remember to runrestorecon
after you set the file context
– – Add file-context for everything under /web
– –# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
Gérer les politiques avec les booléens
Les commandes setsebool
, getbool
et semanage boolean -l
permettent de gérer les règles de politique SELinux de façon plus granulaire (propre aux applications).
Afficher les valeurs booléenes :
# getsebool -a |
abrt_anon_write --> off |
Lister les booléens cgi
:
# getsebool -a | grep cgi |
git_cgi_enable_homedirs --> off |
Modifier le contexte de git_cgi_use_nfs
:
# setsebool git_cgi_use_nfs on |
Lister :
# getsebool -a | grep cgi |
git_cgi_enable_homedirs --> off |
Pour rendre une modification PERSISTANTE on utilise -P
:
# setsebool -P git_cgi_enable_homedirs on |
Après un reboot, lister :
# getsebool -a | grep cgi |
git_cgi_enable_homedirs --> on |
Afficher les valeurs booléenes et des informations supplémentaires :
# semanage boolean -l |
[...] |
/!\ Résumé des commandes
Changement de contexte - Contexte de fichier - Booléens
Difference entre changement de contexte, contexte de fichier et booléen ?
- Changement de contexte : il s’agit de la configuration génerale du système
getenforce
setenforce
- Contexte : c’est une étiquette sur un fichier pour que SELinux puisse prendre des decisions sur les règles déjà en place
chcon
restorecon
semanage fcontext
semanage boolean
(affichage)ls -Z
- Booléen : c’est une modification dans les règles elles-mêmes
setsebool
passage àon
|off
getsebool
passage àon
|off
Commandes
Changement de contexte
Affiche|Modifie le contexte
# getenforce |
Affiche le contexte avec l’option -Z
# ps axZ |
Contexte de fichiers
Gérer le contexte des FICHIERS
# chcon -t <nomContexte> <path> // Modifie le contexte |
Booléens
Gérer les booléens
# getsebool -a // Affiche toutes les valeurs booléennes |
Fichiers
Modification PERSISTANTE
/etc/selinux/config |
Contexte par defaut des répertoires
/etc/selinux/targeted/contexts/files/file_contexts |
Paquets
Paquets pour gérer les contextes restorecon
et semanage
policycoreutils |
Cas pratique
Modification du mode d’exécution SELinux
Vérifier le mode actuel de SELinux :
[root@SERVER01 ~]# getenforce |
Changer le mode via le fichier de configuation /etc/selinux/config
:
[root@SERVER01 ~]# vim /etc/selinux/config |
En vérifiant le mode, il n’a pas été appliqué, on reste sur du enforcing
. Pour l’appliquer, il faudra rebooter la machine :
[root@SERVER01 ~]# getenforce |
Appliquer le mode permissive
:
[root@SERVER01 ~]# setenforce 0 |
Si on vérifie le fichier /etc/selinux/config
, ce dernier n’a toujours pas changé :
[root@SERVER01 ~]# grep '^SELINUX' /etc/selinux/config |
On repasse à enforcing
le mode SELinux :
[root@SERVER01 ~]# setenforce 1 |
Contrôle des contextes de fichier SELinux
Création de contenu pour un site Web hors du répertoire par défault d’Apache :
[root@SERVER01 ~]# mkdir /MyBlog |
Changement de la configuration d’Apache pour que le répertoire par défaut soit /MyBlog
:
[root@SERVER01 ~]# vim /etc/httpd/conf/httpd.conf |
Démarrage du service Apache et vérification :
[root@SERVER01 ~]# systemctl enable --now httpd |
En ouvrant la page web index.html
de notre blog à http://SERVER01/index.html :
Forbidden You don't have permission to access this resource. |
Pour accorder les droits d’accès de index.html
sur SERVER01, il faut modifier le contexte SELinux httpd_sys_content_t pour le répertoire /MyBlog
et sa sous-arboressence :
[root@SERVER01 ~]# semanage fcontext -a -t httpd_sys_content_t '/MyBlog(/.*)?' |
Application du contexte dans le répertoire /MyBlog
:
[root@SERVER01 ~]# restorecon -Rv /MyBlog |
Maintenant la page est accessible :
My Awesome blog on SERVER01 ! |
Page du manuel qui reprend le cas ci-dessus
Page de manuel de semanage-fcontext
qui reprend cet exemple :
EXAMPLE |
Ajustement de SELinux avec les booléens
Permettre aux utilisateurs de publier du contenu Web à partir de leur répertoire personnel en configurant /etc/httpd/conf.d/userdir.conf
:
[root@SERVER01 ~]# vim /etc/httpd/conf.d/userdir.conf |
Démarrage du service Apache et vérification :
[root@SERVER01 ~]# systemctl enable --now httpd |
Création de contenu dans ~/public_html
:
[aline@SERVER01 ~]$ mkdir ~/public_html |
Il faut maintenant modifier les autorisations sur /home/aline
pour que le service d’Apache accéder au sous-répertoire public_html
:
[aline@SERVER01 ~]$ chmod 711 ~ |
À ce stade la page web http://SERVER01/~aline/index.html reste inaccessible :
Forbidden You don't have permission to access this resource. |
Vérification des valeurs booléennes avec getsebool
pour voir s’il existe des limitations avec le service httpd
:
[root@SERVER01 ~]# getsebool -a | grep home |
Activation de l’accès persistant (option -P
) au répertoire personnel pour httpd
avec setsebool
:
[root@SERVER01 ~]# setsebool -P httpd_enable_homedirs on |
Vérification sur http://SERVER01/~aline/index.html :
This is Aline awesome content on SERVER01 \0/ |
Documentation
https://fr.wikipedia.org/wiki/SELinux
MAN getenforce(8)
MAN setenforce(8)
MAN selinux_config(5)
MAN chcon(1)
MAN restorecon(8)
MAN semanage(8)
MAN semanage-fcontext(8)
MAN ftpd_selinux
MAN httpd_selinux
MAN booleans(8)
MAN getsebool(8)
MAN setsebool(8)
MAN semanage(8)
MAN semanage-boolean(8)