SELinux
Introduction
"Security-Enhanced Linux, abrégé SELinux, est un Linux security module (LSM), qui permet de définir une politique de contrôle d'accès obligatoire aux éléments d'un système issu de Linux.
Son architecture dissocie l'application de la politique d'accès et sa définition. Il permet notamment de classer les applications d'un système en différents groupes, avec des niveaux d'accès plus fins. Il permet aussi d'attribuer un niveau de confidentialité pour l'accès à des objets systèmes, comme des descripteurs de fichiers, selon un modèle de sécurité multiniveau (MLS pour Multi level Security). SELinux utilise le modèle Bell LaPadula complété par le mécanisme Type enforcement de contrôle de l'intégrité, développé par SCC. Il s'agit d'un logiciel libre, certaines parties étant sous licences GNU GPL et BSD."
Désactivation
Le plus efficace étant souvent le plus simple, quand SELinux casse les pieds, il suffit de le désactiver...
Cette option se trouve dans le fichier /etc/selinux/config et, il suffit de modifier la ligne:
SELINUX=enforcing
en
SELINUX=disabled
Les modifications ne prendront effet qu'au prochain redémarrage sauf si vous utilisez la commande suivante:
# setenforce 0
Pourquoi SELinux
SELinux est l'implémentation de ce que l'on appelle un MAC (Mandatory Access Control) ou Contrôle d'Accès Obligatoire. Le MAC intervient après le Contrôle d'Accès Discret ou DAC (Discretionary Access Control).
Le DAC est représenté par ce que l'on appelle les ACL (Access Control Lists) qui permettent de positionner des droits (lecture → r, écriture → w ou éxecution → x) sur les fichiers en fonction des entités y accédant (utilisateur → u, groupe → g ou autres → o).
Prenons l'exemple suivant:
[jcf@centos ~]$ pwd
/home/jcf
[jcf@centos ~]$ ll
total 0
-rwxrwxr-x. 1 jcf jcf 0 24 nov. 19:33 script.sh
L'utilisateur jcf a le droit de créer un script dans son répertoire home et peut modifier les droits d’exécution: cela est laissé à sa discrétion. Il n'y aucun moyen pour l'administrateur de s'assurer des droits de chaque fichier !
Pire encore, imaginons un processus qui tourne en tant que root ou sur un compte qui posséderai les droits super utilisateur. Si une personne mal intentionnée récupère le contrôle d'un tel processus, cela signifie qu'elle aura accès aux ressources auxquelles le compte a accès. Si le processus s'exécute avec le compte root cela signifie l'intégralité du système.
Imaginez que vous autorisiez des développeur à accéder à un serveur de production. Vous voulez qu'ils puissent regarder les logs mais qu'ils soient capable d'exécuter des commandes avec su ou sudo. Comment faire ?!? SELinux permet d'ajuster finement la granularité du contrôle d'accès. SELinux confine un processus dans un domaine et ne l'autorise à accéder aux fichiers ou interagir avec les processus des domaines autorisés.
Fonctionnement
Les paquetages
Plusieurs paquetages composent SELinux et voici la liste (pour les spins de RedHat):
- policycoreutils, policycoreutils-python: utilitaires pour gérer SELinux;
- selinux-policy: fournit les polices de référence;
- selinux-policy-targeted: fournit les politiques cible;
- libselinux-utils: fournit des outils pour gérer SELinux;
- setroubleshoot-server: fournit les outils pour déchiffrer les messages de journalisation;
- setools, setools-console: fournit les outils pour le monitoring des évenements de journalisation, les requêtes sur les politiques de filtrage et la gestion du context des fichiers;
- mcstrans: outils pour traduire les politiques au format facile à comprendre;
On peut voir les paquetages disponibles grâce ) la commande suivante:
# rpm -qa | grep selinux | sort -u libselinux-2.5-11.el7.x86_64 libselinux-python-2.5-11.el7.x86_64 libselinux-utils-2.5-11.el7.x86_64 selinux-policy-3.13.1-166.el7.noarch selinux-policy-targeted-3.13.1-166.el7.noarch
Et on peut installer / mettre à jour les paquetages grâce à la commande suivante:
# yum -y install policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans
Les différents modes
SELinux fonctionne avec différents modes:
- enforcing
- permissive
- disbaled
Dans le mode Enforcing SELinux applique la politique de sécurité et bloque tous les accès non autorisé fait par les utilisateur ET les processus, les accès bloqués étant journalisés dans les fichiers adéquats.
Le mode Permissive peut être considéré comme un état semi-actif dans le sens ou la politique n'est pas appliquée et donc les accès ne sont pas bloqués. Cependant, toutes violations à la politique de sécurité est consigné comme dans le mode Enforcing. C'est le mode parfait pour tester l'application de la politique de sécurité !
Le mode disabled désactive SELinux.
Mode et status
On peut vérifier dans quel mode on se trouve grâce à la commande suivante:
# getenforce Enforcing
On peut afficher le status grâce à la commande suivante:
# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 28
Le mode enforcing est le mode par défaut sur une installation fraîche de CentOS 7. On peut modifier cela grâce à la commande suivante:
# setenforce permissive
On voit bien le status modifié:
# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: permissive Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 28