feat(proxy): réception rsyslog générique pour les services exposés #20
Notifications
Due Date
No due date set.
Blocks
#21 feat(proxy): jail fail2ban gitea + rate-limit et fermeture de /metrics
Damien/infra-scripts
Reference: Damien/infra-scripts#20
Reference in New Issue
Block a user
Objectif
Ajouter à
proxy/install.shun récepteur syslog générique, destiné à centraliser les logs des services exposés sur Internet afin que fail2ban puisse agir là où le bannissement a un effet — c'est-à-dire au bord, sur le proxy.Cette issue ne mentionne aucun service en particulier. Elle pose l'infrastructure ; le routage propre à Gitea est traité en #21.
Pourquoi le proxy et pas le service
Un jail fail2ban tournant dans le LXC d'un service applique ses règles sur des paquets dont l'IP source est celle du proxy sur le tailnet. Un ban local bannirait donc le proxy et couperait le service. La détection doit avoir lieu là où est le signal (le log applicatif), le bannissement là où arrivent les connexions publiques (le proxy).
D'où la nécessité de faire remonter les logs applicatifs jusqu'ici.
Architecture — calquée sur le
conf.d/de TraefikMême logique que la configuration dynamique de Traefik : un socle générique, puis un fichier par service.
Ajouter un nouveau service exposé revient à déposer un
50-<service>.conf. Rien d'autre à toucher.Listener
Module
imtcp, port5514par défaut (surchargeable viaRSYSLOG_PORT).Adresse de bind exposée en variable d'environnement :
Défaut
0.0.0.0, protégé par la politique UFW existante :default deny incoming+allow in on tailscale0, et le port 5514 n'est pas dans les règles publiques (80/tcp,443/tcpuniquement).Tradeoff documenté — le bind sur l'IP tailnet a été envisagé et écarté. L'argument retenu : le pare-feu couvre l'exposition publique, et un bind sur l'IP tailnet impose que
tailscale upait abouti avant la configuration de rsyslog, ce qui complique le flux du script (le casTS_AUTHKEYabsent est toléré aujourd'hui).Le risque résiduel n'est pas l'exposition publique mais l'injection de logs : quiconque atteint le listener peut écrire des lignes qui matchent un failregex et faire bannir des IP arbitraires par fail2ban. La variable d'environnement permet de basculer sur un bind restreint sans toucher au code si ce risque devient concret.
Contraintes d'idempotence
apt install rsyslog: no-op si déjà présent./var/log/remote/avec des permissions permettant à fail2ban de lire.--force resetni toucher aux règles UFW existantes ; si une règle doit être ajoutée, la conditionner à un marqueur comme le fait déjà le bloc UFW du script.Rotation
/etc/logrotate.d/remote-logs, encopytruncate— cohérent avec les autres confs logrotate du dépôt, et surtout nécessaire pour que fail2ban ne perde pas son descripteur de fichier à la rotation.Documentation
Ajouter une section au
proxy/README.mddécrivant le pattern50-<service>.conf: format attendu, convention de nommage des tags, emplacement des logs reçus. C'est ce qui permettra d'ajouter un service sans relire le script.Fichiers touchés
proxy/install.shproxy/README.mdCritères d'acceptation
ss -tlnp | grep 5514montre rsyslog en écoute/var/log/remote/RSYSLOG_BIND_ADDR=100.x.x.xproduit bien un bind restreintlogrotate -d /etc/logrotate.d/remote-logssans erreurDépendances
Aucune. Peut avancer en parallèle de #18 et #19. Bloque #21.