LINUX:SELinux

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour au menu de Linux


But

SELinux (Security-Enhanced Linux) est une architecture de sécurité pour systèmes Linux qui permet aux administrateurs de mieux contrôler les accès au système. SELinux définit les contrôles d'accès pour les applications, processus et fichiers d'un système lancé par un utilisateur donné. Il ajoute une couche de sécurité différente au traditionnel modèle de sécurité appliqué aux fichiers: propriétaires/groupes et permissions d'accès (lecture, écriture et exécution). Son modèle est basé sur un ensemble de règles.

Souvenons-nous que sous Unix toute ressources est accessible via un fichier donc en mettant une règle sur un fichier, on contrôle toute activité.


Nous n'allons pas expliquer en détail SELinux; de très nombreux sites le font bien mieux que nous. Je conseille de commencer par consulter quelques sites de base tels:

  • https://blog.microlinux.fr/selinux/
  • https://doc.fedora-fr.org/wiki/SELinux
  • https://debian-handbook.info/browse/fr-FR/stable/sect.selinux.html
  • https://documentation.suse.com/sles/12-SP5/html/SLES-all/cha-selinux.html

Et si vous voulez aller plus loin:

  • https://selinuxproject.org/page/Main_Page
  • https://edu.anarcho-copy.org/GNU%20Linux%20-%20Unix-Like/SELINUX_SYSTEM_ADMINISTRATION_SECOND_EDITION.pdf

Il en existe bien d'autres.


Nous nous limiterons aux serveurs. Notre but est de présenter une approche pour arriver à mettre en route SELinux avec succès par étapes.


Installation

Sous Fedora, SELinux est installé de base. On peut le vérifier:

dnf install selinux-policy selinux-policy-targeted

Nous allons y ajouter divers paquets:

  • outils en lignes de commandes:
dnf install setools-console 
dnf install setroubleshoot-server
  • onglet additionnel à Cockpit:
dnf install cockpit-selinux
  • outils de développement afin d'ajouter un module personnel:
dnf install selinux-policy-devel selinux-policy-doc

Il faut s'assurer que les services "auditd.service" et "rsyslog.service" sont installés:

dnf install audit rsyslog

Chaque service vient normalement avec ses règles SELinux mais certains paquets demandent une installation séparée, par exemple:

  • pour PHP:
dnf install php-pecl-selinux php74-php-pecl-selinux php80-php-pecl-selinux php81-php-pecl-selinux
  • pour Nagios:
dnf install nagios-selinux
  • pour Fail2Ban:
dnf install fail2ban-selinux
  • pour MySql:
dnf install mysql-selinux

Il faut chercher dans l'ensemble des paquets contenant le mot "selinux".


Configuration

Le fichier de configuration central est "/etc/selinux/config".

L'option "SELINUX" possède trois états:

  • disable : SELinux est désactivé, non opérationnel; c'est l'état que j'ai longtemps utilisé comme de nombreux autres administrateurs afin d'éviter les difficultés de mise en oeuvre.
  • permissive : SELinux est activé, les règles sont testées mais non appliquées. Si une règle n'est pas respectée, un message d'erreur est ajoutée aux journaux mais aucun blocage n'est effectué.
  • enforcing : SELinux est activé, les règles sont testées et appliquées. Si une règle n'est pas respectée, un message d'erreur est ajoutée aux journaux et le blocage s'ensuit.

Dans un premier temps, nous utiliserons l'état "permissive" afin de nous familiariser avec SELinux et de régler à notre aise les différents problèmes. Quand le système nous semblera stable, on passera à l'état "enforcing".


SELinux comporte trois niveaux de complexité:

  • minimum : Seuls les processus sélectionnés sont protégés.
  • targeted : Les processus des services sont protégés.
  • mls : Protection "Multi Level Security". (pour les experts)

Nous laissons le niveau par défaut "targeted", installé par défaut, qui permet sur nos serveurs de surveiller les différents services. Notre but n'est pas de créer une politique de sécurité complète mais d'utiliser celles mise en place par la distribution et d'adapter certaines règles découlant d'imperfections ou de nos personnalisations de la configuration de base.


Toute autre modification du paramétrage devra se faire au travers de commandes de ligne et jamais dans d'autres fichiers. Pour information, on peut trouver diverses informations sur SELinux dans les répertoires "/etc/selinux", "/var/lib/selinux" et "/sys/fs/selinux".


Première activation

On vérifie que les services "auditd.service" et "rsyslog.service" sont actifs:

systemctl enable auditd.service
systemctl start auditd.service
systemctl status auditd.service
systemctl enable rsyslog.service
systemctl start rsyslog.service
systemctl status rsyslog.service

Ces services sont cruciaux, ce sont eux qui vont recueillir les messages et alertes.


Suite à la modification du fichier de configuration "/etc/selinux/config", SELinux ne sera effectif qu'après un redémarrage de la machine. Mais pour ce premier lancement, il faut s'assurer une première fois que tous les fichiers de la machine reçoivent bien leur bon label selon la politique de sécurité implémentée. Pour ce faire, on crée à la racine un fichier vide "/.autorelabel":

touch /.autorelabel 

Lors du redémarrage suivant, tous les fichiers du serveur vont être passé en revue et relabéllisés si nécessaire. Il ne faut pas vous étonner du temps de ce démarrage plus long qui dépend du nombre de fichiers et des performances de votre machine. Après redémarrage, ce fichier est éliminé.


On doit redémarrer la machine. Ce n'est qu'à cette condition que l'on pourra effectuer les commandes suivantes. C'est pour cette raison que nous n'avons pas commencé par une explication succincte de quelques base de SELinux car nous n'aurions pu les montrer par l'exemple.


Changement d'état à la volée

Au démarrage l'état "permissive" ou "enforcing" est défini selon le fichier de configuration "/etc/selinux/config". Mais il est possible de passer de l'un à l'autre interactivement sans devoir redémarrer le système.

La commande suivante permet de passer à l'état "permissive":

setenforce 0

Et inversement pour passer à l'état "enforcing":

setenforce 1

A tout moment, il est possible de connaitre l'état de SELinux via la commande:

sestatus

qui donne:


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
Memory protection checking:     actual (secure)
Max kernel policy version:      33

On peut faire ce changement d'état au travers l'interface de Cockpit. Dans le menu de gauche, on passe au point "SELinux". Au dessus de l'écran, un bouton basculant permet de passer de l'un à l'autre.

LINUX:Selinux.cockpit3.png


Concept

Rappelons que sous Unix tout est basé sur des fichiers. A chaque fichier est lié un Context SELinux.

Un utilisateur est lié à un utilisateur SELinux.

Cet utilisateur SELinux appartient à un ou plusieurs rôles.

Un rôle donne accès à divers domaines qui sont une des catégorie de type SELinux.

Et tout un immense ensemble de règles régissent les interactions entre ces divers contexts. Cet ensemble de règles définit la sécurité SELinux.


Alertes et Journaux

Quand une règle est enfreinte, outre que l'accès demandé est refusé, une alerte est déclenchée et un message est envoyé aux journaux.


Module

Un module est un ensemble cohérent des différentes composantes de SELinux: Types, règles, Fcontext,... Il se présente sous une forme ayant beaucoup d'analogie avec un programme.


Méthode de première mise en route

Je ne conseille pas de suivre aveuglément les conseils données par Cockpit ou les messages du service setroubleshootd.service. Je présente ici l'approche que j'ai utilisée.


Exercice de création d'un module personnel

J'ai voulu essayer de créer un module pour une application personnelle élémentaire.




retour au menu de Linux