Dépannage de SELinux
- CONTENU
Un système exécutant SELinux en mode
enforcingpeut provoquer des refus d'accès risquant d'empêcher l'exécution correcte des applications. Vous pouvez utiliseraudit2allowousetroubleshootpour faciliter l'analyse des messages de refus.- MOTIF
Cet article donne des instructions expliquant comment résoudre les refus d'accès causés par SELinux sans compromettre la sécurité de votre système.
- EFFORT
La lecture de l'article prend environ 30 minutes.
- OBJECTIF
Vous pourrez utiliser l'un des outils décrits plus en détail ci-après pour déboguer les refus SELinux.
- CONDITIONS REQUISES
Un système en cours d'exécution avec SELinux activé.
1 Fichier /var/log/audit/audit.log #
Par défaut, si SELinux est à l'origine d'un quelconque problème de fonctionnement, un message est consigné dans le fichier journal /var/log/audit/audit.log.
/var/log/audit/audit.log vide
Si le journal /var/log/audit/audit.log est vide, cela signifie généralement que le service auditd n'est pas en cours d'exécution. Dans ce cas, procédez comme suit :
Démarrez le service
auditd:>sudosystemctl start auditdActivez le service dans les cibles de votre système à l'aide de la commande
>sudosystemctl enable auditd
Le fichier journal /var/log/audit/audit.log consigne les messages de refus d'accès, les événements de service, etc.
L'Exemple 1: « Exemples de lignes du journal /etc/audit/audit.log » affiche une partie du contenu du journal /var/log/audit/audit.log.
/etc/audit/audit.log #type=DAEMON_START msg=audit(1348173810.874:6248): auditd start, ver=1.7.7 format=raw kernel=3.0.13-0.27-default auid=0 pid=4235 subj=system_u:system_r:auditd_t res=success
type=AVC msg=audit(1348173901.081:292): avc: denied { write } for pid=3426 comm="smartd" name="smartmontools" dev=sda6 ino=581743 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:293): avc: denied { remove_name } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:294): avc: denied { unlink } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:295): avc: denied { rename } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582373 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:296): avc: denied { add_name } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:297): avc: denied { create } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:298): avc: denied { write open } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:299): avc: denied { getattr } for pid=3426 comm="smartd" path="/var/lib/smartmontools/smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.309:300): avc: denied { append } for pid=1316Un message unique se présente comme suit :
type=AVC msg=audit(1348173901.081:299): avc: denied { getattr } for pid=3426 comm="smartd" path="/var/lib/smartmontools/smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=fileChaque ligne du message peut être divisée en sections. Par exemple, les sections de la dernière ligne sont les suivantes :
type=AVC:Chaque ligne du journal d'audit relative à SELinux commence par l'identification du type, par exemple,
type=AVC. Notez qu'un message du typetype=SYSCALLqui suit un message d'un autre type et a la même valeur demsgpeut fournir des informations supplémentaires concernant l'événement.msg=audit(1348173901.309:300):Il s'agit du tampon horaire, inscrit par rapport à une époque, à savoir, le nombre de secondes écoulées depuis le 1er janvier 1970. Vous pouvez utiliser la commande
date ‑ddans la partie précédent le point de la notation horaire de l'époque pour découvrir à quelle date l'événement s'est produit :>date -d @1348173901Thu Sep 20 16:45:01 EDT 2012avc: denied { append }:Action spécifique refusée. Dans cet exemple, le système a refusé d'ajouter des données à un fichier. Lorsque vous parcourez le fichier journal d'audit, vous pouvez voir d'autres opérations système, telles que write open, getattr, etc.
for pid=1316:ID de processus de la commande ou du processus qui a déclenché l'action
comm="rsyslogd":Commande spécifique associée à ce PID
name="smartmontools":Nom de l'objet de l'action
dev=sda6 ino=582296:Périphérique de bloc et numéro d'inode du fichier concerné
scontext=system_u:system_r:syslogd_t:Contexte source, qui est le contexte de l'initiateur de l'action
tclass=file:Identification de classe de l'objet
2 Analyse du journal /var/log/audit/audit.log avec audit2allow #
Au lieu d'interpréter les événements du journal /var/log/audit/audit.log vous-même, vous pouvez utiliser la commande audit2allow.
La commande facilite l'analyse des messages consignés dans le journal /var/log/audit/audit.log. Une session de dépannage audit2allow est toujours composée de trois commandes différentes. Vous allez commencer par utiliser audit2allow -w
-a pour obtenir une présentation plus lisible des informations d'audit. La commande audit2allow -w -a par défaut fonctionne sur le fichier audit.log. Si vous souhaitez analyser un message spécifique du fichier audit.log, copiez-le dans un fichier temporaire et analysez le fichier avec la commande :
>sudoaudit2allow -w -i FILENAME
>sudoaudit2allow -w -i testfiletype=AVC msg=audit(1348173901.309:300): avc: denied { append } for pid=1316 comm="rsyslogd" name="acpid" dev=sda6 ino=582296 scontext=system_u:system_r:syslogd_t tcontext=system_u:object_r:apmd_log_t tclass=file
- Ce message a été causé par :
Une règle d'autorisation manquante relative au type d'application (TE - type enforcement).
Pour générer un module chargeable afin d'autoriser cet accès, exécutez :
>sudoaudit2allow
Pour savoir quelle règle spécifique a refusé l'accès, vous pouvez utiliser audit2allow -a pour afficher les règles d'application de tous les événements qui ont été consignés dans le fichier audit.log ou audit2allow -i FILENAME pour afficher les messages que vous avez enregistrés dans un fichier spécifique :
>sudoaudit2allow -i testfile#============= syslogd_t ============== allow syslogd_t apmd_log_t:file append;
Pour créer un module SELinux nommé mymodule que vous pouvez charger pour autoriser l'accès précédemment refusé, exécutez :
>sudoaudit2allow -a -R -M mymodule
Si vous souhaitez effectuer cette opération pour tous les événements qui ont été consignés dans le fichier audit.log, utilisez les arguments de commande -a -M. Pour le faire uniquement pour certains messages d'un fichier spécifique, utilisez -i -M comme dans l'exemple ci-dessous :
>sudoaudit2allow -i testfile -M example******************** IMPORTANT *********************** To make this policy package active, execute: semodule -i example.pp
Comme l'indique la commande audit2allow, vous pouvez maintenant exécuter ce module à l'aide de la commande semodule -i, suivie du nom du module qu'audit2allow a créé pour vous (example.pp dans l'exemple ci-dessus).
3 Analyse des messages AVC à l'aide de l'outil setroubleshoot #
Pour faciliter l'analyse des messages de refus AVC, vous pouvez utiliser l'outil setroubleshoot.
3.1 Présentation de setroubleshoot #
3.1.1 Qu'est-ce que setroubleshoot ? #
setroubleshoot est un outil qui collecte les événements d'audit SELinux du kernel et les analyse. Si ce type d'événement se produit, setroubleshoot en informe l'administrateur.
3.1.2 Composants setroubleshoot #
Le processus de dépannage de SELinux fait appel aux composants suivants qui sont tous installés par défaut sous SUSE Linux Micro.
setroubleshoot-serverfournit les outils suivants :setroubleshootd: le daemon principal qui traite les requêtes entrantes et les définitions de plug-ins. Le daemon est activé à la demande et ne nécessite pas d'être exécuté via le servicesystemd. Il ne peut être géré que par un utilisateur disposant de privilèges et un utilisateursetroubleshootdédié.une base de données d'alertes dans le fichier
/var/lib/setroubleshoot/setroubleshoot_database.xml.sealert: une interface utilisateur de ligne de commande pour analyser le journal/var/log/audit.log.sedispatch: un répartiteur d'audit qui analyse les messages AVC SELinux et les transforme en message DBus, puis les transmet au daemon.
setroubleshoot-plugins: les plug-ins sont utilisés pour l'analyse des messages AVC et fournissent des suggestions sur la façon de résoudre les problèmes.
3.1.3 Comment fonctionne setroubleshoot ? #
setroubleshoot est constitué d'un daemon et de plug-ins d'analyse. Lorsqu'un plug-in détecte un problème, il est signalé au daemon, qui vérifie alors s'il s'agit d'un problème connu. S'il n'est pas encore connu, le nouveau problème est ajouté à la base de données avec une suggestion de solution.
3.1.4 Avantages de l'outil setroubleshoot #
setroubleshoot fournit les fonctionnalités suivantes pour vous aider à résoudre les problèmes sur vos systèmes SELinux sécurisés :
Envoi d'alertes à l'administrateur en cas de refus AVC.
Analyse automatique des refus AVC.
Suggestion de correctifs possibles, tels que l'ajustement de la configuration du système ou l'installation de mises à jour, etc.
Navigation dans les alertes précédentes.
3.2 Configuration de setroubleshoot #
Même si la configuration de setroubleshoot ne nécessite aucun ajustement, vous pouvez être confronté à des cas d'utilisation spécifiques pour lesquels vous devrez modifier les valeurs par défaut. Les sections suivantes présentent les cas d'utilisation habituels.
Le fichier de configuration de setroubleshoot est /etc/setroubleshoot. Hormis l'activation des notifications par message électronique, il n'est généralement pas nécessaire de modifier la configuration. Toutefois, si vous deviez la modifier, vous pouvez modifier le fichier ou utiliser la commande setroubleshootd pour configurer un élément particulier. La syntaxe de la commande est la suivante :
#setroubleshootd -c SECTION.OPTION=VALUE
Par exemple, pour définir l'option from_address, exécutez la commande comme suit :
#setroubleshootd -c email.from_address="example@mail.com"
3.2.1 Configuration du niveau de consignation pour setroubleshoot #
Le niveau de consignation par défaut (la valeur de sealert_log et de setroubleshootd_log) est défini sur warning. Toutefois, vous pouvez définir la valeur sur l'une des valeurs suivantes :
- critical (critique)
Seules les erreurs graves qui empêchent le système de fonctionner sont consignées.
- error (erreur)
Les erreurs graves susceptibles d'avoir un impact sur le système sont signalées.
- warning (avertissement)
Indication qu'un événement inattendu s'est produit ou qu'un problème risque de se produire dans un avenir proche. Cependant, le système fonctionne comme prévu.
- info
Une confirmation que le système fonctionne correctement est consignée.
- debug (débogage)
Des informations détaillées à des fins de débogage sont consignées.
3.2.2 Configuration de setroubleshoot pour l'envoi de notifications par message électronique #
setroubleshoot peut vous envoyer des notifications par message électronique en cas de refus AVC dans le système.
Pour recevoir ces notifications, procédez comme suit :
Ouvrez le dossier
/etc/setroubleshoot/setroubleshoot.conf.Dans le fichier, définissez les éléments de configuration suivants en fonction de vos besoins :
- smtp_host
Si le serveur SMTP ne s'exécute pas sur l'hôte local, indiquez l'adresse du serveur.
- smtp_port
La valeur par défaut est 25. En règle générale, cette valeur ne nécessite aucun ajustement.
- from_address
Ajoutez l'adresse de l'expéditeur.
- subject
Configurez un objet générique pour tous les messages.
- recipients_filepath
Indiquez l'emplacement de la liste des destinataires de la notification.
- use_sendmail
Définissez cette option sur
truesi vous utilisez SendMail.
Créez le fichier des destinataires du message dans le chemin défini par l'option
recipients_filepath(/var/lib/setroubleshoot/email_alerts-recipientspar défaut).Chaque adresse électronique doit se trouver sur une ligne distincte. Les commentaires sont signalés par le symbole #.
3.2.3 Configuration de la base de données setroubleshoot #
Vous pouvez modifier la quantité d'enregistrements dans la base de données setroubleshootd, son emplacement ou le préfixe du nom de fichier.
-
database_dir Spécifiez un chemin absolu vers le répertoire dans lequel le fichier XML de la base de données doit se trouver.
-
filename Configurez un préfixe personnalisé pour le nom de fichier de la base de données. Le nom du fichier se présente alors comme suit :
FILENAME_PREFIX_database.xml.-
max_alerts Définit le nombre maximal d'enregistrements dans la base de données. Spécifiez
0pour ne pas limiter le nombre d'enregistrements.-
max_alert_age Les alertes antérieures à la limite définie sont supprimées de la base de données. Vous pouvez utiliser les unités : année, mois, jour, heure, minute et seconde même au pluriel et vous pouvez utiliser plusieurs unités, par exemple,
3 weeks 2 daysqui équivaut à 23 jours. Si aucune valeur n'est spécifiée, il n'y a pas de limite.
3.2.4 Configuration de setroubleshoot pour collecter des informations à partir de serveurs distants #
Vous pouvez configurer setroubleshoot pour collecter les données d'audit SELinux à partir de serveurs distants. Pour ce faire, configurez la liste d'adresses.
- [listen_for_client] address_list
Du côté du serveur.
- [client_connect_to] address_list
Du côté du client.
Les adresses de la liste utilisent le format suivant :
[{FAMILY}]ADDRESS[:PORT_NUMBER]
Où {FAMILY} est soit {inet}, soit {unix}%{path}s. Si la famille d'adresses est inet, vous pouvez éventuellement spécifier un numéro de port, sinon le numéro de port est défini sur la valeur par défaut spécifiée par l'option de configuration default_port. La valeur par défaut {unix}%{path}s hostname signifie l'écoute sur le socket du domaine Unix local.
3.3 Exécution de l'analyse du journal /var/log/audit/audit.log #
Pour permettre à l'outil setroubleshootd'analyser le fichier journal d'audit, exécutez la commande :
>sudosealert -a /var/log/audit/audit.log
Dans l'exemple de sortie suivant, deux valeurs de port sont assignées au service SSHD :
100% done
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing sshd from name_bind access on the tcp_socket port 2222.
***** Plugin bind_ports (92.2 confidence) suggests ************************
If you want to allow sshd to bind to network port 2222
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 2222 1
where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.
***** Plugin catchall_boolean (7.83 confidence) suggests ******************
If you want to allow nis to enabled
Then you must tell SELinux about this by enabling the 'nis_enabled' boolean.
Do
setsebool -P nis_enabled 1
***** Plugin catchall (1.41 confidence) suggests **************************
If you believe that sshd should be allowed name_bind access on the port 2222 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'sshd' --raw | audit2allow -M my-sshd
# semodule -X 300 -i my-sshd.pp
Additional Information:
...
First Seen 2024-02-07 14:26:27 UTC
Last Seen 2024-02-08 03:30:12 UTC
Local ID b5cbdd75-3f8d-425d-af75-f6cbf1540ffd
Raw Audit Messages
type=AVC msg=audit(1707363012.797:25): avc: denied { name_bind } for pid=841 comm="sshd" src=2222 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0
Hash: sshd,sshd_t,unreserved_port_t,tcp_socket,name_bind
Le plug-in |
4 Mentions légales #
Copyright © 2006–2025 SUSE LLC et contributeurs. Tous droits réservés.
Il est autorisé de copier, distribuer et/ou modifier ce document conformément aux conditions de la licence de documentation libre GNU version 1.2 ou (à votre discrétion) 1.3, avec la section permanente qu'est cette mention de copyright et la licence. Une copie de la version de licence 1.2 est incluse dans la section intitulée « Licence de documentation libre GNU ».
Pour les marques commerciales SUSE, consultez le site Web https://www.suse.com/company/legal/. Toutes les autres marques de fabricants tiers sont la propriété de leur détenteur respectif. Les symboles de marque (®, ™, etc.) désignent des marques commerciales de SUSE et de ses sociétés affiliées. Des astérisques (*) désignent des marques commerciales de fabricants tiers.
Toutes les informations de cet ouvrage ont été regroupées avec le plus grand soin. Cela ne garantit cependant pas sa complète exactitude. Ni SUSE LLC, ni les sociétés affiliées, ni les auteurs, ni les traducteurs ne peuvent être tenus responsables des erreurs possibles ou des conséquences qu'elles peuvent entraîner.