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.