Skip to content
Snippets Groups Projects
Unverified Commit f449d17d authored by Roma's avatar Roma Committed by Rémy Huet
Browse files

Finalisation de pica-mail-mta

parent d5d72ba7
No related branches found
No related tags found
1 merge request!20pica-mailnt
......@@ -8,7 +8,7 @@ ENV DEBIAN_FRONTEND noninteractive
#installation des paquets debian
RUN apt-get update -y \
&& apt-get install -y \
postfix postfix-ldap libsasl2-modules postfix sasl2-bin opendkim opendkim-tools \
postfix postfix-ldap libsasl2-modules sasl2-bin opendkim opendkim-tools rsyslog \
&& rm -rf /var/lib/apt/lists/*
......@@ -20,15 +20,32 @@ ENV MY_HOSTNAME pica01-test.test.picasoft.net
#noms de domaines de courriers qu'on s'autorise à transmettre, séparés par des virgules (example.com, example2.com, example3.com)
ENV RELAY_DOMAINS picasoft.net
#serveur LDAP
ENV LDAP_SERVER ldap.test.picasoft.net
#postfix: search_base pour l'existence d'adresses @picasoft.net
ENV LDAP_POSTFIX_SEARCH_BASE dc=picasoft,dc=net
#serveur MDA/LDA sous la forme d'un serveur LMTP : donner l'adresse et le port du conteneur avec pica-mail-mda
#SASL et binds (LDAP)
#serveur LDAP utilisé pour l'authentification LDAP
#attention, des informations sensibles (hashs de mots de passe) seront envoyées, il faut que le canal soit sécurisé (utiliser LDAPS au lieu de LDAP, ou encore STARTTLS sur LDAP)
#protocole : on pourrait utiliser LDAPS au lieu de LDAP
ENV LDAP_PROTOCOL ldap
ENV LDAP_SERVER_HOSTNAME ldap.test.picasoft.net
ENV LDAP_PORT 389
#compte utilisé par les démons saslauthd et virtual_mailbox pour lire l'arborescence LDAP
ENV LDAP_BIND_DN cn=nss,dc=picasoft,dc=net
ENV LDAP_BIND_PW rdonly
#niveau de l'arborescence à partir de laquelle les entrées sont considérées
ENV LDAP_SEARCH_BASE dc=picasoft,dc=net
#filtre sur les entrées demandées par saslauthd. %u sera substitué par le login entré par l'utilisateur
ENV LDAP_SASL_FILTER cn=%u
#filtre sur les entrées demandées par virtual_mailbox. %s sera substitué par la partie gauche de l'adresse mail.
ENV LDAP_VIRTUAL_MAILBOX_FILTER uid=%s
#Local Delivery (LMTP)
#adresse et port du LDA (dans notre cas, c'est le MDA Dovecot, embarqué dans un conteneur, et accessible à travers un docker network)
ENV LMTP_LAN_HOSTNAME pica-mail-mda.local-mail-delivery
ENV LMTP_PORT 24
#blacklist, peut être vide
ENV SMTPD_CLIENT_RESTRICTIONS reject_rbl_client sbl.spamhaus.org, reject_rbl_client dnsbl.sorbs.net
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
......@@ -2,45 +2,100 @@
#edition de /etc/postfix/main.cf via un utilitaire fourni par postfix
#identité
#nom de domaine des courriers dont on est à l'origine (pour s'en réserver l'exclusivité)
postconf -e "mydomain = ${MY_DOMAIN}"
postconf -e "myorigin = ${MY_DOMAIN}"
#nom d'\hôte de la machine qui va faire tourner le MTA
postconf -e "myhostname=${MY_HOSTNAME}"
#boîtes mail
#cette configuration permet à Postfix permet de savoir quelles adresses en @picasoft.net existent
#configuration du local delivery agent, ici c'est le MDA Dovecot, on communique avec le protocole LMTP sur TCP/IP (inet dans le jargon Postfix)
postconf -e "virtual_transport = lmtp:inet:${LMTP_LAN_HOSTNAME}:${LMTP_PORT}"
#noms de domaines des boîtes gérées par ce serveur de fin de chaîne
postconf -e "virtual_mailbox_domains = ${MY_DOMAIN}, localhost.${MY_DOMAIN}, localhost"
#préfixe pour éviter que des mails buggués atterissent n'importe où dans le système de fichiers (c'est une sécurité mais c'est pas ça qui fait que ça marche)
postconf -e "virtual_mailbox_maps = "
#en dessous de ce degré de "vérité", les boîtes non trouvées en table sont rejetées. (100 correspond à un "vrai" simple, mais il est possible de définir différents degrés d'appartenance à la table des utilisateurs dans des configurations plus complexes: une boîte pourrait par exemple avoir le bon nom de domaine mais pas le bon nom d'utilisateur)
postconf -e "virtual_mailbox_maps = ldap:/etc/postfix/ldap-virtual-mailbox-maps"
#en dessous de ce degré de "vérité", les boîtes non trouvées en table sont rejetées. (100 correspond à un "vrai" simple, mais il est possible de définir différents degrés d'appartenance à la table des utilisateurs dans des configurations plus complexes: une boîte pourrait par exemple avoir le bon nom de domaine mais pas le bon nom d'utilisateur, mais ne pas être rejetée;)
postconf -e "virtual_minimum_uid = 100"
#on fait confiance à l'hôte local, utile pour faire du debug
postconf -e "mynetworks = 127.0.0.0/8"
#restrictions sur les destinataires
#les personnes authentifiées peuvent envoyer des mails à tout le monde, les personnes non authentifiées peuvent envoyer des mails seulement aux destinations connues donc des destinataires en @picasoft.net
#on rejette si le destinataire n'a pas de MX ni de A et n'est pas nous-même
#l'ordre permit_sasl_authenticated, reject_unauth_destination est important: si on est authentifié on fait ce qu'on veut, si on n'est pas authentifié on ne peut qu'envoyer aux destinations connues
postconf -e "smtpd_recipient_restrictions = reject_unknown_recipient_domain, permit_sasl_authenticated, reject_unauth_destination"
#configuration antispam
#on interdit les domaines locaux comme monpc, et les courriels qui ne précisent pas tous les domaines (que l'expéditeur ou que le destinataire par exemple)
#spamhaus est une entreprise à but non lucratif qui fournit des RBL (liste de spammeurs notoires)
#restrictions pour la commande smtp RCPT TO
postconf -e "smtpd_recipient_restrictions = reject_invalid_hostname, reject_unknown_recipient_domain, reject_unauth_destination, reject_rbl_client sbl.spamhaus.org, permit"
#restrictions pour la commande smtp HELO
#restrictions permettant de tester le client dès le helo
#on rejette les clients qui n'ont pas été capables de donner notre nom de domaine lors du helo
#on interdit de faire du helo avec un domaine non fully qualified, sinon c'est trop facile de tenter localhost., mail., pica01. etc.
#on interdit les domaines qui n'ont pas de A ou de MX
postconf -e "smtpd_helo_restrictions = reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname"
#d'autres RBL pour les requêtes de connexion au client
postconf -e "smtpd_client_restrictions = reject_rbl_client dnsbl.sorbs.net"
#configuration du socket TCP/IP
#la résolution DNS ipv6 ne marche pas dans le docker network, et de toute façon y'aura que deux machines... rien de grave
#blacklists basées sur l'adresse du client
postconf -e "smtpd_client_restrictions = ${SMTPD_CLIENT_RESTRICTIONS}"
#Saslauthd
#utiliser le démon saslauthd. Il est contacté par des appels de fonction à une lib et retourne la validité des login.
postconf -e "smtpd_sasl_path = smtpd"
cat <<EOF >> /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
EOF
#fichiers de config et socket utilisés par le démon de saslauthd créé pour postfix (voir fichier copié dans le Dockerfile)
dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
adduser postfix sasl
service saslauthd restart
#le SASL se fait entre le client SMTP et le conteneur MTA, donc on indique notre nom d'hôte
postconf -e 'smtpd_sasl_local_domain = $myhostname'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'smtpd_sasl_security_options = noanonymous'
#autorise l'auth depuis des clients connus comme obsolètes/non standard (outlook) mais ne présentant pas de faille de sécurité
postconf -e 'broken_sasl_auth_clients = yes'
#indique que la source des utilisateurs SASL est un serveur LDAP
cat <<EOF >> /etc/default/saslauthd-postfix
MECHANISMS="ldap"
MECH_OPTIONS=""
EOF
#configuration de ce serveur LDAP
cat <<EOF >> /etc/saslauthd.conf
ldap_servers: ${LDAP_PROTOCOL}://${LDAP_SERVER_HOSTNAME}:${LDAP_PORT}
ldap_bind_dn: ${LDAP_BIND_DN}
ldap_bind_pw: ${LDAP_BIND_PW}
ldap_search_base: ${LDAP_SEARCH_BASE}
ldap_filter: ${LDAP_SASL_FILTER}
EOF
#prise en compte de la config SASL
service saslauthd restart
#configuration du socket TCP/IP, on est obligé d'utiliser ipv4 pour la local delivery car les docker network ne supportent pas iPv6 par défaut
postconf -e "inet_protocols = ipv4"
#il est nécessaire de stopper le démon pour changer les sockets
#enregistrement de cette instruction
postfix reload
postfix stop
#il est nécessaire de stopper le démon pour effectivement modifier les sockets TCP/IP (par défaut iPv6)
service postfix stop
#au cas où le démon postfix aurait été lancé indépendamment de systemd
postfix stop
#configuration du local delivery agent sous la forme du serveur lmtp de dovecot connecté par socket ip (inet)
postconf -e "virtual_transport = lmtp:inet:${LMTP_LAN_HOSTNAME}:${LMTP_PORT}:private/dovecot-lmtp"
#on est certain que le prochain démarrage se fera avec logs (normalement on rattrape le retard des derniers démarrages sans logs car rsyslog était déjà installé et configuré pour en récupérer, mais il ne les a pas encore écrits)
service rsyslog start
service postfix start
#démarrage premier plan
if [ "$1" != true ]; then
#if [ "$1" != true ]; then
# service postfix stop
# tail -F /var/log/mail.log
#fi
if [ "$1" == true ]; then
service postfix stop
tail -F /var/log/mail.log
echo "Il n'est plus possible d'utiliser les conteneurs de test avec cette version de pica-mail-mta, on a déporté toute la config dans pica-mail-mta" 1>&2
exit 2
fi
#on met en commentaire ces paramètres parce qu'ils seront écrits lors de l'entrypoint
#hôte, port et protocole (on pourrait utiliser ldaps)
# server_host = ldap://ldap.test.picasoft.net:389
#niveau de l'arborescence LDAP à partir duquel on commencer à chercher dans les entrées
# search_base = dc=picasoft,dc=net
#filtre permettant d'accepter certaines entrées: ici, le paramètre en entrée est %s
#uid correspond au champ LDAP utilisé, on aurait pu aussi utiliser cn, ou n'importe quel autre champ, c'est arbitraire.
# query_filter = uid=%s
#ce qui sera retourné par la requête. Comme le but est seulement de vérifier si l'adresse existe, il faut juste que ce champ soit non vide.
# result_attribute = uid
#le bind au serveur (un utilisateur spécial utilisé pour se connecter au LDAP et lire son arborescence (à l'exception des hashs de password))
# bind = yes
# bind_dn = cn=nss,dc=picasoft,dc=net
# bind_pw = rdonly
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment