:.     Home     .:.     Cours     .:.     Faits divers     .:.     Blagues     .:.     Liens     .:.     Perso     .:

 

SELinux

 

SELinux, trop de gens le désactivent alors que ce n'est pas du tout compliqué à utiliser.

1 - Généralités

SELinux (Security-Enhanced Linux) est une architecture de sécurité pour systèmes Linux qui nous permet de renforcer les accès au système par divers applications, processus.

Par exemple, un apache aura uniquement accès à /var/www/.

Donc, même si Apache se fait compromettre, il ne pourra pas avoir accès aux autres ressources de la machine.

Ça ne va pas empêcher Apache de se faire compromettre (s'il est très mal configuré ou en cas de faille de sécurité), mais ca va empêcher au pirate qui arrive à exploiter la faille de rebondir sur une autre application ou donnée présente sur la même machine.

SELinux, c'est pour le monde Redhat. Apparmor fait à peu près la même chose dans le monde Debian.

2 éléments importants à retenir pour la suite :

  1. Le fichier audit.log
  2. La commande audit2allow

J'ai aussi entendu parler de setroubleshoot, mais je ne l'ai jamais utilisé.


2 - Configuration et activation de SELinux

Il est toujours bon d'activer SELinux dans la config /etc/selinux/config.

On peut le mettre en mode permissif (non bloquant).

Ce qui est interessant, c'est qu'on peut passer du permessif ou mode enforcing à chaud sans reboot de la machine.

Par contre, lorsque SELinux est désactivé, une réactivation nécessite forcément un redémarrage.

C'est pour cela qu'il est toujours préférable de l'activer et de le mettre en mode permissif, le temps de corriger tous les blocages (faux-positifs) qu'on détectera.

Dans /etc/selinux/config, on pourra mettre : SELINUX=permissive ou SELINUX=enforcing. Cela va nécessiter un redémarrage.

setenforce 1  : va mettre la machine en mode enforcing sans redémarrage, mais au redémarrage le mode sera lu dans /etc/selinux/config.

setenforce 0  : va mettre la machine en mode permissif sans redémarrage, mais au redémarrage le mode sera lu dans /etc/selinux/config.


3 - Vérifications et lecture des booléens

  • Quelle est la configuration actuelle de SELinux :
sestatus
  • Trouver le mode courant de SELinux
getenforce

Il peut être enforce ou permissif.

  • Voir si tout va bien :
grep denied /var/log/audit/audit.log

Si le grep donne des résultats, c'est qu'il y a des actions ont été bloquées.Si vous êtes enmode développement,c'est que c'est probablement des opérations légitimes.

Il faut les corriger en utilisant audit2allow ou bien modifier le boolean en cause.

  • Trouver la liste de tous les booléens et leurs valeurs (par exemple, qui comprennent http) :
getsebool -a | grep http
  • Trouver un booléen en particulier
getsebool <nomduboolean_sans_erreur>
  • Plus de détails sur les booleans :
semanage boolean -l 

4 - Modifications des booléens et création de modules

Quand on a trop de faux-blocages (denied dans audit.log), il faut passer en mode permissif pour ne pas compromettre la bonne marche des services.

Passer en mode permissif va permettre de logguer les denied, mais de ne pas réellement les exécuter.

  • Pour passer en mode permissif
setenforce 0
  • Passer en mode enforcing
setenforce 1
  • Traduction des denied en langage humain
grep denied /var/log/audit/audit.log
audit2allow -w -a
  • Modifier un booléen avec setsebool
getsebool -a | grep <nomduboolean>
setsebool -P httpd_can_network_connect=0 (ou =1)

1 = action équivalente autorisée

0 = action équivalente refusée

  • Conversion des denied en module et installation
audit2allow -a -M monmodule : pour générer mon module
semodule -i monmodule.pp  # pour installer mon module
  • Une fois qu'on a corrigé tous les problèmes de denied à un instant T donné, on remet les compteurs à 0 avec un echo :
echo > /var/log/audit/audit.log


5 - Contexte de sécurité des fichiers et répertoires

  • Lister le répetoire avec ls
ls -alZ

Ici, il s'agit de l'utilisation de l'option Z qui nous donne le contexte de sécurité des fichiers et répertoires.

Ça nous permettra aussi de détecter si nos fichiers sont dans les bons contextes.

On parle ici de utilisateur:rôle:type:niveau

Exemples :

ls -Z /etc/postfix/main.cf 
  -rw-r--r--. root root system_u:object_r:postfix_etc_t:s0 /etc/postfix/main.cf
ls -Z /home/ryerbanga/.bash_logout 
  -rw-r--r--. ryerbanga ryerbanga unconfined_u:object_r:user_home_t:s0 /home/ryerbanga/.bash_logout
ls -Z /home/ryerbanga/fichierpostfix.test 
  -rw-r--r--. root root system_u:object_r:postfix_etc_t:s0 /home/ryerbanga/fichierpostfix.test
  utilisateur = system_u
  role = object_r
  type = postfix_etc_t
  niveau = s0
  • Modifer le contexte avec restorecon
restorecon # Méthode la plus facile qui se base sur le contexte du répertoire dans lequel se trouve le fichier

Avant d'utiliser restorecon, on peut utiliser matchpathcon pour voir quel contexte devrait posséder le fichier

matchpathcon fichierpostfix.test
  fichierpostfix.test	 unconfined_u:object_r:user_home_t:s0
restorecon /home/ryerbanga/fichierpostfix.test
ls -Z /home/ryerbanga/fichierpostfix.test 
  -rw-r--r--. root root system_u:object_r:user_home_t:s0 /home/ryerbanga/fichierpostfix.test

On se rend compte que restorecon ne s'occupe pas du user. De toute façon, selon mon expérience, le plus important c'est le type.

  • chcon :

On peut utiliser chcon pour être plus granulaire et modifier manuellement uniquement ce qu'on veut (soit le type, le user, ...).

chcon -u unconfined_u -r object_r -t user_home_t /home/ryerbanga/fichierpostfix.test

Par contre, les modifications de chcon peuvent ne pas survivent au ré-etiquettage du disque (qui va se produire après un restorecon ou un redémarrage).

Ce n'est donc pas la bonne solution pour faire des changements de contexte qui se préoccupent de la pérennité et surtout du temps de débogage quand ça ne va plus marcher.

  • semanage :

Pour les raisons évoquées plus haut, on va utiliser semanage.

Démo :

ls -Z /etc/fichier
   -rw-r--r--. root root unconfined_u:object_r:etc_t:s0   /etc/fichier
semanage fcontext -a -t samba_share_t /etc/fichier
ls -Z /etc/fichier 
   -rw-r--r--. root root unconfined_u:object_r:etc_t:s0   /etc/fichier
restorecon -v /etc/fichier 
   restorecon reset /etc/fichier context unconfined_u:object_r:etc_t:s0->unconfined_u:object_r:samba_share_t:s0
ls -Z /etc/fichier 
   -rw-r--r--. root root unconfined_u:object_r:samba_share_t:s0 /etc/fichier

semanage va nous mettre une entrée dans le fichier /etc/selinux/targeted/contexts/files/file_contexts.local.

Ensuite, restorecon va lire ce fichier et appliquer le changement sur le fichier spécifié en argument.

Autre exemple : Répertoire /data/live/ et ses descendants

semanage fcontext -a -t httpd_sys_content_t '/data/live(/.*)?'
restorecon -R -v /data/live
Beau travail de restorecon.

6 - Processus

ps aux -Z
ps aux -Z | grep http
 system_u:system_r:httpd_t:s0    root      2566  0.0  0.0 224080  5048 ?        Ss   jun08   0:16 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache    2567  0.0  0.0 224216  3728 ?        S    jun08   0:00 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache    2568  0.0  0.0 224216  3736 ?        S    jun08   0:00 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache    2569  0.0  0.0 224216  3752 ?        S    jun08   0:00 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache    2570  0.0  0.0 224216  3740 ?        S    jun08   0:00 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache    2571  0.0  0.0 224216  3728 ?        S    jun08   0:00 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache   10158  0.0  0.0 224216  3728 ?        S    jun09   0:00 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache   10187  0.0  0.0 224216  3728 ?        S    jun09   0:00 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache   10189  0.0  0.0 224216  3712 ?        S    jun09   0:00 /usr/sbin/httpd -DFOREGROUND
 system_u:system_r:httpd_t:s0    apache   10190  0.0  0.0 224216  3712 ?        S    jun09   0:00 /usr/sbin/httpd -DFOREGROUND

7 - Utilisateurs

semanage login -l

À noter qu'il y a un mappage entre les utilisateurs systèmes et les utilisateurs SELinux.

L'utilisateur système va hériter des droits et devoirs de l'utilisateur SELinux sur lequel il est mappé.

Exemple :

semanage login -l

Login Name           SELinux User       Intervalle MLS/MCS   Service 

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
semanage user -l  #: Correspondance entre les utilisateurs SELinux et les rôles SELinux
                  
SELinux User    Préfixe    Niveau MCS Intervalle MCS                 Rôles SELinux 

guest_u         user       s0         s0                             guest_r
root            user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
staff_u         user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
sysadm_u        user       s0         s0-s0:c0.c1023                 sysadm_r
system_u        user       s0         s0-s0:c0.c1023                 system_r unconfined_r
unconfined_u    user       s0         s0-s0:c0.c1023                 system_r unconfined_r
user_u          user       s0         s0                             user_r
xguest_u        user       s0         s0                             xguest_r
id #(id dur root)
 uid=0(root) gid=0(root) groupes=0(root) contexte=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

8 - Résumé

Pour celui qui est pressé ou qui n'a pas le temps (ou bien même les deux), les deux sections les plus importantes sont Vérifications et Modifications.

Trouver les denied dans les logs : /var/log/audit/audit.log

Modifier les booléens avec (setsebool)

Utiliser audit2allow pour créer des modules quand les booléens ne suffisent pas.

semanage peut aussi être intéressant pour changer le contexte pour un répertoire.


Sources :



L'information, n'est-elle pas précieuse ? Partageons la tous ensemble !

 © Juillet 2020
Roger YERBANGA
www.yerbynet.com