Set-OPS-Public/roles/serveur_postfix
Daniel Allaire b4e3520561 annuaire : un compte de service par consommateur, et la porte se ferme
Keycloak, Dovecot, Postfix et Icinga Web 2 se liaient TOUS avec cn=admin, le compte
d administration de la base. C est le rootDN : slapd lui fait contourner toutes les
ACL. Un seul secret, quatre services, tous les droits sur l arbre — pour ce qui est,
trois fois sur quatre, une simple lecture.

Et les droits livres par Debian etaient intacts : `to * by * read`. Sur ldap://, sans
s authentifier, une machine du reseau enumerait tous les comptes et toutes les
adresses. Des comptes a droits mesures n auraient rien valu tant que cette ligne
restait : on aurait ferme la porte en laissant la fenetre.

L indice etait deja dans le depot. `validatePasswordPolicy` existe parce que slapd
n applique pas ses controles de qualite au rootDN : la consequence etait compensee,
la cause intacte.

- ou=services, un compte par consommateur, secret propre en voute
- sept regles d acces posees EN ENTIER (state: exact) : l ordre est la regle, et
  inserer c est parier sur ce que le paquet aura mis avant nous
- amorcage_acces garde le compte d administration, NOMME comme l exception : il ne
  consomme pas l annuaire, il le provisionne depuis la socket locale
- la sonde passe de -x a -Y EXTERNAL : elle lisait en anonyme et aurait annonce un
  annuaire VIDE sur un annuaire parfaitement sain
- la rotation du compte d administration devient possible (elle n etait posee qu a
  l installation, par debconf : la voute et slapd divergeaient en silence)

Quatre marches payees en chemin :
1. un cinquieme appelant oublie, dont l echec etait masque par no_log — la garde
   refuse desormais SANS no_log : elle nomme la cle absente, jamais son contenu
2. la federation Keycloak ne reecrivait son bindDn que si l URL ou le mode changeaient
   — nouveau secret, ancien nom, error code 49
3. la rotation placee APRES les taches qui se lient en administrateur
4. ansible-vault et son tube : sortie non bloquante = echec silencieux, la voute
   paraissait tournee et etait identique a l octet

P72 exige que tout role incluant resoudre_annuaire NOMME son compte, et qu aucun sauf
amorcage_acces ne nomme admin. Eprouvee dans les deux sens.

Verifie sur l infrastructure : chaque compte lit ce qu il doit, aucun ne voit les
autres, la lecture anonyme rend 0 entree, et les quatre services repondent (doveadm
user, postmap -q, decouverte OIDC 200, portier SSO 200).

vault_openldap_admin et vault_ldap_bind_postfix renouveles : les deux avaient transite
en clair par une session d exploitation. Les anciennes valeurs rendent Invalid
credentials (49).

make prouver : 71 OK, 0 echec, 1 saute. ansible-lint : 0 failure, profil production.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-13 13:36:38 -04:00
..
defaults sondes : quatorze, une par role, derivees en objets Icinga 2026-09-10 03:00:21 -04:00
handlers Soumission courriel :587 interne (authentifiée) — boucle souveraine bouclée 2026-07-03 23:17:36 -04:00
meta sondes : quatorze, une par role, derivees en objets Icinga 2026-09-10 03:00:21 -04:00
tasks annuaire : un compte de service par consommateur, et la porte se ferme 2026-09-13 13:36:38 -04:00
templates sondes : quatorze, une par role, derivees en objets Icinga 2026-09-10 03:00:21 -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.