Chargement en cours

SELinux #01 | Introduction et théorie

SELinux #01 | Introduction et théorie

Présentation/Tutoriel autour du fameux SELinux !

Aujourd’hui on va partir d’un sujet au combien délicat mais d’une grande importance pour qui veut vraiment se dire Administrateur GNU/Linux ! C’pas moi qui le dit, c’est la plupart des forums…

Vous l’avez vu au titre, je vais tenter de vulgariser ce qu’est Security-Enhanced Linux et pourquoi c’est utile, et comment le configurer ! Dit comme ça c’est simple, en réalité ça peut être un chouilla plus complexe, même si après avoir un peu bricolé avec, y’a rien de (trop) sorcier non plus.

I) Introduction

Pour ceux n’ayant jamais trop touché à Linux de manière générale, SELinux ne leur dira sûrement rien, et pour les autres, ceux qui ont déjà fait mumuse avec plusieurs distribs et qui sont à l’aise avec la CLI etc, ça les aura déjà sûrement fait un peu sourire/grincer des dents.

En effet, si vous regardez rapidement sur le net, vous allez vite vous rendre compte que ce module du kernel Linux est clairement mal-aimé, certaines fois à raison, mais très souvent à tort… On ne compte pas les nombreux posts où on vous invite à le désactiver d’entrée de jeu, et de l’autre côté, les centaines d’articles essayant de vous convaincre de l’adopter et l’utiliser.

Presque un peu l’équivalent de l’IPv6 mais version Linuxien, si j’ose dire…

IPv6:

  • Plus « compliqué » ;
  • « Peu de gens » le maîtrisent vraiment à 100% ;
  • Résout les soucis d’IPv4 ;
  • Tout le monde vous dira de ne pas l’utiliser car moins prise de tête ;

SeLinux:

  • Plus « compliqué » ;
  • « Peu de gens » le maîtrisent vraiment à 100% ;
  • Améliore la sécurité de base des systèmes GNU/Linux ;
  • Tout le monde vous dira de ne pas l’utiliser car moins prise de tête ;

Mais là encore, si vous n’avez jamais entendu ce nom, vous devez bien vous demander de quoi on parle au juste. Et bien allons-y 🤓

II) Un peu d’histoire

SELinux, pour Security-Enhanced Linux, est donc un module présent dans le noyau Linux, activé ou non par défaut dépendant des distributions. Côté RedHat et ses forks, ce sera activé. Pour les autres, à activer à la mano.

A l’origine, il est développé par la toute puissante NSA, dans le but d’améliorer la sécurité de base de ses systèmes GNU/Linux, notamment en mettant en place un « modèle de contrôle d’accès obligatoire », autrement appelé Mandatory access control (MAC), contrairement au modèle de base nommé DAC, pour Discretionary Access Control. Puis aux alentours des années 2000, la NSA rend l’outil OpenSource et en 2003, c’est incorporé de base dans le noyau Linux.

III) Les concepts de base, DAC vs MAC

Sous GNU/Linux, si un utilisateur modifie son home avec des droits en 777, donc accessible en lecture/écriture par tous, bah rien l’en empêche.

De la même manière, si l’utilisateur root souhaite faire n’importe quoi, c’est possible aussi.

Et c’est tant mieux ! Cette flexibilité/liberté est une grande force de ce type d’OS, mais de l’autre côté, on perd certains garde-fous côté cybersécu…

D’où SELinux, qui comme dit plus haut, va se baser sur un modèle MAC et non pas DAC. Pour faire simple:

  • DAC, droits à la discrétion de l’utilisateur : l’utilisateur Alice crée un fichier et décide qu’il est lisible par Bob, c’est elle qui choisit ;
  • MAC, droits imposés par le système : même si Alice met le fichier accessible à Bob, SELinux peut bloquer l’accès si la politique système l’interdit ;

C’est la première notion importante à connaître, rien de compliqué ici. Maintenant, on va parler de comment SELinux fonctionne réellement. Du coup, on va causer Contextes/Labels.

IV) Contextes & labels

La seconde grosse notion théorique à connaître, c’est le contexte SELinux. Quand celui-ci est activé sur votre système –et on verra les différentes commandes plus bas-, si vous faites un ls vous verrez quelque chose comme ceci:

Ici, j’ai fait un simple ls -l pour voir les permissions de mes différents fichiers, et ensuite j’ai rajouté l’argument -Z pour afficher les contextes SELinux. On voit notamment ce truc imbuvable:

On décortique !

  • it-anthony it-anthony : Classique, le propriétaire et groupe propriétaire du fichier ;
  • unconfined_u : Utilisateur SELinux, ce n’est pas un utilisateur du système !
  • object_r : Le rôle ;
  • user_home_t : Le type ;
  • s0 : Le security level ;

Un contexte, c’est l’ensemble des labels, càd des étiquettes rajoutés à un fichier.

Maintenant, allons un peu plus loin pour chaque label rapidement décrit plus haut:

  • unconfined_u, le fameux utilisateur SELinux. C’est un utilisateur logique propre à SELinux, qui est mappé à notre véritable utilisateur. Selon la politique en place, cela va rajouter ou non des restrictions aux processus lancés par celui-ci.
    On en parlera plus tard, mais on peut trouver system_u, ou encore guest_u.
  • object_r, le rôle SELinux. Concernant les fichiers, ça ne sert juste à rien… par défaut ce sera toujours ce label là, c’est utilisé plutôt pour les processus, pour vérifier dans quels domaines ils peuvent accéder, mais ça aussi, on en parlera plus tard !
  • user_home_t, c’est justement là où c’est intéressant/peut vite devenir embêtant à debug ! Ce label va nous permettre d’indiquer aux différents processus s’ils peuvent ou non lire/écrire/exécuter ce fichier.
    Par exemple, avec ce label ici, un process avec le type bash_t peut lire et écrire les objets ayant le type user_home_t, mais un autre process ayant le type httpd_t ne pourra pas.
  • s0, le niveau de sécurité. Alors ici je ne vais pas trop détailler, ce sera l’objet d’un article à part… Ce label est utilisé lorsque SELinux est en mode MLS/MCS, pour Multi-Level Security/Multi-Category Security. C’est encore un niveau dessus ! C’est surtout utilisé dans des Infras avec data classifiée.

Alors effectivement, à ingérer d’un coup, ça fait déjà pas mal… mais rassurez-vous, on en a fini niveau théorie ! En tout cas pour ce premier article… 😏

On va conclure en douceur avec quelques commandes de base, puis je vous parlerai de ce que l’on verra dans les prochains article de cette mini-série autour de SELinux !

V) Quelques commandes de base

Déjà, de prime abord, si vous souhaitez vérifier si SELinux est activé ou non sur votre OS, et de quelle manière il est activé:

# Informations détaillées
sestatus
# Contexte actif
getenforce

Ici, on peut donc voir que le mode actif est enforcing.

  • Enforcing, les policies sont appliquées de manière stricte. En gros, ce qui doit bloquer va bloquer ;
  • Permissive, les policies sont appliquées mais rien n’est bloqué, juste logué ;
  • Disabled, les policies ne sont pas appliquées.

Comme dit en introduction, tout ce qui est Red Hat Linux, Fedora, Alma Linux, Rocky Linux, CentOS, et autres forks, ont SELinux installé et enforcé de base.

A noter qu’on peut voir aussi le type en cours, qui sera en mode targeted presque tout le temps, encore une fois sauf environnement classifié (gouvernements, secteur de la défense…) :

Comme on l’a vu plus haut aussi, avec l’argument -Z pour ls, il en va de même pour bon nombre d’autres commandes !

Ici, on peut donc voir que même les processus ont des contextes SELinux, pas seulement les fichiers. Même si sous GNU/Linux, tout est fichier pour rappel 🙃

Et enfin, idem pour notre utilisateur courant, même si le contexte sera affiché d’emblée :

VI) Conclusion

Et bien pas tout à fait… mais presque !

Vous connaissez désormais les notions les plus importantes pour apprendre à utiliser SELinux ! Mais il va de soit que ce n’était qu’un bref aperçu de ce qu’il est possible de faire… nous n’avons pas encore exploré à fond les rôles et domaines notamment, ici on se sera contenté de la partie purement objets, et non processus.

Dans le prochain article, on ira un peu plus loin et surtout on commencera à vraiment l’utiliser de manière pratique et concrète, avec un petit labo. On parlera des commandes de debug, on parlera des fameux « booléens« … mais rien d’insurmontable, je vous rassure !

Comme d’habitude, j’espère vous avoir appris quelques bricoles, et vous retrouve très vite !

A noter aussi que je ne suis pas (encore) un expert SELinux, et c’est donc toujours un peu complexe de vulgariser certaines notions… mais je suppose que ça ira mieux au fur et à mesure des articles 😉

Ciao !

Laisser un commentaire