GNU/Linux >> Tutoriels Linux >  >> Linux

Dépannage et pièges de SELinux

Vous ne pouvez pas laisser vos échecs vous définir. Vous devez laisser vos échecs vous apprendre ― Barack Obama

L'une des grandes batailles, en particulier avec les fournisseurs de solutions tiers, est de maintenir la sécurité de nos serveurs. Dans de nombreux cas, le défi est la demande de désactiver SELinux afin qu'une application puisse fonctionner correctement. Heureusement, cela se produit de moins en moins.

Dans la plupart de ces cas, une analyse suffit pour trouver le bon dépannage ou la bonne solution de contournement.

SELinux est un système d'étiquetage , qui nous indique que chaque fichier, répertoire ou objet du système a un Label correspondant . Les politiques contrôlent l'interaction entre ces éléments. Le noyau applique ces règles.

Les deux concepts les plus importants sont Étiquetage (fichiers, processus, ports, etc.) et Type Enforcement (qui isole les processus les uns des autres selon leur type).

Le format utilisé par les libellés est :user:role:type:level (facultatif).

Pour connaître la configuration actuelle, lancez le getenforce et sestatus commandes :

# getenforce
Enforcing
# sestatus
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:      32

Les meilleures pratiques nous disent que lorsque nous testons une nouvelle application tierce, nous devons temporairement configurer SELinux en mode permissif afin de déterminer quelles politiques ou booléens (chaînes simples qui modifient le comportement) sont nécessaires. Exécutez la commande :

# setenforce 0

En parcourant les journaux, vous pouvez découvrir ce dont SELinux a besoin pour que l'application fonctionne correctement.

Qu'est-ce que SELinux essaie de me dire ?

Il n'y a que quatre principales causes d'erreurs qui génèrent des alertes dans SELinux :

  1. Étiquetage.
  2. SELinux doit savoir.
  3. La politique SELinux et/ou l'application peuvent avoir des bogues.
  4. Vos informations peuvent être compromises.

Le dernier cas est dû à des modifications apportées pour attaquer des vulnérabilités ou éviter le traçage des activités, même si dans les deux cas, il est indispensable de revoir ces alertes; pour des raisons pratiques, pour le moment, nous ne les traiterons pas avant une éventuelle future affectation.

Étiquetage

Problème d'étiquetage :Fichiers dans /srv/myweb ne sont pas correctement étiquetés et ne sont pas accessibles.

SELinux attribue une étiquette pour chaque élément impliqué dans le même service :

  • Fichier binaire :/usr/sbin/httpd → httpd_exec_t
  • Fichier de configuration :/etc/httpd → httpd_config_t
  • Fichier journal :/var/log/httpd → httpd_log_t
  • Répertoire de contenu :/var/www/html → httpd_sys_content_t
  • Script de démarrage :/usr/lib/systemd/system/httpd.service → httpd_unit_file_t
  • Processus :/usr/sbin/httpd → httpd_t
  • Ports :80/tcp, 443/tcp → httpd_t et httpd_port_t

Sur le serveur Web, un processus s'exécutant dans le httpd_t contexte ne peut interagir avec les objets qu'avec le httpd_something_t libellé .

Solution :Étiqueter correctement les fichiers.

Si vous connaissez le bon libellé, exécutez :

# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'

Si vous connaissez un fichier avec l'étiquette équivalente, exécutez :

# semanage fcontext -a -e /srv/myweb /var/www

Restaurez le contexte par défaut des fichiers, dans les deux cas :

# restorecon -vR /srv/myweb

Problème d'étiquetage  :Si un fichier est déplacé, au lieu d'être copié, il conserve son étiquette d'origine.

$ mv index.html /var/www/html/

Solution :Étiqueter correctement le fichier.

Remplacez le contexte par le bon libellé :

# chcon -t httpd_system_content_t /var/www/html/index.html

Modification du contexte avec un libellé de référence :

# chcon --reference /var/www/html/ /var/www/html/index.html

Restaurez le contexte par défaut du fichier, dans les deux cas :

# restorecon -vR /var/www/html/

[ Vous pourriez également aimer : Accéder à la documentation sur les règles SELinux ]

SELinux doit savoir

Personnalisation des services :Le serveur Web écoutera les requêtes sur le port 8585.

Pour ajouter le port souhaité au contexte, exécutez :

# semanage port -a -t http_port_t -p tcp 8585

Ajout de fonctionnalités au service :Le serveur Web pourra envoyer des e-mails.

Pour activer la fonction d'envoi de courrier, activez le booléen, en exécutant :

# setsebool -P httpd_can_sendmail 1

Le -P flag rend le changement permanent dans le booléen.

Pour obtenir tous les booléens, exécutez :

# getsebool -a

Pour vérifier l'état d'un booléen, exécutez :

# semanage boolean -l

Dépannage des règles

Certains services n'ont pas de politique spécifique créée contenant les autorisations suffisantes nécessaires pour travailler avec SELinux. Pour déterminer quelles sont ces autorisations, il est nécessaire de définir le mode permissif et d'inspecter les journaux à la recherche d'erreurs d'accès.

Le service ne fonctionne pas :wicd est utilisé à la place du service NetworkManager pour gérer les connexions sans fil.

Inspecter le audit.log fichier pour accès refusé :

# grep denied audit.log | cut -d{ -f2 | sort -n | uniq -u
 create } for  pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
 create } for  pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
 ioctl } for  pid=2670 comm="wicd" path="socket:[52681]" dev="sockfs" ino=52681 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
 ioctl } for  pid=2670 comm="wicd" path="socket:[52684]" dev="sockfs" ino=52684 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
 setattr } for  pid=2214 comm="wicd" name="dhclient.conf.template" dev="dm-0" ino=437068 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=file permissive=0

Notez que certains éléments impliqués dans les contextes NetworkManager_t et etc_t nécessitent des droits et un accès à différents fichiers et création de sockets.

Créer le type d'application (.te) fichier avec les autorisations nécessaires pour la stratégie :

# vi my_wicd.te
module my_wicd 1.0;
 
require {
        type NetworkManager_t;
        type etc_t;
        class ipx_socket create;
        class ax25_socket { create ioctl };
        class appletalk_socket { create ioctl };
        class file setattr;
}
 
#============= NetworkManager_t ==============
allow NetworkManager_t etc_t:file setattr;
allow NetworkManager_t self:appletalk_socket { create ioctl };
allow NetworkManager_t self:ax25_socket { create ioctl };
allow NetworkManager_t self:ipx_socket create;

Pour compiler la politique, installez le package selinux-policy-devel et générez le package de stratégie :

# make -f /usr/share/selinux/devel/Makefile my_wicd.pp

Pour activer le module nouvellement généré, exécutez :

# semodule -i my_wicd.pp

Message d'erreur relatif aux règles :En essayant d'accéder à mon site Web, je trouve des erreurs SELinux dans les journaux.

L'un des pièges courants dans le dépannage des messages d'erreur SELinux consiste à créer des politiques en fonction de tous les messages d'erreur trouvés. Dans la plupart des cas, si le setroubleshoot package est installé, la même alerte nous donnera toutes les options de contournement possibles, du meilleur au moins.

Pour revoir le setroubleshoot alertes générées aujourd'hui, exécutez :

# journalctl -t setroubleshoot --since today
Dec 08 13:08:33 lab.example.com setroubleshoot[12013]: failed to retrieve rpm info for /var/www/html/index.html
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages run: sealert -l 011df984-4eb6-4079-98ab-cba173c4342e
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html.
                                                               
 *****  Plugin restorecon (99.5 confidence) suggests   ************************
                                                               
 If you want to fix the label
 /var/www/html/index.html default label should be httpd_sys_content_t.
 Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory, in which case try to change the following command accordingly.
 Do
 # /sbin/restorecon -v /var/www/html/index.html
                                                               
 *****  Plugin catchall (1.49 confidence) suggests   **************************
                                                               
 If you believe that httpd should be allowed getattr access on the index.html 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 'httpd' --raw | audit2allow -M my-httpd
 # semodule -X 300 -i my-httpd.pp

Dans ce cas, la meilleure solution possible consiste simplement à corriger le libellé du fichier.

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

Récapitulez

SELinux peut être difficile à dépanner, mais en appliquant les concepts notés ici et en comprenant les composants du service, vous pouvez gérer tous les défis qu'il vous lance.

N'oubliez pas :


Linux
  1. Comment lire et corriger les messages de refus SELinux

  2. Dépannage des tâches Cron

  3. Couper / Grep Et Df -h ?

  4. Grep et queue -f ?

  5. Cloud Backup—Dépannage de base sur Windows Server 2012, 2016 et 2019

Une collection d'utilitaires pour simplifier le dépannage du réseau Linux et le réglage des performances

17 meilleures commandes de mise en réseau et de dépannage Linux pour les débutants

Comprendre l'étiquetage des fichiers SELinux et le contexte SELinux

Glusterfs - Trucs et astuces de dépannage avancés

Dépannage des erreurs de passerelle et des délais d'attente :502, 504

Débogage d'iptables et des pièges courants du pare-feu ?