Set-OPS-Public/roles/serveur_postgresql/defaults/main.yml
Daniel Allaire f3bb9caee3 chiffrement : metriques et journaux du site en TLS, et la frontiere certifiee par sa propre autorite
Metriques et journaux (CHANGELOG 142). Le site pose les quatre interrupteurs TLS
que chaque locataire pose dans ses group_vars : node_exporter et Loki servaient
en HTTP sur les neuf VM, le certificat etait la, inutilise. test_parite_tls_site.py
compare desormais le site aux locataires. Les hyperviseurs poussent leurs
journaux en HTTPS verifie, avec la racine du site comme simple fichier.
L'exportateur PostgreSQL sert en HTTPS partout, sur l'interrupteur de PostgreSQL
lui-meme, que Prometheus lit pour choisir son schema.

La frontiere (CHANGELOG 143). Une autorite subordonnee signee par la racine du
site, bornee (pathlen 0, noms sous le domaine et adresses du site, contrainte
critique), cle nee sur la boite (scripts/frontiere_pki.py). Syslog vers Loki en
TLS mutuel (seule la frontiere peut ecrire), exportateur en HTTPS, interface web
sur le certificat de services ; les clients d'API verifient la frontiere contre
la racine du site. La lecture du magasin passe par config.xml : l'API de
recherche renvoie les cles privees.

Deploye et mesure au site, chez les deux locataires et sur la frontiere ; 95 preuves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 14:25:28 -04:00

104 lines
5.4 KiB
YAML

---
serveur_postgresql_packages:
- postgresql
- postgresql-contrib
- python3-psycopg2 # requis par community.postgresql sur la cible
serveur_postgresql_service_name: "postgresql"
# Version majeure du cluster. Vide => detection automatique du cluster installe
# par Debian (repertoire sous /etc/postgresql/<version>/main).
serveur_postgresql_version: ""
# Reseau et acces.
serveur_postgresql_port: 5432
serveur_postgresql_ecoute:
- "127.0.0.1"
- "{{ ansible_host | default(ansible_default_ipv4.address, true) }}"
serveur_postgresql_reseaux_autorises:
- "10.0.0.0/16"
serveur_postgresql_methode_auth: "scram-sha-256"
# Reglages additionnels (vide => valeurs par defaut de Debian).
# Exemple : { shared_buffers: "256MB", work_mem: "16MB" }
serveur_postgresql_parametres: {}
# Nom du groupe serveur (pour filtrer le registre des bases applicatives).
# Le registre lui-meme (bases_donnees) est charge depuis instance/plan/bases-donnees.yml.
serveur_postgresql_groupe: "serveur_postgresql"
# Provisioning applicatif explicite. Vide par defaut : aucune base ni compte cree.
# Les mots de passe doivent venir d'Ansible Vault, jamais en clair.
serveur_postgresql_comptes: []
# - nom: keycloak
# mot_de_passe: "{{ vault_postgresql_keycloak }}"
# attributs: "LOGIN"
serveur_postgresql_bases: []
# - nom: keycloak
# proprietaire: keycloak
# --- TLS via le certificat d'hote step_ca (client_pki requis sur le noeud) ---
# Cote serveur : PostgreSQL sert le cert step_ca (verifiable contre root_ca), au lieu
# du snakeoil auto-signe. Non-bloquant : le TLS reste optionnel tant que pg_hba ne le force pas.
serveur_postgresql_tls_actif: false
serveur_postgresql_tls_source_cert: "/etc/step/certs/{{ ansible_fqdn | default(ansible_hostname) }}.crt"
serveur_postgresql_tls_source_cle: "/etc/step/certs/{{ ansible_fqdn | default(ansible_hostname) }}.key"
serveur_postgresql_tls_source_ca: "/etc/step/certs/root_ca.crt"
serveur_postgresql_tls_dir: "/var/lib/postgresql/tls"
# Verrou zero-confiance : hostssl dans pg_hba => refuse toute connexion NON-TLS.
# N'activer qu'apres avoir confirme que TOUS les clients sont en TLS (sinon coupure).
serveur_postgresql_tls_force: false
# --- Sonde de supervision -----------------------------------------------------------
serveur_postgresql_sonde_pct_avert: 70
serveur_postgresql_sonde_pct_crit: 90
# --- L'EXPORTATEUR DE METRIQUES -------------------------------------------------------
#
# Le pendant de la sonde : elle dit « est-ce casse ? », il dit « depuis quand, et vers
# ou ? ». Voir `meta/metriques.yml`, qui declare ce que le moteur en derive.
#
# UN COMPTE DEDIE, EN LECTURE SEULE, ET RIEN D'AUTRE. `pg_monitor` est un role fourni par
# PostgreSQL depuis la version 10 : il donne acces aux vues de statistiques et A ELLES
# SEULES — aucune donnee applicative. Faire tourner un exportateur en `postgres` serait
# donner les cles de la base pour lire des compteurs.
#
# LE MOT DE PASSE VIENT DE LA VOUTE, comme tous les autres. Vide, l'exportateur n'est pas
# pose du tout — degrader, jamais deviner, et surtout jamais un mot de passe par defaut.
serveur_postgresql_exportateur_actif: "{{ (vault_pg_exportateur | default('')) | length > 0 }}"
serveur_postgresql_exportateur_paquet: prometheus-postgres-exporter
serveur_postgresql_exportateur_service: prometheus-postgres-exporter
serveur_postgresql_exportateur_port: 9187
serveur_postgresql_exportateur_utilisateur: setops_metriques
serveur_postgresql_exportateur_mot_de_passe: "{{ vault_pg_exportateur | default('') }}"
# L'EXPORTATEUR SERT EN TLS QUAND LA BASE LE FAIT (2026-10-12). Meme interrupteur que
# PostgreSQL, pas un second : la machine a alors son certificat (client_pki), et Prometheus
# lit ce meme interrupteur (`meta/metriques.yml`, `tls_si`) pour choisir son schema. Deux
# interrupteurs pourraient diverger — l'un servirait en TLS, l'autre lirait en clair.
serveur_postgresql_exportateur_tls_dir: "/etc/prometheus-postgres-exporter/tls"
serveur_postgresql_exportateur_web_config: "/etc/prometheus-postgres-exporter/web-config.yml"
# --- RESTAURATION (2026-09-30) — voir tasks/main.yml ---------------------------------
#
# Les bases que CE role ne rejoue pas, designees par leur `consommateur` au registre :
# - nextcloud : il se remet LUI-MEME, en fin de son role. Sa base, ses fichiers et sa
# configuration vont ensemble, et le code de ses applications (user_oidc,
# richdocuments) n'est pas sauvegarde : restauree avant son installation, la base
# les dirait installees sans qu'elles le soient, et `occ app:install` refuserait ;
#
# PLUS `icinga` (2026-10-07). On l'excluait : l'historique de supervision etait lie a
# l'environnement d'Icinga, que l'AC d'Icinga, recreee a chaque reconstruction, renouvelait
# — restauree, la base serait restee orpheline. L'AC est desormais sauvegardee et remise
# (jeu `icinga` de client_backup) : l'environnement survit, et l'historique avec lui.
serveur_postgresql_restauration_consommateurs_exclus:
- nextcloud
serveur_postgresql_bases_restaurables: >-
{{ ((serveur_postgresql_registre | default([]))
| rejectattr('value.consommateur', 'defined') | map(attribute='value.base') | list)
+ ((serveur_postgresql_registre | default([]))
| selectattr('value.consommateur', 'defined')
| rejectattr('value.consommateur', 'in', serveur_postgresql_restauration_consommateurs_exclus)
| map(attribute='value.base') | list)
+ (serveur_postgresql_bases | map(attribute='nom') | list) }}