[décision] Fermer l'accès distant à PostgreSQL et passer par un tunnel SSH #65
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
2 participants
Notifications
Total time spent: 1 hour
Due date
olivier
1 hour
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision#65
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
PostgreSQL écoute sur
10.105.200.41:5433en plus de la boucle locale,pg_hba.confacceptehost all all 0.0.0.0/0, etufwouvre 5433 à tout le monde. Vérifié depuis un poste tiers le 1er et le 2 septembre : la connexion aboutit. Seul un mot de passe sépare les quatre autres groupes de la salle deenervision_prod.L'ouverture est délibérée, le #26 portait le critère « remote access par role », et le besoin derrière est légitime : se connecter à la base depuis son poste avec un client graphique. Mais elle contredit l'ENF-14, qui dit que ce qui ne doit pas sortir écoute sur
127.0.0.1, et le document ajoute que tant que le cloisonnement repose sur l'adresse d'écoute, cette règle est la seule frontière de sécurité que nous ayons.Options envisagées
ufwetpg_hba.confn'autorisent que les postes connus de l'équipe.Sur quoi on tranche
Ce qui reste exposé aux quatre autres groupes, ce qu'il faut maintenir quand une adresse change, et le confort réel une fois la configuration faite.
L'option 2 réduit beaucoup l'exposition sans la supprimer :
172.26.44.0/24est le réseau des postes de l'école, partagé au delà du groupe. Elle demande de tenir une liste d'adresses à jour à chaque bail DHCP.Décision retenue
Option 1, le tunnel SSH. Elle ne dépend d'aucune liste à maintenir, elle tient l'ENF-14 telle qu'elle est écrite sans révision à justifier, et le confort perdu est nul une fois le client configuré.
Alternative écartée, et pourquoi
L'ouverture restreinte par adresse, écartée parce qu'elle laisse le port joignable depuis un réseau partagé avec d'autres groupes et qu'elle impose un entretien manuel pour un gain de confort qui n'existe qu'à la première connexion.
Critères d'acceptation
listen_addresses = 'localhost'danspostgresql.conf, service redémarré0.0.0.0/0et::/0retirées depg_hba.confufwne laisse plus passer 543310.105.200.41:5433ne répond plusenervision_prodfonctionnedocs/runbooks/postgresql.mdComment on le vérifie
Fiche ADR produite
docs/adr/0002-acces-a-la-base-par-tunnel.mdLa décision retenue ici est appliquée. Elle l'a été à l'occasion du passage de PostgreSQL sur Docker (#80, demande de fusion #81) : le service a d'abord été ouvert à
10.105.200.0/24— l'option 2 de ce ticket — puis repassé en écoute locale une fois ce ticket relu. Je n'avais pas vu qu'il était déjà tranché, et c'est la leçon que j'en retiens : lire les tickets de décision avant de toucher au réseau, pas après.Ce qui est en place
listen_addresses = 'localhost', service redémarrélisten_addresses = '127.0.0.1'dansconf/postgresql.conf, conteneur recréé0.0.0.0/0depg_hba.confretiréespeersur le socket,rejecten TCP pourpostgres, et une ligne par paire (base, rôle) sur127.0.0.1/32et::1/128. Rien d'autreufwsur 5433 retiréeL'écoute réelle, relevée sur le serveur :
La fermeture est éprouvée, pas seulement écrite
Depuis un poste hors de la machine (
172.26.44.15), en interrogeant le décideurpg_hbapar le protocole PostgreSQL lui-même — aucun mot de passe envoyé, on ne teste que la décision d'accès :Le premier et le dernier essai sont ceux qui prouvent quelque chose : la fermeture tient, et elle ne dépend pas de ce qu'on lit dans
ufw status.Deux choses utiles pour la suite
Le tunnel ne demande aucun entretien côté serveur, et c'est mieux que prévu. Une connexion tunnelée débouche sur
127.0.0.1: elle correspond aux lignes déjà présentes danspg_hba.conf. Il n'a donc pas fallu élargir le fichier pour accueillir le tunnel, et un nouveau poste ne demandera aucune modification — ce qui confirme l'argument « aucune liste à maintenir » de ce ticket, y compris côtépg_hba.confet pas seulement côtéufw.La manœuvre est au §2 de
docs/runbooks/postgresql.md, avec le geste en ligne de commande et le réglage de l'onglet SSH pour DBeaver, pgAdmin et DataGrip.Un avertissement qui dépasse ce ticket. En essayant l'option 2, j'ai constaté qu'un port publié par Docker échappe entièrement à UFW sur cette machine : dans la chaîne
FORWARD,DOCKER-USERest consultée en position 1 et les chaînes d'UFW seulement en position 3, etDOCKER-USERest vide. Une règleufw allow from <réseau>sur un service en réseau bridge n'a donc aucun effet, tout en affichant le bon masque. Le port 5433 était bien joignable depuis un poste tiers alors qu'ufw statusannonçait10.105.200.0/24.Autrement dit : si l'option 2 avait été retenue, elle aurait été plus permissive que ce qu'elle prétendait, et personne ne l'aurait vu en lisant
ufw status. C'est un argument de plus pour l'option 1, et surtout un point à trancher avant MinIO, MLflow et la supervision — soit rester en réseau hôte comme la forge et la base, soit poser des règles dansDOCKER-USER. C'est suivi comme écart n°14 dansdocs/POSTGRESQL.md.Ce ticket peut être fermé à la fusion de #81. Ses trois critères sont servis, et la référence
Closesest portée par #80 pour ne pas fermer celui-ci avant relecture.Vérifié ce soir depuis l'extérieur (VPN + SSH) : l'accès distant est fermé, la migration de PostgreSQL en conteneur (travail d'Olivier) l'a réglé structurellement.
Preuves :
conf/postgresql.conf:listen_addresses = '127.0.0.1',port = 5433— la base n'écoute que la boucle locale ;ss -lnt→LISTEN 127.0.0.1:5433uniquement ;10.105.200.41:5433→ fermé (5432 : rien du tout) ;pg_hba.conf: superutilisateur rejeté sur le réseau, rôles applicatifs en scram-sha-256 sur loopback seulement.Accès depuis un poste :
ssh -L 5433:127.0.0.1:5433 <compte>@10.105.200.41puispsql -h localhost -p 5433 -U <rôle> <base>.La décision et sa justification sont tracées dans l'ADR 0003 (MR #97). Je ferme.