# -*- mode: python; coding: utf-8 -*- header("Fichier de configuration principal de postfix.") # +------------------+ # | Variables utiles | # +------------------+ 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") # 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} def add(*values): '''Continue une ligne logique (voif postconf(5))''' out((len(last_definition)+3) * " " + ", ".join([tostring(v) for v in values]) + "\n") # La liste des variables de configuration de postfix import commands exports = [s.split(' ', 2)[0] for s in commands.getoutput("/usr/sbin/postconf -d").split("\n")] # Variables utiles @# Definition par securite (sinon il utilise gethostname) myhostname = pubhostname mydomain = "crans.org" @# Origine des mails myorigin = "crans.org" @# Reseaux locaux mynetworks = ["127.0.0.0/8"] if mx: add(["138.231.136.0/21", "138.231.144.0/21", "138.231.148.0/22", "10.231.136.0/24"]) if not mx: @# Ecoute en local uniquement inet_interfaces = "loopback-only" if mx: @# Destinations acceptees mydestination = [hostname, "$myhostname", "localhost", "localhost.$mydomain"] if main | users: add(["$mydomain", "crans.ens-cachan.fr", "clubs.ens-cachan.fr", "install-party.ens-cachan.fr"]) if manage_ml: add(["lists.$mydomain"]) @# Domaine relaye par ce MX relay_domains = ["$mydestination"] if secondary: add(["$mydomain", "crans.ens-cachan.fr", "clubs.ens-cachan.fr", "install-party.ens-cachan.fr"]) if public and not manage_ml: add(["lists.$mydomain"]) if not mx: @# 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 = False if users: @# On delivre dans des maildir mail_spool_directory = "/var/mail/" @# +--------+ @# | Divers | @# +--------+ @# Delais pour les warnings delay_warning_time = "24h" @# Esthetisme smtpd_banner = "$myhostname ESMTP $mail_name (Debian/GNU)" if mx: @# Reecriture des entetes canonical_maps = db_file("canonical") else: @# Reecriture des entetes: @host.crans.org -> @crans.org canonical_maps = "regexp:/etc/postfix/canonical" if mx: @# 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: add("hash:/var/lib/mailman/data/aliases") alias_maps = "$alias_database" if mx: @# Plus les alias dans la base de donnees add(db_file("aliases")) if mx: @# On prend aussi en compte les utilisateurs de /etc/passwd local_recipient_maps = "$alias_maps unix:passwd.byname" if mx: @# Les anciennes ML @crans.org, @crans.ens-cachan.fr -> @lists.crans.org virtual_alias_maps = "hash:/etc/postfix/virtual" # Pour les non-mx il n'y a plus rien d'interessant if not mx: done() @# +-------------+ @# | TLS et SASL | @# +-------------+ @# TLS pour la reception 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_use_tls = True smtpd_tls_received_header = True @# On utilise aussi TLS pour envoyer les mails smtp_tls_cert_file = "" smtp_tls_key_file = "" smtp_tls_CAfile = "/etc/ssl/certs/cacert.org.pem" smtp_tls_loglevel = 1 smtp_use_tls = True @# 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 = "sdbm:/var/run/smtpd_tls_session_cache" smtp_tls_session_cache_database = "sdbm:/var/run/smtp_tls_session_cache" tls_random_source = "dev:/dev/urandom" tls_daemon_random_source = "dev:/dev/urandom" if main: @# Authentification SASL pour relayer du mail smtpd_sasl_auth_enable = True @# Auth que si tls pour eviter des pass en clair sur le reseau smtpd_tls_auth_only = True @# +--------------------------+ @# | Filtrages et limitations | @# +--------------------------+ if main: @# Filtrage sur les sources de connexions smtpd_client_restrictions = "reject_rbl_client rbl-plus.mail-abuse.org" @## 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" @# rejette les recipients sans nom de domaine totalement qualifie add("reject_non_fqdn_recipient") if main: @# permet si le client est authentifie add("permit_sasl_authenticated") @# rejette les destinations non locales add("reject_unauth_destination") if public: @# accepte si le champ contourneGreylist de la base est a OK add("check_recipient_access " + db_file("sqlgrey")) @# accepte si la greylist est d'accord add("check_policy_service inet:127.0.0.1:2501") @# jette le reste @# Tailles maximales : 4Mo pour les msgs et 75 pour les mbox message_size_limit = 4194304 mailbox_size_limit = 78643000 @# Obligation de specifier le nom de domaine complet append_dot_mydomain = secondary if main: @## Filtrage AV @# Amavis + tuning lmtp content_filter = "lmtp:[amavis.adm.crans.org]:10024" lmtp_data_done_timeout = 1200 lmtp_send_xforward_command = True @# Pieces jointes mime_header_checks = "regexp:/etc/postfix/mime_header_checks" if not secondary: @# +----------------------+ @# | Connexion de secours | @# +----------------------+ @#POUR SECOURS if not has("rescue-mode"): out("#") relayhost = "[titanic.crans.org]:25"