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 ou applications.

Mode 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

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 stockes dans les attributs etendus des fichiers dans le filsystem.

L’étiquette correspond à une règle définie pour autoriser un processus à accéder à la ressource étiquetée.

Exemple :

unconfined_u:objetc_r:httpd_sys_content_t:S0/var/www/html/index.html

Les étiquettes ont les champs :

  • user : unconfined_u
  • role : objetc_r
  • type : httpd_sys_content_t
  • security level : S0
  • cible : /var/www/html/index.html

Gestion des modes de fonctionnement

Modification

Les commandes 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 :

[...]
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 par défaut et héritage

Les fichiers héritent ou concervent leurs 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

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 sont contexte en httpd_sys_content_t avec chcon :

# chcon -t httpd_sys_content_t /My_Directory

# 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

# ls -Zd /My_Directory
unconfined_u:object_r:default_t:s0 /My_Directory

Gérer les politiques de contexte

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-markup-validator/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/apcgui(/.*)? 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/keystone(/.*)? 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

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
[...]

⚠️ Résumé des commandes

Commandes :

// Affiche|Modifie le contexte
# getenforce
# setenforce < Enforcing | Permissive | 1 | 0 >
// Affiche le contexte
# ps axZ
# ps -ZC <NomProcessus>
# ls -Z <chemin>
// Gérer le contexte des FICHIERS

# chcon -t <nomContexte> <Chemin> // Modifie le contexte
# restorecon -(R)v <Chemin> // Restaure le contexte
# restorecon -vFR <chemin> // RESTAURER le contexte

# semanage fcontext -a -t <contexte> <chemin> // 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

# 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 :

/etc/selinux/config     // Modification PERSISTANTE
/etc/selinux/targeted/contexts/files/file_contexts // Contexte par defaut des répertoires

Paquets pour gérer les contextes (restorecon et ``semanage`):

  • policycoreutils
  • policycoreutils-python-utils

Résumé : Difference entre changement de contexte et booléen ?

  • Changement de contexte (configuration génerale) = getenforce, setenforce
  • Contexte = etiquette sur un fichier pour que SELinux puisse prendre des decisions sur les regle : chcon
  • Booléen = modification dans les regles elles memes, passage on|off : setsebool, getsebool

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 <