Set-OPS-Public/roles/serveur_postfix/templates/main.cf.j2
Daniel Allaire 203f7c5436 courriel du site : chiffre de bout en bout, et le relais verifie qui il joint
La forge exige STARTTLS et verifie le certificat du relais. Le relais du site
exige le TLS en entree, verifie le serveur joint en sortie (autorites
publiques, lues avant le chroot), et journalise chaque session TLS.

Mesure sur un envoi reel : TLS 1.3 sur les deux troncons, remis.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 02:30:50 -04:00

71 lines
3.2 KiB
Django/Jinja

# Géré par Set-OPS (rôle serveur_postfix). Ne pas éditer à la main.
compatibility_level = 3.6
myhostname = {{ serveur_postfix_nom_hote }}
mydomain = {{ serveur_postfix_domaine }}
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
biff = no
append_dot_mydomain = no
readme_directory = no
smtpd_banner = $myhostname ESMTP
mynetworks = {{ serveur_postfix_reseaux_confiance }}
# Aucune remise locale : ce MTA ne fait QUE des boîtes virtuelles (via LDAP + LMTP).
mydestination =
local_recipient_maps =
{% if serveur_postfix_mode == 'relais' %}
{# UN RELAIS N'HEBERGE RIEN, IL EXPEDIE.
Pas de domaine virtuel, pas de carte LDAP, pas de remise LMTP : il n'y a aucune
boite ici. Ce qu'il faut, c'est que la supervision puisse SORTIR une alerte, et
qu'elle sorte au nom du SITE — pas d'un locataire. #}
relayhost =
{# `mynetworks` seul decide qui peut faire relayer : la loopback, donc les services de
cette machine, et les machines dont un role declare un flux vers ce relais (la forge ;
au site, `site_inventaire.reseaux_confiance_relais`). Rien d'autre : un relais ouvert
est repere et exploite en heures. #}
smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination
{% else %}
# --- Boîtes virtuelles : validation LDAP + remise LMTP vers le nœud mail-store (Dovecot) ---
virtual_mailbox_domains = {{ serveur_postfix_domaine }}
virtual_mailbox_maps = ldap:/etc/postfix/ldap-mailboxes.cf
virtual_transport = lmtp:inet:[{{ serveur_postfix_mailstore_hote }}]:{{ serveur_postfix_lmtp_port }}
# Résolution via le plancher /etc/hosts (indépendant du DNS) pour la remise interne.
lmtp_host_lookup = native
{% endif %}
{% if serveur_postfix_tls_actif %}
# --- TLS (certificat step_ca) ---
smtpd_tls_cert_file = {{ serveur_postfix_tls_dir }}/cert.pem
smtpd_tls_key_file = {{ serveur_postfix_tls_dir }}/key.pem
smtpd_tls_security_level = {{ serveur_postfix_tls_entrant }}
smtpd_tls_protocols = >=TLSv1.2, !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = >=TLSv1.2
smtpd_tls_loglevel = {{ serveur_postfix_tls_journal }}
smtp_tls_security_level = {{ serveur_postfix_tls_sortant }}
smtp_tls_CAfile = {{ serveur_postfix_tls_ca_publiques }}
smtp_tls_mandatory_protocols = >=TLSv1.2
smtp_tls_loglevel = {{ serveur_postfix_tls_journal }}
{% if serveur_postfix_lmtp_tls_verify | default(false) %}
# Zero-confiance : livraison LMTP vers Dovecot chiffree ET verifiee (cert step-ca).
# `wrappermode` = TLS des la connexion : c'est ce que sait offrir un `inet_listener`
# Dovecot. Sans lui, Postfix tentait STARTTLS sur un port qui ne le propose pas, et
# la poignee de main expirait au bout de 300 s — livraison differee en silence.
lmtp_tls_wrappermode = yes
lmtp_tls_security_level = verify
lmtp_tls_CAfile = {{ serveur_postfix_lmtp_tls_cafile }}
{% endif %}
{% endif %}
{% if serveur_postfix_rspamd_milter %}
# --- Milter rspamd (antispam + signature DKIM), co-localisé sur edge-mta ---
smtpd_milters = inet:localhost:{{ serveur_postfix_rspamd_milter_port }}
non_smtpd_milters = $smtpd_milters
milter_protocol = 6
milter_default_action = accept
{% endif %}
# --- Restrictions de base ---
smtpd_helo_required = yes
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination