Chapitre 6.
Gestion de la sécurité avec SELinux
Modification du mode d’exécution SELinux
Exercice guidé: Modification du mode d’exécution SELinux
Contrôle des contextes de fichier SELinux
Exercice guidé: Contrôle des contextes de fichier SELinux
Ajustement de la politique SELinux avec des valeurs booléennes
Exercice guidé: Ajustement de la politique SELinux avec des valeurs booléennes
Analyse et résolution des problèmes liés à SELinux
Exercice guidé: Analyse et résolution des problèmes liés à SELinux
Open Lab: Gestion de la sécurité avec SELinux
Résumé
Résumé
Objecti
Protéger et gérer la sécurité d’un serveur en utilisant SELinux.
f
Expliquer comment SELinux protège les ressources, modifie le
mode SELinux actif d’un système et définit le mode SELinux par
défaut d’un système.
Gérer les règles de politique SELinux qui déterminent le contexte
par défaut des fichiers et des répertoires avec la
commande semanage fcontext, et appliquer le contexte défini par
la politique SELinux aux fichiers et répertoires avec la
commande restorecon.
Résulta
ts Activer et désactiver les règles de politique SELinux avec la
commande setsebool, gérer la valeur persistante des valeurs
booléennes SELinux avec la commande semanage boolean -l et
consulter les pages man qui se terminent par _selinux pour
trouver des informations utiles sur les valeurs booléennes
SELinux.
Utiliser les outils d’analyse des journaux SELinux et afficher des
informations utiles lors de la résolution de problèmes liés à
SELinux à l’aide de la commande sealert.
Section Modification du mode d’exécution SELinux (et exercice guidé)
s
Contrôle des contextes de fichier SELinux (et exercice guidé)
Ajustement de la politique SELinux avec des valeurs
booléennes (et exercice guidé)
Analyse et résolution des problèmes liés à SELinux (et exercice
guidé)
Atelier Gestion de la sécurité avec SELinux
Modification du mode d’exécution SELinux
Résultats
Expliquer comment SELinux protège les ressources, modifie le mode SELinux
actif d’un système et définit le mode SELinux par défaut d’un système.
Architecture SELinux
SELinux (Security Enhanced Linux) est une fonctionnalité de sécurité essentielle de
Linux. L’accès aux fichiers, aux ports et à d’autres ressources est contrôlé à un
niveau granulaire. Les processus sont autorisés à accéder uniquement aux
ressources spécifiées par des paramètres booléens ou leur politique SELinux.
Les autorisations de fichier contrôlent l’accès aux fichiers pour un utilisateur ou un
groupe spécifique. Cependant, ces autorisations n’empêchent pas un utilisateur
autorisé ayant accès à un fichier de l’utiliser à des fins non prévues.
Par exemple, si d’autres éditeurs ou programmes disposent d’un accès en écriture à
un fichier, ils peuvent toujours ouvrir et modifier un fichier de données structuré
dans lequel seul un programme spécifique est autorisé à écrire. Cela peut entraîner
une corruption ou un problème de sécurité des données. Les autorisations de fichier
n’empêchent pas ces accès non souhaités, car elles ne contrôlent pas
la manière dont un fichier est utilisé, mais uniquement les personnes autorisées à le
lire, à l’exécuter ou à y écrire des données.
SELinux est constitué de politiques propres à l’application que les développeurs de
l’application en question définissent pour déclarer quelles actions et quels accès
sont autorisés pour chaque exécutable binaire, fichier de configuration et fichier de
données utilisés par cette application. Cette politique est connue sous le nom
de politique ciblée, car une seule politique définit les activités d’une application. Les
politiques déclarent les étiquettes prédéfinies qui sont configurées sur des
programmes, des fichiers et des ports réseau individuels.
Utilisation de SELinux
SELinux applique un ensemble de règles d’accès qui définissent explicitement les
actions autorisées entre les différents processus et ressources. Toute action qui
n’est pas définie dans une règle d’accès n’est pas autorisée. Étant donné que seules
les actions définies sont autorisées, les applications conçues avec un faible niveau
de sécurité sont toujours protégées contre les utilisations malveillantes. Les
applications ou les services dotés d’une politique ciblée s’exécutent dans un
domaine confiné, tandis qu’une application dépourvue de politique s’exécute de
manière non confinée, mais sans aucune protection SELinux. Chaque politique
ciblée peut être désactivée pour faciliter le développement et le débogage des
politiques de sécurité et des applications.
SELinux présente les modes de fonctionnement suivants :
Enforcing : SELinux applique les politiques chargées. Il s’agit du mode par
défaut dans Red Hat Enterprise Linux.
Permissive : SELinux charge les politiques et est actif mais, au lieu
d’appliquer des règles de contrôle d’accès, il consigne les violations d’accès.
Ce mode est utile pour tester les applications et les règles, et résoudre les
problèmes qui y sont associés.
Disabled : SELinux est désactivé. Les violations SELinux ne sont ni refusées
ni consignées. Il est vivement déconseillé de désactiver SELinux.
Important
À partir de Red Hat Enterprise Linux 9, SELinux ne peut être complètement
désactivé qu’à l’aide du paramètre de noyau selinux=0 au démarrage. RHEL ne
prend plus en charge la définition de l’option SELINUX=disabled dans le
fichier /etc/selinux/config.
À partir de RHEL 9, lorsque SELinux est désactivé dans le fichier /etc/selinux/config,
il démarre et effectue une exécution active, mais il ne charge aucune stratégie.
Étant donné que les règles de politique définissent les actions autorisées, si aucune
politique n’est chargée, toutes les actions sont refusées. Ce comportement est
intentionnel. Il est conçu pour bloquer les tentatives malveillantes de contourner la
protection SELinux.
Concepts SELinux de base
La principale fonction de SELinux consiste à protéger les données des utilisateurs
contre toute utilisation inappropriée par des services système ou des applications
dont la sécurité a été compromise. La plupart des administrateurs Linux
connaissent bien le modèle standard de sécurité des autorisations de fichier
universel, d’utilisateur et de groupe, connu sous le nom de contrôle d’accès
discrétionnaire (DAC), dans la mesure où ils définissent des autorisations de fichier
selon leurs besoins. SELinux fournit une couche supplémentaire de sécurité basée
sur les objets qui est définie dans des règles granulaires. Ces règles sont connues
sous le nom de contrôle d’accès obligatoire (MAC), car les politiques MAC
s’appliquent à tous les utilisateurs et ne peuvent pas être contournées pour des
utilisateurs spécifiques par des paramètres de configuration discrétionnaires.
Par exemple, le port de pare-feu ouvert d’un serveur Web permet un accès
anonyme distant à un client Web. Cependant, un utilisateur malveillant qui accède à
ce port peut tenter de compromettre la sécurité d’un système en exploitant une
vulnérabilité existante. Si un exemple de vulnérabilité compromet les autorisations
de l’utilisateur et du groupe apache, un utilisateur malveillant pourra accéder
directement au contenu racine du document /var/www/html, aux
répertoires /tmp et /var/tmp du système ou à d’autres fichiers et répertoires
accessibles.
Les politiques SELinux sont des règles de sécurité qui définissent la manière dont
des processus spécifiques accèdent aux fichiers, répertoires et ports pertinents.
Chaque entité de ressource, comme un fichier, un processus, un répertoire ou un
port, possède une étiquette appelée contexte SELinux. L’étiquette de contexte
correspond à une règle de politique SELinux définie pour autoriser un processus à
accéder à la ressource étiquetée. Par défaut, une politique SELinux n’autorise aucun
accès, sauf si une règle explicite en accorde un. Si aucune règle d’autorisation n’est
définie, tous les accès sont interdits.
Les étiquettes SELinux ont les champs user, role, type et security level. La politique
ciblée, qui est activée dans RHEL par défaut, définit des règles en utilisant le
contexte type. Les noms des contextes de type se terminent généralement par _t.
Figure 6.1: Contexte de fichier SELinux
Concepts des règles d’accès aux politiques
Par exemple, un processus de serveur Web est étiqueté avec le contexte de
type httpd_t. Les fichiers et les répertoires du serveur Web dans le
répertoire /var/www/html/ et d’autres emplacements sont étiquetés avec le
contexte de type httpd_sys_content_t. Les fichiers temporaires des
répertoires /tmp et /var/tmp ont, comme étiquette, les contextes de type tmp_t. Les
ports du serveur Web ont, comme étiquette, le contexte de type http_port_t.
Un processus de serveur Web Apache s’exécute avec le contexte de type httpd_t.
Une règle de politique permet au serveur Apache d’accéder aux fichiers et aux
répertoires étiquetés avec le contexte de type httpd_sys_content_t. Par défaut, les
fichiers qui se trouvent dans le répertoire /var/www/html ont le contexte de
type httpd_sys_content_t. Par défaut, une politique de serveur Web ne comporte
aucune règle allow pour l’utilisation des fichiers étiquetés tmp_t, comme dans les
répertoires /tmp et /var/tmp, interdisant ainsi tout accès. Lorsque SELinux est
activé, un utilisateur malintentionné qui utilise un processus Apache compromis
n’aurait toujours pas accès aux fichiers du répertoire /tmp.
Un processus de serveur MariaDB s’exécute avec le contexte de type mysqld_t. Par
défaut, les fichiers qui se trouvent dans le répertoire /data/mysql ont le contexte de
type mysqld_db_t. Un serveur MariaDB peut accéder aux fichiers
étiquetés mysqld_db_t, mais ne possède pas de règles pour autoriser l’accès aux
fichiers pour d’autres services, tels que les fichiers étiquetés httpd_sys_content_t.
Figure 6.2: Flux de prise de décision SELinux
Bon nombre de commandes qui listent les ressources utilisent l’option -Z pour gérer
les contextes SELinux. Par exemple, les commandes ps, ls, cp et mkdir utilisent
toutes l’option -Z.
[root@host ~]# ps axZ
LABEL PID TTY STAT TIME COMMAND
system_u:system_r:kernel_t:s0 2? S 0:00 [kthreadd]
system_u:system_r:kernel_t:s0 3? I< 0:00 [rcu_gp]
system_u:system_r:kernel_t:s0 4? I< 0:00 [rcu_par_gp]
...output omitted...
[root@host ~]# systemctl start httpd
[root@host ~]# ps -ZC httpd
LABEL PID TTY TIME CMD
system_u:system_r:httpd_t:s0 1550 ? [Link] httpd
system_u:system_r:httpd_t:s0 1551 ? [Link] httpd
system_u:system_r:httpd_t:s0 1552 ? [Link] httpd
system_u:system_r:httpd_t:s0 1553 ? [Link] httpd
system_u:system_r:httpd_t:s0 1554 ? [Link] httpd
[root@host ~]# ls -Z /var/www
system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
system_u:object_r:httpd_sys_content_t:s0 html
Modification du mode SELinux
Utilisez la commande getenforce pour afficher le mode SELinux actuel. Utilisez la
commande setenforce pour modifier le mode SELinux.
[root@host ~]# getenforce
Enforcing
[root@host ~]# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@host ~]# setenforce 0
[root@host ~]# getenforce
Permissive
[root@host ~]# setenforce Enforcing
[root@host ~]# getenforce
Enforcing
Vous pouvez également définir le mode SELinux au démarrage avec un paramètre
de noyau. Transmettez le paramètre de noyau enforcing=0 pour démarrer le
système en mode permissive ou transmettez enforcing=1 pour le démarrer en
mode enforcing. Désactivez SELinux en transmettant le paramètre de
noyau selinux=0 ou transmettez selinux=1 pour l’activer.
Red Hat recommande de redémarrer le serveur lorsque vous faites passer le mode
SELinux de Permissive à Enforcing. Ce redémarrage garantit que les services lancés
en mode « permissive » seront confinés au prochain démarrage.
Définition du mode SELinux par défaut
Pour configurer SELinux de manière persistante, utilisez le fichier /etc/selinux/config.
Dans l’exemple par défaut ci-dessous, la configuration définit SELinux en
mode enforcing. Les commentaires listent d’autres valeurs valides, comme les
modes permissive et disabled.
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
...output omitted...
#
# NOTE: In earlier Fedora kernel builds, SELINUX=disabled would also
# fully disable SELinux during boot. If you need a system with SELinux
# fully disabled instead of SELinux running with no policy loaded, you
# need to pass selinux=0 to the kernel command line. You can use grubby
# to persistently set the bootloader to boot with selinux=0:
#
# grubby --update-kernel ALL --args selinux=0
#
# To revert back to SELinux enabled:
#
# grubby --update-kernel ALL --remove-args selinux
#
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are
protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
Le système lit ce fichier au démarrage et démarre SELinux en conséquence. Les
arguments de noyau selinux=0|1 et enforcing=0|1 remplacent cette configuration.
Références
Pages man getenforce(8), setenforce(8) et selinux_config(5)