SELinux

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
# setenforce [ Enforcing | Permissive | 1 | 0 ]

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.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
[...]

SELINUX=enforcing

[...]

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
unconfined_u:object_r:user_tmp_t:s0 /tmp/file_ToCopy.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
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file_ToCopy.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
[...] 
/usr/share/w3c/cgi-bin(/.*)? all files system_u:object_r:w3c_validator_script_exec_t:s0
/var/www/[^/]*/cgi-bin(/.*)? all files system_u:object_r:httpd_sys_script_exec_t:s0
/var/www/cgi-bin(/.*)? all files system_u:object_r:httpd_sys_script_exec_t:s0
/var/www/cgi-bin/apgui(/.*)? all files system_u:object_r:apcupsd_cgi_script_exec_t:s0
/var/www/cgi-bin/cgit regular file system_u:object_r:git_script_exec_t:s0
/var/www/cgi-bin/cvsweb\.cgi regular file system_u:object_r:cvs_script_exec_t:s0
/var/www/cgi-bin/keyst(/.*)? all files system_u:object_r:keystone_cgi_script_exec_t:s0
[...]

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 run restorecon 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
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
[...]

Lister les booléens cgi :

# getsebool -a | grep cgi
git_cgi_enable_homedirs --> off
git_cgi_use_cifs --> off
git_cgi_use_nfs --> off
httpd_enable_cgi --> on

Modifier le contexte de git_cgi_use_nfs :

# setsebool git_cgi_use_nfs on

Lister :

# getsebool -a | grep cgi
git_cgi_enable_homedirs --> off
git_cgi_use_cifs --> off
git_cgi_use_nfs --> on
httpd_enable_cgi --> on

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
git_cgi_use_cifs --> off
git_cgi_use_nfs --> on
httpd_enable_cgi --> on

Afficher les valeurs booléenes et des informations supplémentaires :

# semanage boolean -l
[...]
git_cgi_enable_homedirs (off , off) Allow git to cgi enable homedirs
git_cgi_use_cifs (off , off) Allow git to cgi use cifs
git_cgi_use_nfs (off , off) Allow git to cgi use nfs
httpd_enable_cgi (on , on) Allow httpd to enable cgi
[...]

/!\ 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
# setenforce [ Enforcing | Permissive | 1 | 0 ]

Affiche le contexte avec l’option -Z

# ps axZ                
# ps -ZC <NomProcessus>
# ls -Z <path>

Contexte de fichiers

Gérer le contexte des FICHIERS

# chcon -t <nomContexte> <path> // Modifie le contexte

# restorecon -(R)v <path> // Restaure le contexte
# restorecon -vFR <path> // RESTAURER le contexte


# semanage fcontext -a -t <context> <path> // Ajoute une politique de contexte de fichier

# semanage fcontext -l // Liste les règles de politique de contexte
# semanage fcontext -l -C // Affiche les personnalisations de la politique par défaut
# semanage fcontext -d // Supprimme une règle

# semanage boolean -l // Affiche toutes les valeurs booléennes
# semanage boolean -l // Affiche les valeurs booléennes modifiées

Booléens

Gérer les booléens

# getsebool -a                       // Affiche toutes les valeurs booléennes
# getsebool <valeur_bool> // Affiche une valeur booléenne
# setsebool <valeur_bool> on|off // Active|Désactive une valeur booléenne
# setsebool -P <valeur_bool> on|off // PERSISTANT - Active|Désactive une valeur booléenne

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
policycoreutils-python-utils

Cas pratique

Modification du mode d’exécution SELinux

Vérifier le mode actuel de SELinux :

[root@SERVER01 ~]# getenforce
Enforcing

Changer le mode via le fichier de configuation /etc/selinux/config :

[root@SERVER01 ~]# vim /etc/selinux/config
[...]
#SELINUX=enforcing
SELINUX=permissive
[...]

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
Enforcing

Appliquer le mode permissive :

[root@SERVER01 ~]# setenforce 0
[root@SERVER01 ~]# getenforce
Permissive

Si on vérifie le fichier /etc/selinux/config, ce dernier n’a toujours pas changé :

[root@SERVER01 ~]# grep '^SELINUX' /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted

On repasse à enforcing le mode SELinux :

[root@SERVER01 ~]# setenforce 1
[root@SERVER01 ~]# getenforce
Enforcing

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
[root@SERVER01 ~]# echo "My Awesome blog on SERVER01 !" >> /MyBlog/index.html

Changement de la configuration d’Apache pour que le répertoire par défaut soit /MyBlog :

[root@SERVER01 ~]# vim /etc/httpd/conf/httpd.conf
[...]
DocumentRoot "/MyBlog"
[...]
<Directory "/MyBlog">
[...]

Démarrage du service Apache et vérification :

[root@SERVER01 ~]# systemctl enable --now httpd
[root@SERVER01 ~]# systemctl status 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
Relabeled /MyBlog from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /MyBlog/index.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

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
Remember to run restorecon after you set the file context

Add file-context httpd_sys_content_t for everything under /web
# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
# restorecon -R -v /web

Substitute /home1 with /home when setting file context. For i.e. label everything under /home1 the same way /home is labeled
# semanage fcontext -a -e /home /home1
# restorecon -R -v /home1

For home directories under top level directory, for example /disk6/home, execute the following commands.
# semanage fcontext -a -t home_root_t "/disk6"
# semanage fcontext -a -e /home /disk6/home
# restorecon -R -v /disk6

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
<IfModule mod_userdir.c>
[...]
# UserDir disabled // Commenter
[...]
UserDir public_html // Décommenter
[...]

Démarrage du service Apache et vérification :

[root@SERVER01 ~]# systemctl enable --now httpd
[root@SERVER01 ~]# systemctl status httpd

Création de contenu dans ~/public_html :

[aline@SERVER01 ~]$ mkdir ~/public_html
[aline@SERVER01 ~]$ echo "This is Aline awesome content on SERVER01 \0/" >> ~/public_html/index.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 ~
[aline@SERVER01 ~]$ ls -ld ~
drwx--x--x. 16 aline aline 4096 Nov 3 09:28 /home/aline

À 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
[...]
httpd_enable_homedirs --> off
[...]

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)

> Partager <