Vous êtes sur la page 1sur 35

SELinux

Rihem Ben Romdhane

TEK-UP

October 6, 2022

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 1 / 35
Sommaire

1 Introduction

2 SELinux, c’est quoi ?

3 Comprendre SELinux

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 2 / 35
Introduction

Introduction

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 3 / 35
Introduction

Introduction

SELinux (pour Security-Enhanced Linux) est un modèle de sécurité que l’on peut
ajouter au système standard de Linux afin d’augmenter la sécurité face aux
diverses attaques que subit le système.
Avec SELinux, on peut configurer les accès de chaque processus pour les
restreindre à un strict minimum.
Cela permet de rendre inexploitable certaines failles, et en cas de piratage, de
limiter l’étendue des dégâts.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 4 / 35
Introduction

Exemple introductif (1/3)

Imaginons que :
quelqu’un vient de pirater apache, et qu’il peux lancer des commandes
arbitraires via ce processus.
le processus piraté de apache fonctionne en root.
En tant que root, le pirate peut modifier le fichier /etc/shadow pour s’ajouter un
compte sur le serveur.
Les droits du fichier permettent de le faire (après tout, notre pirate à l’accès root):

Et pourtant le pirate ne pourra pas ouvrir le fichier grâce à la configuration de


SELinux.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 5 / 35
Introduction

Exemple introductif (2/3)

Il se trouve que apache fonctionne dans un contexte de sécurité particulier de


SELinux, il a le type httpd_t

Le fichier shadow, possède lui aussi un contexte de sécurité, et son type est
shadow_t:

Avec SELinux, pour que apache puisse lire ou écrire le fichier shadow, il faut une
règle explicite qui permet aux processus de type httpd_t de lire ou écrire dans un
fichier de type shadow_t.
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 6 / 35
Introduction

Exemple introductif (3/3)

Il faudrait donc une règle comme celle-ci dans les politiques de sécurité de
SELinux:
allow httpd_t shadow_t : file { read write }

Cette règle dit qu’un processus avec le label httpd_t est autorisé (allow) à lire et
écrire ( read write ) dans un fichier (file) possédant le type/label shadow_t.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 7 / 35
SELinux, c’est quoi ?

SELinux, c’est quoi ?

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 8 / 35
SELinux, c’est quoi ?

Discretionary Access Control (DAC)

la politique de contrôle d’accès repose sur les concepts de sujet (s), action
(a) et objet (o)
le sujet s a la permission d’effectuer l’action a sur l’objet o
Lorsque qu’un processus veut réaliser une action sur un fichier, le noyau
vérifie que le processus possède les droits nécessaires.

Exemple d’application: le système de


fichiers de Linux

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 9 / 35
SELinux, c’est quoi ?

Vulnérabilités du modèle DAC

Ne protège pas les programmes d’une utilisation détournée.


Par exemple, le système standard ne peut rien faire pour les programmes qui
doivent fonctionner en tant que root.
L’information peut transiter illégitimement par des canaux différents des
simples opérations de lecture/écriture.
Ces canaux cachés peuvent être de différentes sortes et difficiles à recenser et
à éliminer
Les chevaux de Troie

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 10 / 35
SELinux, c’est quoi ?

Mandatory access control (MAC)

un niveau de sécurité est affecté à chaque sujet et à chaque objet


La politique de sécurité est obligatoire c’est-à-dire qu’elle s’impose à tous
les utilisateurs et ne peut être modifiée
la politique de sécurité multi-niveaux : les utilisateurs ont l’interdiction
de prendre connaissance des données ayant un niveau de classification
supérieur à leur niveau d’habilitation mais ont la permission de prendre
connaissance des données classifiées à un niveau égal ou inférieur à leur
niveau d’habilitation
Le seul moyen de garantir totalement la sécurité multi-niveaux est de
contrôler tous les flux d’informations possibles.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 11 / 35
SELinux, c’est quoi ?

Le principe du moindre privilège

Le principe du moindre privilège fait référence à un concept de sécurité dans lequel


on accorde à un utilisateur ou un processus le niveau d’accès (ou les
permissions) minimum requis pour accomplir son travail

Par défaut tout est bloqué et on autorise que le nécessaire

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 12 / 35
SELinux, c’est quoi ?

Le modèle de sécurité de SELinux (MAC) (1/2)


SELinux est un logiciel qui implémente la sécurité MAC sous Linux.
SELinux assure que seules les opérations autorisées sont effectuées en
appliquant le principe du moindre privilège
SELinux utilise un système de sécurité extrêmement souple:
Pour chaque appel système, le noyau vérifie que le processus peut exécuter
l’appel sur l’objet manipulé en fonction de leur contexte de sécurité.
Le type de vérification réalisé par le noyau est parfois comparé au découpage
d’une phrase en français ”Sujet Verbe Objet”, le sujet est un processus, l’objet
est un objet système (par exemple un fichier), et le verbe est l’action.
SELinux vérifie donc que le sujet peut réaliser le verbe sur l’objet.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 13 / 35
SELinux, c’est quoi ?

Le modèle de sécurité de SELinux (MAC) (2/2)


SELinux vient s’ajouter au modèle de sécurité classique, les droits normaux des
fichiers sont toujours de rigueur. Si un accès est refusé par le système classique,
SELinux n’entre pas en jeu. Il n’est donc toujours pas possible pour un utilisateur
de lire le compte d’un autre utilisateur, même si la politique de sécurité de
SELinux le permet.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 14 / 35
Comprendre SELinux

Comprendre SELinux

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 15 / 35
Comprendre SELinux

Le contexte de SELinux

Un contexte SELinux est présenté de la manière suivante :


identité:rôle:type

Pour le contexte du dossier /var/www/html :


system_u:object_r:httpd_sys_content_t html

Nous avons donc :


l’identité system_u ;
le rôle object_r ;
le type httpd_sys_content_t ;

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 16 / 35
Comprendre SELinux

Les informations de SELinux (1/2)

Pour identifier sujet et objet, SELinux ajoute à ceux-ci trois informations:


identité
rôle
type (Nommé aussi Domaine pour les processus et Label pour les objets)
Par convention, les identifiants possèdent un suffixe: _u pour l’identité, _r pour le
rôle et _t pour le type.
Parmi les informations ajoutées par SELinux, le type est l’élément fondamental,
c’est par lui que les droits sont accordés.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 17 / 35
Comprendre SELinux

Les informations de SELinux (2/2)

Ils sont accessibles via l’option -Z que l’on peut ajouter à de nombreuses
commande.
$ ps -Z
system_u:system_r:postgresql_t:s0 1531 ? S 0:05 /usr/lib/postgresql/8.1/bin/postmaster
system_u:system_r:postgresql_t:s0 1533 ? S 0:01 postgres: writer process

$ ls -Z
drwx------ postgres postgres user_u:object_r:postgresql_db_t:s0 base
-rw------- postgres postgres user_u:object_r:postgresql_db_t:s0 pg_hba.conf
-rw------- postgres postgres user_u:object_r:postgresql_db_t:s0 pg_ident.conf

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 18 / 35
Comprendre SELinux

Les autorisations dans SELinux

Par défaut, SELinux n’autorise aucune action, il faut ajouter des règles pour
autoriser les actions. Ces règles sont de type:
autorisation type_du_sujet type_de_lobjet : type_des_objects opérations_autorisées

Par exemple, la règle qui permet au processus PostgreSQL (de type postgresql_t)
de lire les fichiers de la base de données (de type postgresql_db_t) est:
allow postgresql_t postgresql_db_t:file create_file_perms;

Où create_file_perms équivaut à
{ create ioctl read getattr lock write setattr append link unlink rename }

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 19 / 35
Comprendre SELinux

Les politiques de sécurités (1/2)

Une politique de sécurité est un ensemble de règles et des autorisations


Le système de politique de sécurité est modulaire : On peut charger ou
décharger des politiques de sécurités afin d’ajouter ou bien de supprimer des
ensembles de règles au noyau.
Ces packages de politique de sécurité sont administrés à l’aide de la
commande semodule.
L’option -l permet de lister les packages actuellement chargés:

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 20 / 35
Comprendre SELinux

Les politiques de sécurités (2/2)

Pour ajouter des politiques de sécurité, il suffit d’installer un package dans le


noyau.
Pour se faire, on utilise encore semodule, et on précise le chemin du package à
charger:
semodule -i /usr/share/selinux/default/apache.pp.bz2

Et pour recharger un module après l’avoir modifié:


semodule -R /home/ikipou/rules_linux_certif.pp

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 21 / 35
Comprendre SELinux

Labeling du système de fichier (1/2)

Pour faire correspondre un contexte aux fichiers, les packages de politique de


sécurité contiennent les informations sur la façon dont les fichiers doivent être
marqués en fonction de leur chemin d’accès.
Voici par exemple quelques unes des règles utilisées pour le label des fichiers de
PostgreSQL:
/etc/postgresql(/.*)? gen_context(system_u:object_r:postgresql_etc_t,s0)
/usr/bin/initdb gen_context(system_u:object_r:postgresql_exec_t,s0)
/usr/bin/postgres gen_context(system_u:object_r:postgresql_exec_t,s0)
/usr/lib/pgsql/test/regres(/.*)? gen_context(system_u:object_r:postgresql_db_t,s0)

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 22 / 35
Comprendre SELinux

Labeling du système de fichier (2/2)

Si on install SELinux sur un système qui ne l’utilisait pas avant, le contexte n’est
pas indiqué par défaut. Pour remédier à ça on utilise la commande fixfiles:
fixfiles relabel

Pour restaurer les labels d’un fichier ou d’une partie du système de fichier, la
commande restorecon est la plus pratique:
restorecon -R /etc/ssh

Finalement, pour changer à la main le label d’un fichier ou d’une arborescence, il


faut utiliser la commande chcon:
chcon -t user_home_t /home/ikipou/SECURITY

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 23 / 35
Comprendre SELinux

Le rôle des rôles (1/2)

Les identités et rôles ne sont pas encore largement utilisés dans les politiques
fournies dans les distributions Linux.
Ces informations sont là pour rester cohérentes avec le reste du système de
sécurité, mais elles ne servent à rien pour les politiques de sécurités.
Chaque utilisateur ayant sa propre identité dans SELinux. Dans la plupart des
cas cela n’est pas nécessaire et les utilisateurs ont simplement tous l’identité
user_u.
Chaque utilisateur peut avoir plusieurs rôles, et les différents rôles possibles
sont configurés dans les politiques de sécurité.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 24 / 35
Comprendre SELinux

Le rôle des rôles (2/2)

Le rôle est beaucoup plus important que l’identité, car il lui correspond une
liste de type possible.
Aux utilisateurs correspondent des identités, aux identités correspondent des
rôles possibles, et aux rôles correspondent des type acceptables.

Pour résumer:
Aux utilisateurs correspondent des identités, aux identités correspondent des rôles
possibles, et aux rôles correspondent des type acceptables.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 25 / 35
Comprendre SELinux

Transition de type (1/3)

L’autorisation est donnés à partir des types


L’affectation d’un type à un processus ou un objet est strictement définit par
les politiques de sécurité.
Pour passer d’un type à un autre , il faut:
Que la transition soit autorisée
Que le rôle courant ait accès au type visé
Lancer un exécutable qui sert comme un point d’entrée pour le type

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 26 / 35
Comprendre SELinux

Transition de type (2/3)

Exemple PostgreSQL:
Le package est configuré pour se lancer automatiquement au démarrage du
système. Donc le processus qui lance PostgreSQL au démarrage possède le
type initrc_t
Au niveau des politiques de sécurité, il existe une autorisation pour une
transitions depuis le type initrc_t(utilisé au démarrage) vers postgresql_t à
travers le type intermédiaire postgresql_exec_t
Un processus ne peut avoir le type postgresql_t que s’il est exécuté par un
processus ayant le type postgresql_exec_t
Le processus exécutable ayant le type p ostgresql_exec_t sert comme un
point d’entrée pour le type postgresql_t

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 27 / 35
Comprendre SELinux

Transition de type (3/3)

Si un processus n’a pas le bon type, la première chose à vérifier est que le
fichier exécutable possède le bon type (pour qu’il puisse servir de point
d’entrée).
Si le type du fichier est correct, il faut vérifier que le processus a été lancé par
un processus du bon type pour avoir le bon ordre des transitions.

Pour résumer:
Quand un processus marqué initrc_t lance un fichier postgresql_exec_t, le
processus créé à finalement le type postgresql_t.

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 28 / 35
Comprendre SELinux

Les booléens (1/2)

Les booléens permettent de modifier une politique SELinux, sans avoir la


moindre connaissance ou compétence sur le sujet de la rédaction de
politiques.
L’activation ou la désactivation d’un booléen ne requiert pas la compilation
ou le rechargement d’un module.
Pour les lister, et obtenir quelques informations sur l’utilité de chacun:
semanage boolean -l

Pour simplement lister les booléens, sans aucune information complémentaire:


getsebool -a

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 29 / 35
Comprendre SELinux

Les booléens (2/2)

Exemples:
Si votre site web utilise la fonction PHP mail(), par défut, SELinux bloque
stématiquement l’envoi de mails par apache
Pour ce cas, il suffit d’activer le booléen en question :
setsebool -P httpd_can_sendmail on

L’option -P permet de rendre la directive permanente, et donc de la conserver


en cas de reboot du système.
Pour un serveur ftp, par défaut, SELinux ne permet pas aux utilisateurs
anonymes de créer des fichiers.
Pour activer cela, il suffit d’activer le booléen correspondant:
setsebool allow_ftpd_anon_write 1

Cette activation n’est pas permanente. Elle ne persiste pas après un reboot

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 30 / 35
Comprendre SELinux

La commande semanage
La commande semanage:
Permet des changements sur la façon dont les règles sont utilisées sans
aucune modification ou bien recompilation des règles depuis la source
Permet des modifications sur les informations utilisées par SELinux (le
contexte de sécurité).
Deux cas d’utilisations:
Labeling propre
Le changement d’un contexte via la commande chcon est provisoire (Ne
persiste pas si on restore les contextes par défaut via les commandes fixfiles ou
restorecon)
La commande semanage permet de changer le contexte par défaut en l’insérant
directement à la politique noyau courante
Une telle modification sera toujours effective après un relabel effectué par
fixfiles ou restorecon. Cette méthode est donc à préférer à chcon pour tout les
changements non triviaux effectué sur les labels.
Ports par défaut
Pour faire fonctionner certains services sur des ports non standard
il suffit d’ajouter le bon label aux ports nécessaires à l’aide de semanage
semanage port -a -t httpd_t -p tcp 81
semanage port -a -t openvpn_t -p udp 6865
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 31 / 35
Comprendre SELinux

Les modes (1/3)

SELinux propose trois modes différents :


Appliqué(En forcing) : Dans ce mode, les accès sont restreints en fonction
des règles SELinux en vigueur sur la machine.
Permissif (Permissive) : ce mode est généralement à considérer comme un
mode de déboguage. En mode permissif, les règles SELinux seront
interrogées, les erreurs d’accès logguées, mais l’accès ne sera pas bloqué. Ce
mode peut être utile pour constater l’ensemble des erreurs SELinux posées
par un processus particulier par exemple.
Désactivé (Disabled) : SELinux est désactivé. Rien ne sera restreint, rien
ne sera loggué

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 32 / 35
Comprendre SELinux

Les modes (2/3)


Pour connaître l’état général (activé ou désactivé, mode courant, politique
chargée, etc...), utilisez la commande sestatus

La commande getenforce vous informera sur le mode actuellement actif sur


votre machine.
La commande setenforce permet de basculer de façon temporaire (la
modification ne sera pas prise ne compte au prochain redémarrage de votre
machine) entre les modes Appliqué et Permissif :
mode permissif : setenforce 0
mode appliqué : setenforce 1
Il est tout-à-fait possible de modifier manuellement le fichier
/etc/selinux/config en modifiant les deux lignes SELINUX= pour changer
. . . . . . . . . . . . . . . . . . . .
le mode . . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 33 / 35
Comprendre SELinux

Les modes (3/3)

Attention !
Lorsque SELinux est exécuté en mode permissif ou s’il est désactivé, les nouveaux
fichiers crées ne porteront aucune étiquette. Lorsque SELinux sera réactivé, cela
pourra poser des problèmes, et il vous faudra donc re-étiqueter l’intégralité de
votre système. Pour ce faire, entrez la commande suivante :
# touch /.autorelabel

puis redémarrez votre système.


Au démarrage, l’intégralité de vos fichiers sera ré-étiquettée, cela peut prendre un
certain temps ; à plus forte raison si vous avez beaucoup de fichiers.
Une autre méthode consiste à saisir les commandes suivantes :

# fixfiles -F onboot
# reboot

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 34 / 35
Comprendre SELinux

Thank you!

. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Rihem Ben Romdhane TEK-UP October 6, 2022 35 / 35

Vous aimerez peut-être aussi