Remarque :
- Ce tutoriel est disponible dans un environnement d'atelier gratuit fourni par Oracle.
- Il utilise des exemples de valeur pour les informations d'identification Oracle Cloud Infrastructure, la location et les compartiments. A la fin de votre atelier, remplacez ces valeurs par celles propres à votre environnement cloud.
Utiliser SELinux sur Oracle Linux
Introduction
SELinux est un ensemble de modules de noyau et d'outils d'espace utilisateur qui fournissent une autre couche de sécurité du système, un contrôle d'accès précis, des stratégies définies par l'administrateur à l'échelle du système et une meilleure atténuation des attaques d'escalade de privilèges.
Ce tutoriel vous guide tout au long de l'utilisation de ces outils d'espace utilisateur pour vous aider à maintenir votre système en mode d'application.
Objectifs
Dans cet exercice, vous allez apprendre à :
- Vérifier le mode et le statut de SELinux
- Comprendre les libellés de sécurité SELinux
- Utiliser les services réseau SELinux
- Utiliser les utilisateurs SELinux
- Modifier les valeurs booléennes de SELinux
- Evaluer les contextes des fichiers SELinux
Prérequis
- Un système sur lequel Oracle Linux 8 est installé avec la configuration suivante :
- un utilisateur non root avec des droits d'accès
sudo
- un utilisateur non root avec des droits d'accès
Environnement des exercices de configuration
Remarque : lorsque vous utilisez l'environnement d'atelier gratuit, reportez-vous à Oracle Linux Lab Basics pour obtenir des instructions de connexion et d'utilisation.
Création d'un utilisateur
Un utilisateur supplémentaire permet de tester l'affectation d'un utilisateur SELinux ultérieurement dans cet exercice.
-
S'il n'est pas déjà connecté, ouvrez un terminal et connectez-vous via SSH au système ol8-server.
ssh oracle@<ip_address_of_ol8-server>
-
Créez un utilisateur et définissez un mot de passe.
sudo useradd -u 8000 ralph echo "ralph:oracle" | sudo chpasswd
-
Autorisez les connexions SSH.
Copiez la clé SSH à partir du compte utilisateur
oracle
.sudo mkdir /home/ralph/.ssh sudo cp /home/oracle/.ssh/authorized_keys /home/ralph/.ssh/authorized_keys sudo chown -R ralph:ralph /home/ralph/.ssh sudo chmod 700 /home/ralph/.ssh sudo chmod 600 /home/ralph/.ssh/authorized_keys
-
Ouvrez un nouveau terminal et vérifiez que la connexion SSH fonctionne.
ssh ralph@<ip_address_of_ol8-server>
Ensuite,
exit
la session et fermez la fenêtre de terminal.
Mode et statut SELinux
Oracle Linux installe SELinux par défaut et s'exécute en mode Enforcing
.
-
Vérifiez le mode SELinux.
Elle doit être définie sur
Enforcing
.getenforce
-
Vérifiez les états et modes SELinux.
sestatus
La sortie de la commande
sestatus
indique le statut, la stratégie et le mode de SELinux.Exemple de sortie :
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: 31
Libellés de sécurité SELinux
Chaque processus et ressource système sous SELinux possède un libellé de sécurité appelé contexte SELinux. Le contexte SELinux, également appelé libellé SELinux, se concentre sur les propriétés de sécurité et garantit un moyen cohérent de référencer des objets dans la stratégie SELinux.
-
Afficher le libellé de sécurité SELinux pour un fichier.
ls -ldZ /etc/passwd
Exemple de sortie :
-rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 1892 Apr 13 14:39 /etc/passwd
La sortie
ls
avec l'option-Z
affiche les quatre champs d'attribut SELinux :- utilisateur :
system_u
- rôle :
object_r
- type :
passwd_file_t
- sécurité :
s0
Le plus important est le type SELinux, car la majorité des règles de stratégie SELinux
targeted
utilisent des types SELinux pour définir l'interaction autorisée entre un objet (par exemple, processus) et un autre (par exemple, fichier). - utilisateur :
-
Obtenir la liste des types de SELinux disponibles.
seinfo --type | head
- La commande
head
limite la sortie aux dix premières lignes de sortie uniquement.
La sortie complète indique que des types SELinux existent pour plusieurs commandes et services différents, tels que
ssh
etsshd
. - La commande
-
Obtenir la liste des types spécifiques de SELinux.
grep
limite la sortie aux types contenant le motssh
uniquement.seinfo -t | grep ssh
-
Obtenir la liste des laboratoires de sécurité pour des processus et des fichiers de configuration spécifiques.
ps
obtient les libellés de sécurité des processus.ps -efZ | grep sshd
Exemple de sortie :
system_u:system_r:sshd_t:s0-s0:c0.c1023 root 2535 1 0 14:37 ? 00:00:00 /usr/sbin/sshd -D system_u:system_r:sshd_t:s0-s0:c0.c1023 root 18514 2535 0 15:21 ? 00:00:00 sshd: oracle [priv] unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 18528 18514 0 15:21 ? 00:00:00 sshd: oracle@pts/0 unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 23611 18529 0 15:41 pts/0 00:00:00 grep --color=auto sshd
ls
obtient les étiquettes de sécurité des fichiers de configuration.ls -lZ /etc/ssh/
Exemple de sortie :
total 600 -rw-r--r--. 1 root root system_u:object_r:etc_t:s0 577388 Oct 9 2021 moduli -rw-r--r--. 1 root root system_u:object_r:etc_t:s0 1770 Oct 9 2021 ssh_config drwxr-xr-x. 2 root root system_u:object_r:etc_t:s0 28 Feb 18 08:51 ssh_config.d -rw-------. 1 root root system_u:object_r:etc_t:s0 4268 Apr 13 14:37 sshd_config -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 537 Apr 13 14:37 ssh_host_ecdsa_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 197 Apr 13 14:37 ssh_host_ecdsa_key.pub -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 432 Apr 13 14:37 ssh_host_ed25519_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 117 Apr 13 14:37 ssh_host_ed25519_key.pub -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 2635 Apr 13 14:37 ssh_host_rsa_key -rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 589 Apr 13 14:37 ssh_host_rsa_key.pub
Le processus démon
sshd
utilise le typesshd_t
. Par conséquent, dans la stratégie targeted, une règle pour l'attribut SELinuxsshd_t
indique que les objets avecsshd_t
peuvent accéder à tous les objets avec l'attribut de sécurité suivant :etc_t
sshd_key_t
- ...
De même, pour examiner la commande
ssh
, nous pourrions déterminer un mappage similaire entressh_home_t
etssh_exec_t
.ls -lZ /usr/bin/ssh
Exemple de sortie :
-rwxr-xr-x. 1 root root system_u:object_r:ssh_exec_t:s0 775720 Oct 9 2021 /usr/bin/ssh
ls -lZ ~/.ssh
Exemple de sortie :
total 4 -rw-------. 1 oracle oracle unconfined_u:object_r:ssh_home_t:s0 404 Apr 13 14:39 authorized_keys
-
Obtenir le contexte de sécurité d'un utilisateur.
L'autre type de contexte qui vous intéresse est
unconfined_t
. Les objets de ce type SELinux, tels que les utilisateurs, disposent d'un accès illimité. Ce niveau d'accès signifie que SELinux ne limite pas ce que les utilisateurs peuvent faire et les empêche uniquement par le biais des autorisations DAC. DAC (Discretionary Access Control) est la stratégie de sécurité gérée par les utilisateurs traditionnels, les groupes et d'autres autorisations.Par exemple, affichez les attributs de sécurité de l'utilisateur
oracle
.whoami
id -Z
Exemple de sortie :
[oracle@ol-selinux ~]$ whoami oracle [oracle@ol-selinux ~]$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Services réseau et SELinux
SELinux effectue le suivi des configurations des packages logiciels réseau les plus couramment utilisés dans sa base de données interne. Ce suivi permet à SELinux de protéger le système des services externes exposés à des attaques.
Par conséquent, SELinux peut empêcher un service de fonctionner si vous configurez le logiciel pour utiliser un répertoire ou un port non standard.
Pour montrer ce que SELinux sait des ports standard d'un système, nous devons utiliser l'utilitaire SELinux semanage
. Oracle Linux n'installe pas l'utilitaire par défaut. Installez-le donc.
-
Déterminez quel package fournit l'utilitaire.
sudo dnf whatprovides semanage
Les résultats indiquent que
/usr/sbin/semanage
fait partie du packagepolicycoreutils-python-utils
. -
Installez le package et toutes les dépendances.
sudo dnf install -y policycoreutils-python-utils
-
Vérifiez les ports autorisés par SELinux pour
sshd
.sudo semanage port -l | grep ssh
Exemple de sortie :
ssh_port_t tcp 22
-
Ajoutez un port à la stratégie SELinux.
Si nous devions modifier le port sur lequel le démon SSH écoute la valeur 2222 ou modifier l'emplacement de stockage de la configuration par défaut, nous devrions informer SELinux que nous voulons ces modifications. Nous pouvons à nouveau utiliser
semanage
pour autoriser un port personnalisé en ajoutant une nouvelle règle de stratégie.sudo sudo semanage port -a -t ssh_port_t -p tcp 2222
- L'option
-a
ajoute une nouvelle règle de stratégie de type-t
.
- L'option
-
Vérifiez les ports autorisés par SELinux.
sudo semanage port -l | grep ssh
Exemple de sortie :
ssh_port_t tcp 2222, 22
-
Modifiez un port dans la stratégie SELinux.
Supposons que nous voulions mapper le démon SSH au port 443. Répétez la même commande, mais une erreur survient avec un message indiquant que le port est déjà utilisé.
sudo semanage port -a -t ssh_port_t -p tcp 443
Exemple de sortie :
ValueError: Port tcp/443 already defined
L'erreur est survenue car nous essayons de faire passer le port 443 du type
http_port_t
au typessh_port_t
. Pour que cela fonctionne, utilisez l'option-m
, qui modifie l'enregistrement d'objet de port.sudo semanage port -m -t ssh_port_t -p tcp 443
Utilisateurs SELinux
Chaque utilisateur Linux est mis en correspondance avec un utilisateur SELinux à l'aide d'une stratégie SELinux. Cette approche permet aux utilisateurs Linux d'hériter des restrictions en fonction de leur mappage utilisateur SELinux. Le mappage par défaut dans Oracle Linux est la connexion __default__
, qui est mise en correspondance avec l'utilisateur SELinux unconfined_u
.
-
Obtenir la liste de tous les mappages utilisateur Linux en cours.
sudo semanage login -l
- Notez que notre utilisateur
oracle
n'est pas répertorié et est donc mappé avec l'utilisateurunconfined_u
.
- Notez que notre utilisateur
-
Obtenir la liste des utilisateurs de SELinux.
seinfo -u
-
Limitez les actions d'un utilisateur.
Bien qu'un utilisateur Linux par défaut s'exécute sans contrainte, les actions de l'utilisateur peuvent induire des restrictions basées sur les applications
domain
.domain
est un groupe d'objets de même type SELinux.Et si nous voulions empêcher les utilisateurs d'utiliser le système X Window,
sudo
et le réseau ?Pour cela, SELinux a un utilisateur.
Pour ce faire, nous devons disposer d'un autre utilisateur Linux. Nous utiliserons l'utilisateur ralph.
-
Créez le mapping vers
guest_u
.sudo semanage login -a -s guest_u ralph
-
Vérifiez le mappage.
sudo semanage login -l
-
Vérifiez que ralph ne peut pas accéder au réseau.
Les restrictions héritées de
guest_u
ne se produisent qu'après la connexion et non en exécutantsudo
ousu
.Ouvrez un nouveau terminal et connectez-vous via ssh au système ol8-server en tant qu'utilisateur ralph.
ssh ralph@<ip_address_of_ol8-server>
-
Vérifiez le contexte de l'utilisateur.
id; id -Z
Exemple de sortie :
uid=8000(ralph) gid=8000(ralph) groups=8000(ralph) context=guest_u:guest_r:guest_t:s0 guest_u:guest_r:guest_t:s0
-
Afficher le contexte de sécurité des processus en cours de l'utilisateur :
ps axZ
La sortie affiche l'utilisateur ralph mappé à
guest_u
et peut se connecter. Cependant, ralph ne doit pas être en mesure d'accéder au réseau. -
Testez la connectivité réseau avec
ping
.ping localhost
Exemple de sortie :
ping: socket: Permission denied
-
Testez également le réseau à l'aide de
curl
.curl ifconfig.me
Exemple de sortie :
curl: (6) Could not resolve host: ifconfig.me
Le message indique que
curl
ne peut pas résoudre le nom DNS deifconfig.me
en une adresse IP. Le DNS, un service réseau Linux, nécessite l'ouverture d'un socket, de sorte que l'utilisateur SELinuxguest_u
le bloque. -
Ferme la fenêtre de terminal actuelle.
Nous avons terminé le test avec l'utilisateur ralph, fermez donc cette fenêtre de terminal.
exit
-
Booléens de SELinux
Les valeurs booléennes de SELinux autorisent des modifications de stratégie spécifiques lors de l'exécution sans savoir comment écrire des stratégies SELinux. Oracle Linux fournit de nombreux booléens intégrés ou les administrateurs familiers avec les stratégies SELinux peuvent écrire les siennes. Les administrateurs sont encouragés à écrire des stratégies en tant que valeurs booléennes si la stratégie implémentée est facultative.
-
Obtenez une liste de booléans avec leur signification.
Revenez au terminal sur lequel vous êtes connecté en tant qu'utilisateur oracle et exécutez la commande suivante.
sudo semanage boolean -l
Exemple de sortie :
SELinux boolean State Default Description abrt_anon_write (off , off) Allow abrt to anon write abrt_handle_event (off , off) Allow abrt to handle event abrt_upload_watch_anon_write (on , on) Allow abrt to upload watch anon write antivirus_can_scan_system (off , off) Allow antivirus to can scan system antivirus_use_jit (off , off) Allow antivirus to use jit auditadm_exec_content (on , on) Allow auditadm to exec content authlogin_nsswitch_use_ldap (off , off) Allow authlogin to nsswitch use ldap authlogin_radius (off , off) Allow authlogin to radius ...
- La sortie explique le rôle de chaque booléen et indique s'il est activé (
on
) ou désactivé (off
).
- La sortie explique le rôle de chaque booléen et indique s'il est activé (
-
Obtenez une liste des seuls booléens et leur statut.
sudo getsebool -a
Exemple de sortie :
abrt_anon_write --> off abrt_handle_event --> off abrt_upload_watch_anon_write --> on antivirus_can_scan_system --> off antivirus_use_jit --> off auditadm_exec_content --> on authlogin_nsswitch_use_ldap --> off authlogin_radius --> off authlogin_yubikey --> off ...
-
Obtenir le statut d'un seul booléen.
Si le nom booléen est connu, transmettez le nom en tant qu'argument pour obtenir uniquement le statut des booléens.
sudo getsebool virt_use_nfs
-
Interrogez la stratégie SELinux pour une valeur booléenne.
Vous êtes-vous déjà demandé quels déclencheurs booléens de la stratégie SELinux ? SELinux fournit un utilitaire permettant d'interroger ces règles.
sesearch -b virt_use_nfs -A
Exemple de sortie :
allow fsdaemon_t autofs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:file { getattr ioctl lock open read }; [ virt_use_nfs ]:True allow fsdaemon_t nfs_t:lnk_file { getattr read }; [ virt_use_nfs ]:True ...
-
Interroger si un booléen autorise l'accès.
Et si un accès particulier est autorisé en fonction d'une valeur booléenne conditionnelle ? Répondez à la question : la commande ping utilisateur autorise-t-elle la transition d'un domaine utilisateur (
user_t
) vers le domaine ping (ping_t
) ?sesearch -s user_t -t ping_t -c process -p transition -AT
Exemple de sortie :
allow user_t ping_t:process transition; [ selinuxuser_ping ]:True
- La transition est autorisée si le booléen SELinux
user_ping
est activé.
- La transition est autorisée si le booléen SELinux
-
Activez une valeur booléenne.
Supposons que nous souhaitons autoriser KVM à stocker des images sur un partage Samba ? Il y a aussi un booléen.
-
Recherchez le booléen.
sudo semanage boolean -l | grep virt | grep samba
Exemple de sortie :
virt_use_samba (off , off) Allow virt to use samba
-
Remplacez la valeur boolean par Enabled.
sudo setsebool virt_use_samba on
ou
sudo semanage boolean -m --on virt_use_samba
-
Vérifiez le statut actuel.
getsebool virt_use_samba
-
Assurez-vous que la modification survit à une réinitialisation.
sudo setsebool -P virt_use_samba on
-
-
Afficher les personnalisations de stratégie SELinux locales.
Sachant que nous avons modifié les paramètres par défaut, nous pouvons afficher ces personnalisations locales.
sudo semanage boolean -l -C
Exemple de sortie :
SELinux boolean State Default Description virt_use_samba (on , on) Allow virt to use samba
- La sortie indique que la valeur par défaut est désormais
on
. La valeur par défaut a été modifiée après la définition du commutateur comme permanent et l'écriture des valeurs en attente dans le fichier de stratégie sur le disque.
- La sortie indique que la valeur par défaut est désormais
Contexte du fichier SELinux
Tous les fichiers et répertoires sont étiquetés avec un contexte SELinux lors de l'exécution de SELinux. Nous examinerons quelques commandes permettant de gérer l'étiquetage du système de fichiers.
Un exemple familier est la création d'un répertoire pour la racine de document de Nginx.
-
Créez le nouveau répertoire avec trois fichiers.
sudo mkdir -p /web sudo touch /web/file{1,2,3}
-
Vérifiez le nouveau répertoire et l'étiquetage des fichiers.
ls -lZ /web
Exemple de sortie :
total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
- Le type de contexte du nouveau répertoire et les fichiers sont
default_t
.
Remarque : les fichiers et répertoires nouvellement créés héritent du type SELinux de leurs répertoires parent.
- Le type de contexte du nouveau répertoire et les fichiers sont
-
Apportez des modifications temporaires aux libellés.
Dans le cadre du dépannage ou du test, nous pouvons modifier temporairement le contexte.
sudo chcon -R -t httpd_sys_content_t /web/
ls -lZ /web
-
Renvoyez les étiquettes aux paramètres par défaut.
Rétablissez le type de contexte par défaut.
sudo restorecon -R -v /web/
Exemple de sortie :
[oracle@ol-selinux ~]$ sudo restorecon -R -v /web/ Relabeled /web from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file1 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file2 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 Relabeled /web/file3 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 [oracle@ol-selinux ~]$ ls -lZ /web total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
-
Les changements d'étiquette deviennent permanents.
Pour rendre les modifications permanentes et survivre à une réinitialisation, utilisez la commande
semanage fcontext
.-a
ajoute un enregistrement au fichier/etc/selinux/targeted/contexts/files/file_contexts.local
et-t
définit le type.sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
Remarque : lors de la modification du contexte SELinux à l'aide de
semanage fcontext
, il est recommandé d'utiliser le chemin d'accès complet au fichier ou au répertoire pour éviter les erreurs d'étiquetage des fichiers après la modification de l'étiquette d'un système de fichiers ou après l'exécution derestorecon
. -
Vérifiez le contexte.
ls -ldZ /web; ls -lZ /web
Exemple de sortie :
[oracle@ol-selinux ~]$ ls -ldZ /web; ls -lZ /web drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 45 Apr 14 19:00 /web total 0 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
Notez que le contexte n'a pas changé, ce que nous attendions.
-
Affichez le contexte des fichiers et répertoires nouvellement créés.
sudo semanage fcontext -C -l
Exemple de sortie :
[oracle@ol-selinux ~]$ sudo semanage fcontext -C -l SELinux fcontext type Context /web(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
-
Appliquez les modifications au contexte.
sudo restorecon -R -v /web
Exemple de sortie :
[oracle@ol-selinux ~]$ sudo restorecon -R -v /web Relabeled /web from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file1 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file2 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /web/file3 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
-
Supprimez le nouveau contexte SELinux.
sudo semanage fcontext -d "/web(/.*)?"
- Cet exemple transmet l'expression régulière utilisée lors de la création du contexte et la place au début de l'enregistrement de contexte dans le fichier. Etant donné qu'il s'agit d'une expression régulière, placez-la entre guillemets.
-
Appliquez les modifications et vérifiez le contexte renvoyé à
default_t
.sudo restorecon -R -v /web; ls -ldZ /web; ls -lZ /web
Consultez les pages man
des utilitaires indiqués. Utilisez ensuite ce que vous avez appris pour conserver SELinux en mode Enforcing
.
Pour plus d'informations
Voir d'autres ressources connexes :
Ressources de formation supplémentaires
Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenu de formation gratuit sur le canal Oracle Learning YouTube. En outre, accédez à education.oracle.com/learning-explorer pour devenir explorateur Oracle Learning.
Pour consulter la documentation du produit, consultez Oracle Help Center.