Création d’un module SELinux

Ce TD est à réaliser dans une machine virtulle Fedora. Avec les machines vagrant :

$ vagrant up selinux
$ vagrant ssh selinux

Objectifs

  • Ecriture d’un module pour un démon système

Écrire un module pour un démon système

Nous allons désormais écrire un module de politique SELinux pour confiner une nouvelle application sur notre système. Nous allons lancer le script python pyserver (télécharger) :

#!/usr/bin/env python3

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

avec l’unit systemd pyserver.service (télécharger) :

[Unit]
Description=Test Python HTTP server for SELinux lab
After=network.target network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/pyserver

[Install]
WantedBy=multi-user.target

Importez le script python pyserver dans le dossier /usr/local/bin/ et l’unit systemd pyserver.service dans le dossier /etc/systemd/system/.

Restaurez les contextes SELinux par défaut pour ces fichiers :

$ sudo restorecon -Fv /usr/local/bin/pyserver /etc/systemd/system/pyserver.service

Rechargez la configuration de systemd :

$ sudo systemctl daemon-reload

Installez le démon setroubleshoot (à ne pas utiliser en production) pour s’aider à comprendre les erreurs SELinux :

$ sudo dnf install -y setroubleshoot-server

Utilisez sepolgen pour générer un caneva de politique SELinux pour notre démon :

$ mkdir ~/module
$ cd ~/module
$ sepolgen --init /usr/local/bin/pyserver # erreurs non importantes

Regardez le contenu du module généré :

$ cat pyserver.te
$ cat pyserver.fc
$ cat pyserver.if

Désactivez les règles dontaudit pour obtenir tous les logs d’erreur :

$ sudo semodule -DB

Compilez le module SELinux :

$ make -f /usr/share/selinux/devel/Makefile pyserver.pp

Si vous obtenez des erreurs, il faudra les résoudres avant de progresser.

Chargez ensuite le module avec la politique dans le noyau :

$ sudo semodule -i pyserver.pp

Mettez en place le nouveau contexte SELinux pour l’executable pyserver :

$ sudo restorecon -Fv /usr/local/bin/pyserver /etc/systemd/system/pyserver.service

Démarrez ou redémarez le démon avec systemd :

$ sudo systemctl restart pyserver

Vérifiez que le serveur s’execute sous le bon contexte :

$ sudo systemctl status pyserver
$ sudo ps auxZ | grep pyserver
system_u:system_r:pyserver_t:s0 root      ...  python3 /usr/local/bin/pyserver

Créez du contenu pour votre serveur web :

$ echo "test" | sudo tee /var/www/html/index.html
$ sudo restorecon -Fv /var/www/html/index.html

Testez le serveur :

$ curl http://localhost:8000/
$ curl http://localhost:8000/var/www/html/

Regardez les erreurs dans les logs d’audit :

$ sudo tail -fn 10 /var/log/audit/audit.log
$ sudo journalctl -e _TRANSPORT=audit

Mettez à jour votre module SELinux pyserver.te à l’aide du résultat de la commande audit2allow :

$ sudo cat /var/log/audit/audit.log | audit2allow

Répétez les étapes précédentes jusqu’à ce que la politique soit complète.

Une fois les premières règles ajoutées, regardez les options de la commande audit2allow, notament -l.

Important: Une fois la politique terminée, il ne faut pas oublier de supprimer la directive rendant le domaine permissif pour rendre effective la protection avec SELinux.

Une fois le mode permissif désactivé, vérifiez à nouveau que votre service fonctionne corectement.

Références