SELinux, trop de gens le désactivent alors que ce n'est pas du tout compliqué à utiliser.
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 :
J'ai aussi entendu parler de setroubleshoot, mais je ne l'ai jamais utilisé.
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
sestatus
getenforce
Il peut être enforce ou permissif.
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.
getsebool -a | grep http
getsebool <nomduboolean_sans_erreur>
semanage boolean -l
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.
setenforce 0
setenforce 1
grep denied /var/log/audit/audit.log audit2allow -w -a
getsebool -a | grep <nomduboolean> setsebool -P httpd_can_network_connect=0 (ou =1)
1 = action équivalente autorisée
0 = action équivalente refusée
audit2allow -a -M monmodule : pour générer mon module semodule -i monmodule.pp # pour installer mon module
echo > /var/log/audit/audit.log
5 - Contexte de sécurité des fichiers et répertoires
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
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.
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.
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/liveBeau travail de restorecon.
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
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.
L'information, n'est-elle pas précieuse ? Partageons la tous ensemble !
© Juillet 2020
Roger YERBANGA
www.yerbynet.com