feat(proxy): réception rsyslog générique pour les services exposés #20

Closed
opened 2026-07-30 15:44:22 +00:00 by Damien · 0 comments
Owner

Objectif

Ajouter à proxy/install.sh un 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 Traefik

Même logique que la configuration dynamique de Traefik : un socle générique, puis un fichier par service.

/etc/rsyslog.d/10-remote-receiver.conf   # listener générique — cette issue
/etc/rsyslog.d/50-<service>.conf         # routage par tag — une issue par service
/etc/logrotate.d/remote-logs             # rotation des logs reçus

Ajouter un nouveau service exposé revient à déposer un 50-<service>.conf. Rien d'autre à toucher.

Listener

Module imtcp, port 5514 par défaut (surchargeable via RSYSLOG_PORT).

Adresse de bind exposée en variable d'environnement :

RSYSLOG_BIND_ADDR="${RSYSLOG_BIND_ADDR:-0.0.0.0}"

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/tcp uniquement).

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 up ait abouti avant la configuration de rsyslog, ce qui complique le flux du script (le cas TS_AUTHKEY absent 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

  • Écriture inconditionnelle des fichiers de conf : le rejeu réapplique la version courante.
  • apt install rsyslog : no-op si déjà présent.
  • Créer /var/log/remote/ avec des permissions permettant à fail2ban de lire.
  • Ne pas faire de --force reset ni 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.
  • Restart de rsyslog en fin de bloc.

Rotation

/etc/logrotate.d/remote-logs, en copytruncate — 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.

daily
rotate 7
compress
missingok
notifempty
copytruncate

Documentation

Ajouter une section au proxy/README.md décrivant le pattern 50-<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.sh
  • proxy/README.md

Critères d'acceptation

  • ss -tlnp | grep 5514 montre rsyslog en écoute
  • Un message envoyé en TCP depuis un autre nœud du tailnet arrive dans /var/log/remote/
  • Le même message envoyé depuis l'extérieur du tailnet est bloqué par UFW
  • RSYSLOG_BIND_ADDR=100.x.x.x produit bien un bind restreint
  • Rejeu du script : aucune erreur, aucune duplication de conf, aucune règle UFW dupliquée
  • logrotate -d /etc/logrotate.d/remote-logs sans erreur
  • Aucune occurrence de « gitea » dans les fichiers produits par cette issue

Dépendances

Aucune. Peut avancer en parallèle de #18 et #19. Bloque #21.

## Objectif Ajouter à `proxy/install.sh` un 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 Traefik Même logique que la configuration dynamique de Traefik : un socle générique, puis un fichier par service. ``` /etc/rsyslog.d/10-remote-receiver.conf # listener générique — cette issue /etc/rsyslog.d/50-<service>.conf # routage par tag — une issue par service /etc/logrotate.d/remote-logs # rotation des logs reçus ``` Ajouter un nouveau service exposé revient à déposer un `50-<service>.conf`. Rien d'autre à toucher. ## Listener Module `imtcp`, port `5514` par défaut (surchargeable via `RSYSLOG_PORT`). Adresse de bind exposée en variable d'environnement : ```bash RSYSLOG_BIND_ADDR="${RSYSLOG_BIND_ADDR:-0.0.0.0}" ``` 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/tcp` uniquement). **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 up` ait abouti avant la configuration de rsyslog, ce qui complique le flux du script (le cas `TS_AUTHKEY` absent 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 - Écriture inconditionnelle des fichiers de conf : le rejeu réapplique la version courante. - `apt install rsyslog` : no-op si déjà présent. - Créer `/var/log/remote/` avec des permissions permettant à fail2ban de lire. - Ne **pas** faire de `--force reset` ni 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. - Restart de rsyslog en fin de bloc. ## Rotation `/etc/logrotate.d/remote-logs`, en `copytruncate` — 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. ``` daily rotate 7 compress missingok notifempty copytruncate ``` ## Documentation Ajouter une section au `proxy/README.md` décrivant le pattern `50-<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.sh` - `proxy/README.md` ## Critères d'acceptation - [ ] `ss -tlnp | grep 5514` montre rsyslog en écoute - [ ] Un message envoyé en TCP depuis un autre nœud du tailnet arrive dans `/var/log/remote/` - [ ] Le même message envoyé depuis l'extérieur du tailnet est bloqué par UFW - [ ] `RSYSLOG_BIND_ADDR=100.x.x.x` produit bien un bind restreint - [ ] Rejeu du script : aucune erreur, aucune duplication de conf, aucune règle UFW dupliquée - [ ] `logrotate -d /etc/logrotate.d/remote-logs` sans erreur - [ ] Aucune occurrence de « gitea » dans les fichiers produits par cette issue ## Dépendances Aucune. Peut avancer en parallèle de #18 et #19. **Bloque #21.**
Damien added this to the gitea-lxc-migration milestone 2026-07-30 15:44:22 +00:00
Damien added reference feat/proxy-rsyslog 2026-08-01 08:23:28 +00:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Reference: Damien/infra-scripts#20