GNU/Linux >> Tutoriels Linux >  >> Linux

Comment lire et corriger les messages de refus SELinux

Security Enhanced Linux (SELinux) est un cadre de sécurité qui autorise et refuse l'accès aux applications, fichiers, etc. au sein d'un système Linux. Pour un aperçu complet de SELinux, consultez Qu'est-ce que SELinux.

Pour cet article, nous examinerons ce qui se passe lorsque l'accès à un fichier ou à une application souhaité est refusé. Quels messages verrez-vous, où ces messages sont-ils stockés et que signifient réellement les informations ? Quelles sont certaines des situations anormales, causées par des faux positifs et des dénégations fantômes, dans lesquelles vous pourriez vous retrouver ? Nous allons explorer tout cela ici.

Qu'est-ce qu'un refus ?

Un démenti est l'événement généré chaque fois qu'un service, une application, un fichier, etc. se voit refuser l'accès par le système SELinux. Lorsque cela se produit, le refus est mis en cache dans le cache vectoriel d'accès (AVC). Vous verrez parfois un message de refus appelé refus AVC .

Où les refus sont-ils enregistrés ?

Désormais, ces refus AVC, comme tout le reste sous Linux, sont enregistrés par le système. L'endroit où ces messages sont consignés varie en fonction des démons système en cours d'exécution.

  • audité le - /var/log/audit/audit.log
  • audité ; rsyslogd sur - /var/log/messages
  • setroubleshootd, rsyslogd et auditd on - Les deux emplacements, bien que les messages dans /var/log/messages soient plus faciles à comprendre

À quoi ressemblera un refus ?

Vous verrez parfois un avertissement de refus sur votre bureau. Lorsque vous sélectionnez afficher , cette alerte vous donnera des détails sur ce qui s'est mal passé et même parfois une solution pour résoudre le problème.

Une autre chose que vous pouvez faire est d'exécuter les commandes suivantes pour extraire les messages de refus :

[root@server ~]# grep "SELinux is preventing" /var/log/messages

Ici, la sortie est dans un langage plus accessible, et si vous lisez attentivement, une solution est présentée :

Sep 22 13:35:24 server setroubleshoot[3999]: SELinux is preventing rhsmcertd-worke from read access on the file virt.module. For complete SELinux messages run: sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b
Sep 22 13:35:24 server platform-python[3999]: SELinux is preventing rhsmcertd-worke from read access on the file virt.module.#012#012*****  Plugin catchall_boolean (89.3 confidence) suggests   ******************#012#012If you want to allow daemons to dump core#012Then you must tell SELinux about this by enabling the 'daemons_dump_core' boolean.#012#012Do#012setsebool -P daemons_dump_core 1#012#012*****  Plugin catchall (11.6 confidence) suggests   **************************#012#012If you believe that rhsmcertd-worke should be allowed read access on the virt.module file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'rhsmcertd-worke' --raw | audit2allow -M my-rhsmcertdworke#012# semodule -X 300 -i my-rhsmcertdworke.pp#012

Cette sortie est en fait très utile, car la première entrée ci-dessus nous donne ce qui suit :

For complete SELinux messages run: sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b

Si vous exécutez la commande suggérée, vous obtenez un résumé très détaillé mais simple de ce qui s'est passé et de ce que vous pouvez faire pour résoudre le problème. Vu ci-dessous :

    [root@server ~]# sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b
    SELinux is preventing rhsmcertd-worke from read access on the file virt.module.
    
    *****  Plugin catchall_boolean (89.3 confidence) suggests   ******************
    
    If you want to allow daemons to dump core
    Then you must tell SELinux about this by enabling the 'daemons_dump_core' boolean.
    
    Do
    setsebool -P daemons_dump_core 1
    
    *****  Plugin catchall (11.6 confidence) suggests   **************************
    
    If you believe that rhsmcertd-worke should be allowed read access on the virt.module file 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 'rhsmcertd-worke' --raw | audit2allow -M my-rhsmcertdworke
    # semodule -X 300 -i my-rhsmcertdworke.pp
    
    
    Additional Information:
    Source Context                system_u:system_r:rhsmcertd_t:s0
    Target Context                system_u:object_r:root_t:s0
    Target Objects                virt.module [ file ]
    Source                        rhsmcertd-worke
    Source Path                   rhsmcertd-worke
    Port                          <Unknown>
    Host                          server.example.com
    Source RPM Packages           
    Target RPM Packages           
    Policy RPM                    selinux-policy-3.14.3-41.el8_2.5.noarch
    Selinux Enabled               True
    Policy Type                   targeted
    Enforcing Mode                Enforcing
    Host Name                     server.example.com
    Platform                      Linux server.example.com
                                  4.18.0-193.13.2.el8_2.x86_64 #1 SMP Mon Jul 13
                                  23:17:28 UTC 2020 x86_64 x86_64
    Alert Count                   265
    First Seen                    2020-06-24 13:55:40 EDT
    Last Seen                     2020-09-22 13:35:09 EDT
    Local ID                      97a1c0df-81ed-4c08-ba27-41c5067b713b
    
    Raw Audit Messages
    type=AVC msg=audit(1600796109.687:168): avc:  denied  { read } for  pid=3912 comm="rhsmcertd-worke" name="virt.module" dev="dm-0" ino=50331783 scontext=system_u:system_r:rhsmcertd_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0
    
    
    Hash: rhsmcertd-worke,rhsmcertd_t,root_t,file,read

[ Les lecteurs ont également apprécié : Accéder à la documentation sur les règles de SELinux ]

Vous pouvez également utiliser la commande ci-dessous pour les messages d'audit bruts, bien qu'ils soient nettement moins utiles (et qu'ils soient inclus dans le sealert sortie).

[root@server ~]# grep "denied"/var/log/audit/audit.log

Ici, le langage est moins convivial et aucune étape n'est suggérée.

type=AVC msg=audit(1600796109.687:168): avc:  denied  { read } for  pid=3912 comm="rhsmcertd-worke" name="virt.module" dev="dm-0" ino=50331783 scontext=system_u:system_r:rhsmcertd_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0

Dénégations fantômes

Lors d'occasions spéciales (spéciales , comme dans leur capacité à générer de la frustration), l'AVC SELinux peut refuser un service sans alerter l'utilisateur que le refus s'est produit. Lorsque cela se produit, une petite fouille médico-légale est nécessaire. Récemment, mon collègue et écrivain extraordinaire, Ken Hess, a installé un système de gestion de documents sur une machine virtuelle CentOS. Au cours de cette installation, le DMS n'a pas pu s'installer sans explication. Après un processus de dépannage long et frustrant, Ken a découvert qu'il y avait des messages de refus répétés dans /var/log/audit/audit.log .

type=AVC msg=audit(1602171971.334:438): avc: denied { write } for pid=12398 comm="httpd" name="31b32f0dfa1f50d778065b767582bb9b.js" dev="dm-0" ino=553885 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=file permissive=0

Après une inspection plus approfondie de /var/log/messages , il a trouvé ce qui suit :

Oct 8 12:33:17 dms python: SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25.#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow httpd to can network connect#012Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean.#012#012Do#012setsebool -P httpd_can_network_connect 1#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow httpd to can sendmail#012Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean.#012#012Do#012setsebool -P httpd_can_sendmail 1#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow nis to enabled#012Then you must tell SELinux about this by enabling the 'nis_enabled' boolean.#012#012Do#012setsebool -P nis_enabled 1#012#012***** Plugin catchall (4.5 confidence) suggests ***************************#012#012If you believe that httpd should be allowed name_connect access on the port 25 tcp_socket by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'httpd' --raw | audit2allow -M my-httpd#012# semodule -i my-httpd.pp#012 Oct 8 12:33:20 dms setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. For complete SELinux messages run: sealert -l ce75fc38-5696-4b21-b099-7780db5960f3

Enfin quelque chose d'utile. Il a ensuite exécuté la commande suivante :

# sealert -l ce75fc38-5696-4b21-b099-7780db5960f3

Qui a fourni ces informations :

[user@host ~] # SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can network connect Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean. Do setsebool -P httpd_can_network_connect 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can sendmail Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean. Do setsebool -P httpd_can_sendmail 1 ***** Plugin catchall_boolean (32.5 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 (4.5 confidence) suggests *************************** If you believe that httpd should be allowed name_connect access on the port 25 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 'httpd' --raw | audit2allow -M my-httpd # semodule -i my-httpd.pp Additional Information:
    
Additional Information: [root@dms dms]# more sealert.txt SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can network connect Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean. Do setsebool -P httpd_can_network_connect 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can sendmail Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean. Do setsebool -P httpd_can_sendmail 1 ***** Plugin catchall_boolean (32.5 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 (4.5 confidence) suggests *************************** If you believe that httpd should be allowed name_connect access on the port 25 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 'httpd' --raw | audit2allow -M my-httpd # semodule -i my-httpd.pp Additional Information: Source Context system_u:system_r:httpd_t:s0 Target Context system_u:object_r:smtp_port_t:s0 Target Objects port 25 [ tcp_socket ] Source httpd Source Path /usr/sbin/httpd Port 25 Host dms Source RPM Packages Target RPM Packages Policy RPM selinux-policy-3.13.1-252.el7.noarch Selinux Enabled True Policy Type targeted Enforcing Mode Permissive Host Name dms Platform Linux dms 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 Alert Count 2 First Seen 2020-10-08 12:33:15 CDT Last Seen 2020-10-08 12:33:15 CDT Local ID ce75fc38-5696-4b21-b099-7780db5960f3 Raw Audit Messages type=AVC msg=audit(1602178395.253:461): avc: denied { name_connect } for pid=12565 comm="httpd" dest=25 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:smtp_port_t :s0 tclass=tcp_socket permissive=1 Hash: httpd,httpd_t,smtp_port_t,tcp_socket,name_connect

Lorsque j'ai demandé à Ken de donner son avis sur son expérience, il a répondu ceci :

Il est difficile de savoir quand une erreur, ou une absence d'erreur, est causée par SELinux. Lorsque vous avez vérifié les exceptions du pare-feu, les autorisations du système de fichiers et les prérequis de l'application, votre prochaine étape consiste à vérifier les problèmes de contexte SELinux. Le remède le plus courant consiste à désactiver SELinux en le plaçant en mode permissif, ce qui n'est pas une bonne idée car cela rend votre système vulnérable. La meilleure méthode consiste à vérifier les fichiers /var/log/messages et /var/log/audit/audit.log pour les refus SELinux et à partir de là pour remédier individuellement aux refus jusqu'à ce que votre application fonctionne. SELinux doit rester en mode d'application pour ce faire.

La liste de dépannage ressemble à ceci lors de la configuration d'une nouvelle application :

1. Vérifiez les exceptions de pare-feu pour les ports de votre application.

2. Vérifiez les autorisations du système de fichiers pour vous assurer que votre compte de service dispose des autorisations appropriées pour lire, écrire et exécuter si nécessaire.

3. Vérifiez les prérequis et les dépendances de votre application.

4. Vérifiez les fichiers /var/log/messages et /var/log/audit/audit.log pour les refus SELinux.

Le mode permissif de SELinux peut être utilisé brièvement pour vérifier si SELinux est le coupable en empêchant votre application de fonctionner. Une fois que vous avez déterminé qu'il s'agit du problème, remettez-le en mode d'application et commencez à modifier les contextes pertinents. Consultez ces informations pour les contextes SELinux.

[ Améliorez vos compétences en matière de gestion et d'utilisation de SELinux grâce à ce guide utile. ] 

Récapitulez

SELinux est un cadre de sécurité efficace qui peut être incroyablement utile lorsqu'il est correctement mis en œuvre. Comme avec tout bon système de sécurité, vous aurez des démentis au fil du temps. Savoir quoi faire avec les informations à votre disposition est primordial pour résoudre les problèmes qui peuvent être présents ou pour permettre des processus légitimes à travers le système. Vous savez maintenant où sont conservés les journaux et comment les interpréter au mieux. À l'avenir, vous pourrez répondre à toutes les alertes SELinux signalées sur votre système.


Linux
  1. Comment désactiver SELinux temporairement ou définitivement

  2. Variables d'environnement Linux :comment lire et définir sur un VPS Linux

  3. Comment désactiver SELinux sur CentOS ?

  4. Comment ouvrir, lire et écrire à partir du port série en C ?

  5. Comment lire, comprendre, analyser et déboguer une panique du noyau Linux ?

Comment installer et configurer SeedDMS

Dépannage et pièges de SELinux

Comment lire la sortie et les utilisations de la commande Linux Top

Comment configurer et lire le Webmail

Comment installer et configurer Grafana

Journalctl :comment lire et modifier les journaux Systemd