Set-OPS-Public/roles/serveur_postfix
Daniel Allaire 22ef279464 authentification : chaque rôle déclare sa position, gardé par P29
Une règle qu'aucune garde ne vérifie finit par ne plus être vraie — c'est ce qui
était arrivé aux 28 lignes d'intégration recopiées. Chaque rôle serveur_* porte
un meta/authentification.yml, confronté à son code par P29.

web-sso 5, socle-identite 2 (keycloak/openldap : ils SONT la chaîne d'identité),
ldap-direct 2, interne-sans-auth 2, sans-auth-humaine 12.

La preuve refuse l'oubli ET le mensonge. Éprouvée par sabotage sur sept cas :
déclaration supprimée, portée inventée, secours retiré, posture de formulaire
retirée, raison retirée, ldap-direct mensonger, réglage retiré des defaults.

Les deux derniers passaient dans la première version :

- le mensonge passait à cause d'un commentaire. Je cherchais le mot « ldap » dans
  le rôle, et serveur_grafana/defaults/main.yml contient « désactiver quelqu'un
  dans LDAP » : de la prose validait une déclaration fausse. La preuve exige
  maintenant un indice nommé — variable <rôle>_oidc / <rôle>_ldap, ou URI ldap://
- le réglage retiré passait parce que le gabarit citait encore la variable alors
  que plus rien ne lui donnait de valeur. La preuve lit defaults/main.yml en YAML
  et exige que la clé y soit définie, pas mentionnée.

Elle a aussi forcé une valeur : oauth2-proxy était déclaré « formulaire local
fermé » alors qu'il n'a aucun compte local. D'où formulaire_local: aucun, qui
distingue « il n'y en a jamais eu » de « il y en a un, il est fermé ».

Correction d'une note de la veille : Prometheus et Loki ne sont PAS exposés
publiquement (aucun expose au plan). Seuls six groupes le sont. Le risque est
intra-tenant, pas frontalier. Les deux lacunes sont comptées à chaque exécution,
pas masquées.

AFF-111, D-42. 29 preuves OK, ansible-lint (production) sur 375 fichiers.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 17:05:43 -04:00
..
defaults Zéro-confiance : flux Courriel chiffré (LMTP verify + client_smtp STARTTLS) 2026-07-04 21:47:29 -04:00
handlers Soumission courriel :587 interne (authentifiée) — boucle souveraine bouclée 2026-07-03 23:17:36 -04:00
meta authentification : chaque rôle déclare sa position, gardé par P29 2026-08-03 17:05:43 -04:00
tasks Soumission courriel :587 interne (authentifiée) — boucle souveraine bouclée 2026-07-03 23:17:36 -04:00
templates Zéro-confiance : flux Courriel chiffré (LMTP verify + client_smtp STARTTLS) 2026-07-04 21:47:29 -04:00
README.md docs : un README par rôle (12 manquants) + carte remise à l'état du code 2026-07-29 11:32:06 -04:00

serveur_postfix

MTA : Postfix 3.x (Debian 13) sur le nœud edge-mta — réception SMTP :25, cartes LDAP (domaines, boîtes, alias), remise LMTP réseau vers le mailstore (serveur_dovecot). Ne stocke aucune boîte. Cf. docs/courriel-conception.md.

Rôle

  • Préconfigure Postfix par debconf (installation non interactive), installe postfix + postfix-ldap.
  • Chroot : recopie /etc/hosts dans /var/spool/postfix/etc/ — le MTA hérite du plancher de résolution (hosts_statiques), sinon il ne résout aucun nom interne.
  • TLS : pont de certificat step_ca (client_pki) — script setops-postfix-cert-sync
    • unités .service/.path, recharge Postfix à chaque renouvellement.
  • Annuaire : connexion fournie par resoudre_annuaire ; carte ldap-mailboxes.cf (validation des destinataires contre LDAP).
  • Soumission :587 optionnelle, avec SASL délégué à Dovecot (passdb LDAP).
  • Valide la configuration (postfix check) avant d'activer le service.

Liaisons (meta/liens.yml)

Le rôle accepte deux liens déclarés côté application dans plan/applications.yml :

Lien Effet
mailstore Injecte serveur_postfix_mailstore_hote = FQDN de la cible (Dovecot LMTP)
milter Passe serveur_postfix_rspamd_milter à true (rspamd co-localisé)

C'est le sens « app→app », résolu par scripts/instancier.py. Cf. docs/bindings-conception.md.

Variables principales

Variable Défaut Rôle
serveur_postfix_mailstore_hote (vide — obligatoire) Nœud Dovecot, normalement injecté par le lien mailstore
serveur_postfix_lmtp_port 24 LMTP vers le mailstore
serveur_postfix_reseaux_confiance 127.0.0.0/8 [::1]/128 mynetworks (relais autorisé)
serveur_postfix_submission_actif false Soumission :587 (SASL Dovecot)
serveur_postfix_rspamd_milter false Milter antispam/DKIM co-localisé
serveur_postfix_lmtp_tls_verify false Zéro-confiance : vérifier le certificat du mailstore

Flux (meta/flux.yml)

25/tcp entrant (externe + client_smtp) · 587/tcp soumission (flotte) · 24/tcp → Dovecot (TLS vérifié) · 12345/tcp → Dovecot (SASL) · 11332/tcp → rspamd local · 636/tcp → OpenLDAP · 25/tcp sortant (MX distants).

Notes / limites

  • Le rôle exige serveur_postfix_mailstore_hote (assertion) : pas de remise locale, la remise finale appartient au mailstore. C'est la scission edge-mta / mail-store.
  • serveur_postfix_reseaux_confiance est à adapter au réseau de l'instance — laissé au strict minimum par défaut.
  • serveur_postfix_lmtp_tls_verify: true demande que la racine step_ca soit lisible (/etc/step/certs/root_ca.crt, posée en 0644 par client_pki).
  • La frontière publique (MX, SPF/DKIM/DMARC publics, filtrage entrant) relève de l'OPNsense — Étape B, hors flotte Ansible.

Prérequis

  • serveur_postfix requiert serveur_dovecot actif (docs/dependances-groupes.yml).
  • client_pki appliqué sur le nœud.