sysctl)
PermitRootLogin no au minimum)Recommandations de l’ANSSI :
Isolation des deux services Python avec systemd
Installer les dépendances :
apt install nginx uwsgi uwsgi-plugin-python3 python3-flask httpie netcat-openbsd
Générer un secret et paramétrer les composants :
openssl rand -out key.bin 16
export KEY_PATH=key.bin
export SOCKET_PATH=crypto.sock
export FLASK_APP=api.py
Lancer les services :
python3 crypto.py & echo $! > crypto.pid
flask run & echo $! > api.pid
Tester les services :
http --json POST :5000/hmac data="Hello World"
/opt/cryptosrv)groupadd(8))useradd(8)) pour chacun des deux scripts, en prenant garde à bien paramétrer les comptes (répertoire des scripts comme home et nologin(8) comme shell)key.bin (paramétrage / configuration) dans un répertoire conforme au FHS et vérifier les permissionscrypto.pyCréer un service systemd pour lancer crypto.py (voir systemd.service(5) et systemd.exec(5))
SOCKET_PATH et KEY_PATH doivent être paramétrées dans l’environnement/runCharger et lancer le service :
systemctl daemon-reload
systemctl start <xyz>.service
Vérifier les permissions sur le répertoire sous /run et la socket
Tester le service :
echo "Hello world" | nc -U /run/.../xyz.sock | xxd
api.pyCréer un service systemd pour lancer api.py avec uWSGI (uwsgi-core(1) et documentation Flask)
SOCKET_PATH doit être paramétrée dans l’environnement/runCharger et lancer le service :
systemctl daemon-reload
systemctl start <xyz>.service
Vérifier les permissions sur le répertoire sous /run et la socket
Configurer Nginx pour communiquer avec la socket uWSGI (voir documentation uWSGI)
location / { try_files $uri @cryptosrv; }
location @cryptosrv {
include uwsgi_params;
uwsgi_pass unix:/run/.../uwsgi.sock;
}
Redémarer Nginx et tester l’application :
systemctl restart nginx.service
http --json POST :/hmac data="Hello World"
Si vous avez obtenu une application opérationnelle, félicitations !
Sinon, pas de panique, voici des fichiers fonctionnels :
En complément, un Makefile avec les cibles suivantes : (nécessite évidemment make)
test-dependancies : installe python3-flask et httpietest : teste l’application (ne nécessite pas les droits root)install-dependancies : installe nginx uwsgi uwsgi-plugin-python3 python3-flask httpie et netcat-openbsdinstall : déploie, configure et teste l’applicationTravail à rendre pour ⅛ de la note finale du module
crypto.py pour journaliserInstaller python3-systemd
Importer les modules Python nécessaires :
import logging
from systemd import journal
Configurer le logger racine (logging.getLogger()) pour le SYSLOG_IDENTIFIER='cryptopy' à partir du niveau logging.INFO
Utiliser logging.info() pour journaliser proprement les messages à la place des print()
Redémarrer le service et vérifier la journalisation :
systemctl restart cryptopy.service
journalctl -eu cryptopy.service
api.py pour journaliserConfigurer de même app.logger pour écrire vers systemd avec le SYSLOG_IDENTIFIER='apipy'
Journaliser la source (request.remote_addr) et le corps des requêtes ainsi que les HMAC correspondants générés
Redémarrer le service et vérifier la journalisation :
systemctl restart apipy.service
journalctl -eu apipy.service
rsyslogVérifier que les journaux de cryptopy et apipy remontent dans /var/log/messages via rsyslog.
Configurer rsyslog avec un fichier /etc/rsyslog.d/20-cryptosrv.conf pour :
omfile) dans le répertoire /var/log/cryptosrv/ les journaux de cryptopy et apipy, avec programname puis la date (les 10 premiers caractères du format date-rfc3339) dans le nom du fichier
omrelp) vers un second serveur
auth et authprivRedémarrer rsyslog :
systemctl restart rsyslog.service
Sur le second serveur :
Configurer rsyslog avec un fichier /etc/rsyslog.d/10-central.conf pour :
imrelp)
omfile) les journaux reçus dans le répertoire /var/log/central/ avec le nom du serveur source et la date dans le nom du fichier.
Redémarrer rsyslog :
systemctl restart rsyslog.service
Générer des journaux et vérifier leur centralisation
Avant le 01/06/2023 00:00:00 UTC+2 (heure de réception faisant foi) par courriel ou dépôt GitHub ou GitLab partagé à @reveliant :
/opt/cryptosrv/crypto.py/opt/cryptosrv/api.pyrsyslog des deux serveurs :
/etc/rsyslog.d/20-cryptosrv.conf/etc/rsyslog.d/10-central.conf/var/log/central/<serveur>-<YYYY-MM-DD>.logauditdRecommandations de l’ANSSI :