8.2. Création et application d'une politique SELinux pour une application personnalisée
Cet exemple de procédure fournit les étapes pour confiner un simple démon par SELinux. Remplacez le démon par votre application personnalisée et modifiez la règle de l'exemple en fonction des exigences de cette application et de votre politique de sécurité.
Conditions préalables
-
Le paquetage
policycoreutils-devel
et ses dépendances sont installés sur votre système.
Procédure
Pour cet exemple de procédure, préparez un simple démon qui ouvre le fichier
/var/log/messages
en écriture :Créez un nouveau fichier et ouvrez-le dans l'éditeur de texte de votre choix :
vi mydaemon.c
$ vi mydaemon.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Insérer le code suivant :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Compiler le fichier :
gcc -o mydaemon mydaemon.c
$ gcc -o mydaemon mydaemon.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créez un fichier d'unité
systemd
pour votre démon :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Installer et démarrer le démon :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vérifiez que le nouveau démon n'est pas limité par SELinux :
ps -efZ | grep mydaemon
$ ps -efZ | grep mydaemon system_u:system_r:unconfined_service_t:s0 root 4117 1 0 16:56 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Générer une politique personnalisée pour le démon :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reconstruire la politique du système avec le nouveau module de politique en utilisant le script d'installation créé par la commande précédente :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Notez que le script d'installation renomme la partie correspondante du système de fichiers à l'aide de la commande
restorecon
:restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/system
restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/system
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Redémarrez le démon et vérifiez qu'il fonctionne désormais dans le respect de SELinux :
systemctl restart mydaemon ps -efZ | grep mydaemon
# systemctl restart mydaemon $ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Étant donné que le démon est désormais confiné par SELinux, SELinux l'empêche également d'accéder à
/var/log/messages
. Affichez le message de refus correspondant :ausearch -m AVC -ts recent
# ausearch -m AVC -ts recent ... type=AVC msg=audit(1590247112.719:5935): avc: denied { open } for pid=8150 comm="mydaemon" path="/var/log/messages" dev="dm-0" ino=2430831 scontext=system_u:system_r:mydaemon_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=file permissive=1 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vous pouvez également obtenir des informations supplémentaires en utilisant l'outil
sealert
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Utilisez l'outil
audit2allow
pour suggérer des changements :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Les règles suggérées par
audit2allow
pouvant être incorrectes dans certains cas, n'utilisez qu'une partie de ses résultats pour trouver l'interface de politique correspondante :grep -r "logging_write_generic_logs" /usr/share/selinux/devel/include/ | grep .if
$ grep -r "logging_write_generic_logs" /usr/share/selinux/devel/include/ | grep .if /usr/share/selinux/devel/include/system/logging.if:interface(`logging_write_generic_logs',`
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vérifier la définition de l'interface :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Dans ce cas, vous pouvez utiliser l'interface proposée. Ajoutez la règle correspondante à votre fichier d'application des types :
echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
$ echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vous pouvez également ajouter cette règle au lieu d'utiliser l'interface :
echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.te
$ echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.te
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Réinstaller la politique :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Vérification
Vérifiez que votre application fonctionne dans le cadre de SELinux, par exemple :
ps -efZ | grep mydaemon
$ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vérifiez que votre application personnalisée ne provoque pas de refus SELinux :
ausearch -m AVC -ts recent
# ausearch -m AVC -ts recent <no matches>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow