Set-OPS-Public/roles/serveur_dovecot/tasks/auth_locale.yml
Daniel Allaire 63f5fda091 courriel : les mots de passe de soumission ne quittent plus la machine de Postfix
Postfix (edge-mta) faisait verifier chaque mot de passe de soumission par le
Dovecot du mailstore, sur :12345. Le client SASL Dovecot de Postfix ne chiffre
pas : chaque mot de passe traversait le reseau en clair, et le registre disait
ce flux tls.

Le flux est supprime, pas chiffre. serveur_postfix pose a cote de lui un
Dovecot d'authentification seule (serveur_dovecot/tasks/auth_locale.yml) :
coeur + LDAP, aucun protocole, aucun port, joint par private/auth, qui verifie
sur l'annuaire en LDAPS. Le 12345 disparait des deux roles et du pare-feu ;
serveur_dovecot_sasl_reseau est retire, et une garde arrete l'instance qui le
pose encore.

Deploye chez les deux locataires ; prouve par un envoi reel chez chacun
(sasl_username au journal, remise LMTP, relu par IMAP). test_sasl_local.py
garde le changement ; 95 preuves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 11:26:18 -04:00

77 lines
3.2 KiB
YAML

---
# AUTHENTIFICATION LOCALE POUR POSTFIX (2026-10-12) — voir templates/auth-locale.conf.j2.
#
# Appelee par `serveur_postfix` la ou la soumission existe, APRES que Postfix a demarre :
# le socket vit dans `/var/spool/postfix/private`, que Postfix cree a son premier demarrage.
# Ni IMAP, ni LMTP, ni aucun port : la machine n'entre pas dans le groupe `serveur_dovecot`,
# et aucun de ses flux ne s'ouvre ici.
- name: Authentification locale — resoudre l'annuaire (role partage)
ansible.builtin.include_role:
name: resoudre_annuaire
vars:
# Le compte de Dovecot, comme sur la machine des boites : meme verification, meme droit.
resoudre_annuaire_bind_cn: "dovecot"
resoudre_annuaire_secret: "vault_ldap_bind_dovecot"
- name: Authentification locale — adopter la connexion annuaire
ansible.builtin.set_fact:
serveur_dovecot_ldap_uris: "{{ resoudre_annuaire_uri }}:{{ resoudre_annuaire_port }}"
serveur_dovecot_ldap_base: "{{ resoudre_annuaire_base_dn }}"
serveur_dovecot_ldap_bind_dn: "{{ resoudre_annuaire_bind_dn }}"
serveur_dovecot_ldap_bind_password: "{{ resoudre_annuaire_bind_password }}"
no_log: true
- name: Authentification locale — exiger le mot de passe de liaison (Vault)
ansible.builtin.assert:
that:
- serveur_dovecot_ldap_bind_password | length > 0
fail_msg: "vault_ldap_bind_dovecot requis : l'authentification locale se lie a l'annuaire sous le compte de Dovecot."
# Le coeur et le pilote LDAP, RIEN d'autre : sans `dovecot-imapd` ni `dovecot-lmtpd`, aucun
# protocole n'est declare et Dovecot ne lance aucun service de connexion.
- name: Authentification locale — installer Dovecot (coeur + LDAP)
ansible.builtin.apt:
name: "{{ serveur_dovecot_auth_locale_paquets }}"
state: present
update_cache: true
register: serveur_dovecot_auth_locale_apt
- name: Authentification locale — assurer le repertoire du socket (sous le chroot Postfix)
ansible.builtin.file:
path: "{{ serveur_dovecot_postfix_socket_dir }}"
state: directory
owner: postfix
group: root
mode: "0700"
- name: Authentification locale — deployer la configuration (drop-in Dovecot 2.4)
ansible.builtin.template:
src: auth-locale.conf.j2
dest: /etc/dovecot/conf.d/99-setops.conf
owner: root
group: root
mode: "0640"
no_log: true # contient le mot de passe de liaison LDAP
notify: Redémarrer dovecot
- name: Authentification locale — desactiver l'auth systeme (LDAP est l'unique autorite)
ansible.builtin.replace:
path: /etc/dovecot/conf.d/10-auth.conf
regexp: '^!include auth-system\.conf\.ext'
replace: '#!include auth-system.conf.ext'
notify: Redémarrer dovecot
# En simulation, le paquet qu'on vient d'« installer » n'a pose aucun fichier.
when: not (ansible_check_mode and serveur_dovecot_auth_locale_apt is changed)
- name: Authentification locale — valider la configuration (doveconf)
ansible.builtin.command: doveconf -n
changed_when: false
when: not ansible_check_mode
- name: Authentification locale — activer et demarrer Dovecot
when: not ansible_check_mode
ansible.builtin.systemd:
name: "{{ serveur_dovecot_service }}"
enabled: true
state: started
daemon_reload: true