8.3. Création d'un module local de politique SELinux
L'ajout de modules de politique SELinux spécifiques à une politique SELinux active peut résoudre certains problèmes avec la politique SELinux. Vous pouvez utiliser cette procédure pour corriger un problème connu spécifique décrit dans les notes de mise à jour de Red Hat, ou pour mettre en œuvre une solution Red Hat spécifique.
Utilisez uniquement les règles fournies par Red Hat. Red Hat ne prend pas en charge la création de modules de politiques SELinux avec des règles personnalisées, car cela sort de la portée de la couverture de l'assistance à la production. Si vous n'êtes pas un expert, contactez votre représentant commercial Red Hat et demandez des services de conseil.
Conditions préalables
-
Les paquets
setools-console
etaudit
pour vérification.
Procédure
Ouvrez un nouveau fichier
.cil
avec un éditeur de texte, par exemple :# vim <local_module>.cil
Pour mieux organiser vos modules locaux, utilisez le préfixe
local_
dans les noms des modules de politique SELinux locaux.Insérez les règles personnalisées à partir d'un problème connu ou d'une solution Red Hat.
ImportantN'écrivez pas vos propres règles. Utilisez uniquement les règles fournies dans un problème connu spécifique ou une solution Red Hat.
Par exemple, pour mettre en œuvre la solution SELinux denies cups-lpd read access to cups.sock in RHEL, insérez la règle suivante :
NoteL'exemple de solution a été corrigé de manière permanente pour RHEL dans RHBA-2021:4420. Par conséquent, les parties de cette procédure spécifiques à cette solution n'ont aucun effet sur les systèmes RHEL 8 et 9 mis à jour, et ne sont incluses qu'à titre d'exemples de syntaxe.
(allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))
Notez que vous pouvez utiliser l'une ou l'autre des deux syntaxes de règles SELinux, Common Intermediate Language (CIL) et m4. Par exemple,
(allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))
en CIL est équivalent à ce qui suit en m4 :module local_cupslpd-read-cupssock 1.0; require { type cupsd_var_run_t; type cupsd_lpd_t; class sock_file read; } #============= cupsd_lpd_t ============== allow cupsd_lpd_t cupsd_var_run_t:sock_file read;
- Enregistrez et fermez le fichier.
Installer le module de politique :
# semodule -i <local_module>.cil
NotePour supprimer un module de politique locale créé à l'aide de
semodule -i
, il convient de se référer au nom du module sans le suffixe.cil
. Pour supprimer un module de politique locale, utilisezsemodule -r <local_module>
.Redémarrer tous les services liés aux règles :
# systemctl restart <service-name>
Vérification
Liste des modules locaux installés dans votre politique SELinux :
# semodule -lfull | grep "local_" 400 local_module cil
NoteLes modules locaux ayant la priorité
400
, vous pouvez également les filtrer de la liste en utilisant cette valeur, par exemple en utilisant la commandesemodule -lfull | grep -v ^100
.Recherchez les règles d'autorisation pertinentes dans la politique SELinux :
# sesearch -A --source=<SOURCENAME> --target=<TARGETNAME> --class=<CLASSNAME> --perm=<P1>,<P2>
Où
<SOURCENAME>
est le type SELinux source,<TARGETNAME>
est le type SELinux cible,<CLASSNAME>
est le nom de la classe de sécurité ou de la classe d'objets, et<P1>
et<P2>
sont les autorisations spécifiques de la règle.Par exemple, pour la solution RHEL, SELinux refuse à cups-lpd l'accès en lecture à cups.sock :
# sesearch -A --source=cupsd_lpd_t --target=cupsd_var_run_t --class=sock_file --perm=read allow cupsd_lpd_t cupsd_var_run_t:sock_file { append getattr open read write };
La dernière ligne doit maintenant inclure l'opération
read
.Vérifiez que le service concerné fonctionne dans le cadre de SELinux :
Identifier le processus lié au service concerné :
$ systemctl status <service-name>
Vérifiez le contexte SELinux du processus répertorié dans la sortie de la commande précédente :
$ ps -efZ | grep <process-name>
Vérifier que le service ne provoque pas de déni SELinux :
# ausearch -m AVC -ts recent <no matches>
Ressources supplémentaires