crans_bcfg2/Python/etc/postfix/main.cf
2015-09-09 02:51:54 +02:00

335 lines
11 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- mode: python; coding: utf-8 -*-
include("ip")
header("Fichier de configuration principal de postfix.")
mx = has("mail-mx")
# Indique si c'est un MX principal ou secondaire.
main = has("mail-mx-main")
secondary = has("mail-mx-secondary")
# Indique si c'est un MX public, par exemple le serveur
# des adherents est utilise uniquement en interne
public = has("mail-mx-public")
# Si vrai alors delivre localement les mails des adherents.
users = has("users")
# Si vrai alors passe les mails des ml a mailman
manage_ml = has("mailing-list-manager")
# Si vrai, recoit les mails pour le corbeau
corbeau = has("corbeau")
# Si vrai, on est sur le tracker
tracker = has("tracker")
# Si vrai, on est sur discourse
discourse = has("discourse")
docker_network = "172.17.0.0/16"
# Si vrai, on est sur un serveur non-vlan-adherent
nonadherent = has("non-vlan-adherent")
# La base de donnee utilise (pour les mx)
if has("ldap"):
db = "ldap"
elif has("pgsql"):
db = "pgsql"
def db_file(suffix):
'''Nom des fichiers de conf pour la base de donnees'''
return "%(db)s:/etc/postfix/%(db)s-%(suffix)s.cf" % {"db": db, "suffix": suffix}
# Pour les lignes commençant par un %
keysep = " = "
######################################
# Début effectif du fichier #
######################################
# Les différents réseaux
local_networks = ["127.0.0.0/8", '[::1]/128']
adm_networks = ["10.231.136.0/24", '[2a01:240:fe3d:c804::]/64']
client_networks = ["138.231.136.0/21", "138.231.144.0/21", "138.231.148.0/22", "[2a01:240:fe3d:4::]/64", '[2a01:240:fe3d:c04::]/64']
@# +------------------+
@# | Variables utiles |
@# +------------------+
@# Definition par securite (sinon il utilise gethostname)
if nonadherent:
%myhostname admhostname
else:
%myhostname pubhostname
@mydomain = crans.org
@# Origine des mails
@myorigin = crans.org
@# Reseaux locaux
%mynetworks local_networks
if mx and not users:
out(" " + tostring(client_networks + adm_networks))
elif users:
out(" " + tostring(adm_networks))
elif tracker:
out(" " + tostring(adm_networks))
elif discourse:
out(" " + tostring([docker_network, "%s/32" % (admip(),)]))
if not mx and not discourse:
# Discourse a besoin d'écouter sur son iface docker. On mise sur le parefeu d'odlyd pour
# éviter que le serveur ne se fasse poker.
if tracker or corbeau:
@# Ecoute en local et sur adm (récupération des mails @tracker.adm.crans.org
%inet_interfaces ["127.0.0.1", admip()]
else:
@# Ecoute en local uniquement
@inet_interfaces = loopback-only
if mx:
@# Destinations acceptees
%mydestination [hostname, "$myhostname", "localhost", "localhost.$mydomain"]
if main or users:
out(" " + tostring(["$mydomain", "crans.ens-cachan.fr", "clubs.ens-cachan.fr", "install-party.ens-cachan.fr", "crans.fr", "crans.eu"]))
if manage_ml:
out(" " + tostring(["lists.$mydomain"]))
@# Domaine relaye par ce MX
@relay_domains = $mydestination
if secondary:
out(" " + tostring(["$mydomain", "crans.ens-cachan.fr", "clubs.ens-cachan.fr", "install-party.ens-cachan.fr", "crans.fr", "crans.eu"]))
if public and not manage_ml:
out(" " + tostring(["lists.$mydomain"]))
if not mx:
if tracker:
@# On accepte les mails destinés au tracker
@mydestination = tracker.adm.crans.org
if corbeau:
@# On accepte les mails destinés au corbeau
@mydestination = crans.org
@# Les mails sont envoyes au MX principal
@relayhost = smtp.adm.crans.org
@# Etre notifie ou non de l'arrive de nouveaux mails
%biff users
if mx:
@# Pour pouvoir tester sans tout casser, on active les soft bounces.
@# Ca permet aux mails de ne pas etre bounces en cas d'erreur, mais
@# a la place, de renvoyer une erreur non permanente. En production
@# il faut enlever ca.
@soft_bounce = no
if users:
@# On delivre dans des maildir
@mail_spool_directory = /home/mail/
@# +--------+
@# | Divers |
@# +--------+
@# Delais pour les warnings
@delay_warning_time = 24h
@# Esthetisme
@smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
if not mx:
@# Reecriture des entetes: @host.crans.org -> @crans.org
@canonical_maps = regexp:/etc/postfix/canonical
if has("postfix.transport"):
@# Par ou passer (notement pour la distrtibution des adresse
@# locales par le serveur des adherents)
@transport_maps = hash:/etc/postfix/transport
@# Une infinite d'adresses mail par personne
@recipient_delimiter = +
@# +-----------------+
@# | Bases d'adresse |
@# +-----------------+
@# Les fichiers d'alias (pour newaliases)
@alias_database = hash:/etc/postfix/aliases
if manage_ml:
@ hash:/var/lib/mailman/data/aliases
@alias_maps = $alias_database
# Pour les non-mx il n'y a plus rien d'interessant
if mx:
@# Plus les alias dans la base de donnees
out(" " + tostring(db_file("search")))
@# On prend aussi en compte les utilisateurs de /etc/passwd
@local_recipient_maps = $alias_maps unix:passwd.byname
@# Les anciennes ML @crans.org, @crans.ens-cachan.fr -> @lists.crans.org
@virtual_alias_maps = hash:/etc/postfix/virtual
@
@# +-------------+
@# | TLS et SASL |
@# +-------------+
@
@# TLS pour la reception
@smtpd_use_tls=yes
@smtpd_tls_security_level=may
@smtpd_tls_cert_file=/etc/ssl/certs/smtp.pem
@smtpd_tls_key_file=/etc/ssl/private/smtp.pem
@smtpd_tls_CAfile=/etc/ssl/certs/cacert.org.pem
@smtpd_tls_loglevel=0
@smtpd_tls_received_header=yes
@
@# On utilise aussi TLS pour envoyer les mails
@smtp_use_tls=yes
@smtp_tls_security_level=may
@smtp_tls_loglevel=1
@smtp_tls_cert_file=
@smtp_tls_key_file=
@smtp_tls_CAfile=/etc/ssl/certs/cacert.org.pem
@
@
@# On cache les sessions TLS car elles sont couteuses. Il parait que btree est mieux que sdbm,
@# a essayer quand on aura postfix > 2.2
@smtpd_tls_session_cache_database=btree:/var/lib/postfix/smtpd_tls_session_cache
@smtp_tls_session_cache_database=btree:/var/lib/postfix/smtp_tls_session_cache
@
@tls_random_source=dev:/dev/urandom
@
if main:
@# Auth que si tls pour eviter des pass en clair sur le reseau
@smtpd_tls_auth_only=yes
@# Authentification SASL pour relayer du mail
@smtpd_sasl_auth_enable=yes
@
@# +--------------------------+
@# | Filtrages et limitations |
@# +--------------------------+
@
if main:
@# Filtrage sur les sources de connexions
@smtpd_client_restrictions=permit_mynetworks
@
@# Reject the request when the client HELO or EHLO parameter has a bad hostname syntax.
@# reject_unknown_hostname value not recommended, because it may causes mail losting.
@# (for example: after paypal.com registration you don't receive activation mail! I've tried it.)
@#
@smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname
@## Limitation des messages envoyés par minute
@# On n'ignore que les messages venant d'adresses "protégées"
@smtpd_client_event_limit_exceptions = local_networks
if mx:
out(" " + tostring(adm_networks))
@
@# On limite à 10 messages par minute
@smtpd_client_message_rate_limit = 10
@
@## Filtrage au MAIL FROM
@# Rejet si le domaine de l'envoyeur n'est pas dans un DNS
@smtpd_sender_restrictions = reject_unknown_sender_domain
@
@## Filtrage au RCPT TO
@# permet si le client est dans le reseau local
@smtpd_recipient_restrictions = permit_mynetworks
if main:
@# test contre cluebringer pour les quota / rate par utilisateur sasl
@# check_policy_service inet:127.0.0.1:10031
@# rejette les recipients sans nom de domaine totalement qualifie
@ reject_non_fqdn_recipient
if main:
@# permet si le client est authentifie
@ permit_sasl_authenticated
@# rejette les destinations non locales
@ reject_unauth_destination
if public:
@# accepte si le champ contourneGreylist de la base est a OK
@ permit_sasl_authenticated
out(" check_recipient_access " + tostring(db_file("sqlgrey")))
@# accepte si la greylist est d'accord
@ check_policy_service inet:127.0.0.1:2501
@# jette le reste
@
if main:
@#smtpd_end_of_data_restrictions=check_policy_service inet:127.0.0.1:10031
@# Tailles maximales : 20Mo pour les msgs et 75 pour les mbox
@message_size_limit = 20971520
@mailbox_size_limit = 78643000
@# Obligation de specifier le nom de domaine complet
%append_dot_mydomain secondary
if main:
@#Ajout de cyrus pour l'authentification SMTP
@smtpd_sasl_type = cyrus
@# Pieces jointes
@mime_header_checks = regexp:/etc/postfix/mime_header_checks
@# Transport slow
@slow_destination_recipient_limit = 20
@slow_destination_concurrency_limit = 2
if not secondary:
@# +----------------------+
@# | Connexion de secours |
@# +----------------------+
@#POUR SECOURS
if not has("rescue-mode"):
_out("#")
@relayhost = [soyouz.adm.crans.org]:25
if has("titanic"):
# Les mails non locaux passeront pas ovh pour éviter de subir le blacklist
# que l'ip de la freebox souffre de la part de certains mail providers.
# Les mails à destination de crans.org et cie ne passent pas cette règle,
# la table transport étant prioritaire.
@relayhost = [soyouz.adm.crans.org]:25
if main or secondary:
@# PostScreen configuration
@# Access List
@postscreen_access_list = cidr:/etc/postfix/postscreen_access.cidr
@## Tu es blacklisté ? VTFF
@postscreen_blacklist_action = drop
@
@# Bannière d'accueil multi valuée
@postscreen_greet_banner = Bienvenue au crans, veuillez patienter quelques secondes.
@## On droppe.
@postscreen_greet_action = drop
@# RBL, le retour
@postscreen_dnsbl_sites =
@ zen.spamhaus.org*2
@ dnsbl.inps.de*2
@ b.barracudacentral.org*2
@ dnsbl-2.uceprotect.net*2
@ bl.spameatingmonkey.net
@ bl.spamcop.net
@ dnsbl.sorbs.net
@ psbl.surriel.com
@ bl.mailspike.net
@ swl.spamhaus.org*-2
@ list.dnswl.org=127.[0..255].[0..255].0*-1
@ list.dnswl.org=127.[0..255].[0..255].1*-2
@ list.dnswl.org=127.[0..255].[0..255].[2..255]*-3
@
@# Score >= 4 ? Bye bye
@postscreen_dnsbl_threshold = 4
@postscreen_dnsbl_action = enforce
@
@## Désactivé, pour éviter le fake greylisting de postscreen.
@## Décommenter en cas de spam trop important.
@## Filtre utilisé par postfix, mis en amont via postscreen
@#postscreen_non_smtp_command_enable = yes
@#postscreen_non_smtp_command_action = enforce
@#
@#postscreen_bare_newline_enable = yes
@#postscreen_bare_newline_action = enforce
@#
@#postscreen_pipelining_enable = yes
@#postscreen_pipelining_action = enforce