Skip to content
Snippets Groups Projects
Commit 3765a9a6 authored by Quentin Duchemin's avatar Quentin Duchemin
Browse files

[Mail] Merge MTA and MDA, add doc, build via Compose and secrets

parents
No related branches found
No related tags found
No related merge requests found
Showing
with 791 additions and 0 deletions
COMPOSE_PROJECT_NAME=pica
## Serveur mail de Picasoft
Ce dossier contient les ressources pour lancer le serveur mail de Picasoft.
Toutes les images sont personnalisées selon nos besoins et construites à la main.
Cette documentation se limite à Docker. Pour plus d'informations sur le serveur mail en général, voir [la documentation sur le Wiki](https://wiki.picasoft.net/doku.php?id=technique:mail:start).
### Construction des images
Deux images sont nécessaires pour le serveur mail : le MTA et le MDA.
Les deux Dockerfile sont présents dans les dossier [pica-mail-mda](./pica-mail-mda) et [pica-mail-mta](./pica-mail-mta).
Pour plus de facilité, Docker Compose sait construire ces images simultanément : il suffit de lancer
```bash
docker-compose build
```
Puis de les pousser sur le registre de production :
```bash
docker-compose push
```
### Configuration
La configuration se fait essentiellement via les variables d'environnement de [Compose](./docker-compose.yml).
Deux dossiers supplémentaires doivent exister :
* `/DATA/docker/mail/opendkim`, dont le contenu sera peuplé [comme indiqué dans la documentation](https://wiki.picasoft.net/doku.php?id=technique:mail:dkim).
* `/DATA/docker/mail/ssl`, qui doit contenir les certificats SSL du serveur mail. Pour le moment, ils sont extraits de Traefik avec [ces commandes](../deprecated/pica-mail-copy-certs/update-certs-pica-mail.sh), mais dans le futur ils devront être gérés par [TLS Certs Monitor](../pica-tls-certs-monitor).
### Lancement
Copier `mail.secrets.example` dans `mail.secrets` et remplacer les valeurs. Le mot de passe LDAP du compte `mail` est sur le [pass](https://gitlab.utc.fr/picasoft/interne/pass).
Lancer :
```bash
docker-compose up -d
```
### Mise à jour
Il suffit de mettre à jour les Dockerfile. Il sera alors de bon ton de créer un fichier `CHANGELOG.md` pour expliquer les changements et d'ajouter un tag aux images pour faire la différence.
En cas de modification de la configuration, pas besoin de changer le tag.
version: "3.7"
#attention, docker-compose préfixe le nom du réseau créé par le nom du projet (contenu dans le .env, sinon c'est le nom du dossier)
networks:
mail:
volumes:
mail-mda-maildir:
name: mail-mda-maildir
mail-mta-log:
name: mail-mta-log
services:
mail-mda:
image: registry.picasoft.net/pica-mail-mda
build:
dockerfile: ./pica-mail-mda/Dockerfile
container_name: pica-mail-mda
ports:
- "143:143"
- "993:993"
networks:
- mail
hostname: pica-mail-mda
volumes:
- mail-mda-maildir:/home
- /DATA/docker/mail/ssl/:/certs-ssl/:ro
environment:
LDAP_ADDRESS: ldap.picasoft.net
LDAP_NSS_CN: cn=mail,ou=Services,dc=picasoft,dc=net
LDAP_BASE: dc=picasoft,dc=net
USER_FILTER: (uid=%n)
PASSWORD_FILTER: (uid=%n)
env_file: ./secrets/mail.secrets
mail-mta:
image: registry.picasoft.net/pica-mail-mta
build:
dockerfile: ./pica-mail-mta/Dockerfile
container_name: pica-mail-mta
ports:
- "25:25"
- "465:465"
- "587:587"
networks:
- mail
volumes:
- mail-mta-log:/var/log
#doit contenir selecteur.domaine.rsa
- /DATA/docker/mail/opendkim/:/etc/dkimkeys/
- /DATA/docker/mail/ssl/:/certs-ssl/
env_file: ./secrets/mail.secrets
environment:
#adresse et port du serveur LMTP i.e. le MTA
LMTP_LAN_HOSTNAME: pica-mail-mda.pica_mail
LMTP_PORT: 24
#nom d'hôte sous lequel Postfix répondra aux requêtes SMTP
MY_HOSTNAME: mail.picasoft.net
#domaine des mails
MY_DOMAIN: picasoft.net
#domaines mails qu'on s'autorise à relayer (qui ont le droit de passer à travers notre serveur si ils sont en expéditeur ou destinataire)
RELAY_DOMAINS: picasoft.net
#réglage de la connexion au serveur LDAP: protocole (ldap ou ldaps), hôte et port
LDAP_PROTOCOL: ldap
LDAP_SERVER_HOSTNAME: ldap.picasoft.net
LDAP_PORT: 389
#réglage du bind : login d'un compte qui a suffisamment de droits pour lire l'arborescence (à l'exception des mots de passe)
LDAP_BIND_DN: cn=mail,ou=Services,dc=picasoft,dc=net
#réglage de la manière dont on répertorie les comptes et les adresses existantes
#la config actuelle fait que la possession d'une adresse mail se fait ainsi : login => login@picasoft.net
#cependant, nous avons quand même deux couches différentes: l'existence d'un compte (SASL) et l'existence d'une adresse
#ce qui fait qu'on peut créer une adresse valide sans nécessairement lui associer un compte valide
#ainsi, on pourra recevoir des mails dans la boîte, mais on ne pourra pas se connecter en tant que cet utilisateur
#pour ce faire, il suffit d'utiliser des attributs LDAP différents
#nous utilisons donc le cn pour l'existence d'un compte LDAP, et l'uid pour l'existence d'une adresse
#niveau de l'arborescence à partir duquel les entrées sont trouvées:
LDAP_SEARCH_BASE: dc=picasoft,dc=net
#filtre permettant de répertorier les comptes SASL
LDAP_SASL_FILTER: "cn=%u"
#filtre permettant de répertorier les adresses mail
LDAP_VIRTUAL_MAILBOX_FILTER: "uid=%s"
#ajout de listes noires pour éviter le SPAM. La décision politique et l'éthique associée sortent du cadre de la conception de cette image et doivent être discutées par l'asso; en tout cas, si on lève cette restriction, elle doit être remplacée par une autre (un spamassassin par exemple).
SMTPD_CLIENT_RESTRICTIONS: reject_rbl_client sbl.spamhaus.org, reject_rbl_client dnsbl.sorbs.net
#prefixe DKIM, utilise pour identifier la clef
DKIM_SELECTOR: janv2019
labels:
- "traefik.frontend.rule=Host:mail.picasoft.net"
- "traefik.port=80"
- "traefik.enable=true"
- "traefik.docker.network=pica_mail"
#Dockerfile pour le MDA de Picasoft
From debian:stretch
#lors de l'installation de dovecot, par défaut, il y a des "fenêtres dans la console", ceci les désactive et utilise des réponses par défaut
ENV DEBIAN_FRONTEND noninteractive
#installation des paquets debian
RUN apt-get update -y \
&& apt-get install -y \
dovecot-common dovecot-imapd dovecot-lmtpd dovecot-ldap \
&& rm -rf /var/lib/apt/lists/* \
&& addgroup --gid 1000 vmail \
&& adduser --system --disabled-login --no-create-home --ingroup vmail --uid 500 vmail
### Définition des variables d'environnement.
# LDAP
ENV LDAP_ADDRESS ldap.test.picasoft.net
ENV LDAP_BASE dc=picasoft,dc=net
ENV LDAP_NSS_CN cn=mail,ou=Services,dc=picasoft,dc=net
ENV LDAP_DNPASS readonly
ENV USER_FILTER (uid=%n)
ENV PASSWORD_FILTER (uid=%n)
# SSL
# L'antislash "\" est nécessaire devant le slash "/" !
ENV SSL_CERT "\/certs-ssl\/cert"
ENV SSL_KEY "\/certs-ssl\/key"
COPY fichiers_de_configuration.sh /
COPY entrypoint.sh /
CMD ["/entrypoint.sh"]
# Pour construire l'image :
```
docker build -t pica-mail-mda:2 .
```
# Pour lancer le conteneur :
```
docker run -d --name pica-mail-mda --network pica_mail --hostname pica-mail-mda --mount source=mail-mda-maildir,target=/home/ --mount source=/DATA/docker/mail/ssl/,target=/certs-ssl/:ro -p 993:993 pica-mail-mda:2
```
#!/bin/bash
/fichiers_de_configuration.sh
dovecot -F
#!/bin/bash
######################################################################################
### Script de modification des paramètres des fichiers de configuration de Dovecot ###
######################################################################################
### Notes
# La configuration de Dovecot étant éclatée dans plus d'une dizaine de fichiers, ce script
# est censé être une alternative à la copie de tous ces fichiers pré-édité dans le conteneur.
# Fichier par fichier, il vient éditer des paramètres spécifiques de Dovecot.
# La commande massivement utilisée dans ce script est sed. L'utilisation qui en
# est faite est principalement celle-ci :
# sed -i (édite le fichier) 's/regex identifiant la ligne à remplacer/ligne de substitution/' /chemin/du/fichier
### Modification de /etc/dovecot/dovecot-ldap.conf.ext
# Définition de l'adresse du LDAP
sed -i 's/^#hosts =.*/hosts = '"${LDAP_ADDRESS}"'/' /etc/dovecot/dovecot-ldap.conf.ext
# Définition du distinguished name pour accéder au LDAP
sed -i 's/^#dn =.*/dn = '"${LDAP_NSS_CN}"'/' /etc/dovecot/dovecot-ldap.conf.ext
# Définition du mot de passe pour accéder au LDAP
sed -i 's/^#dnpass =.*/dnpass = '"${LDAP_DNPASS}"'/' /etc/dovecot/dovecot-ldap.conf.ext
# Autoriser les binds LDAP
sed -i 's/^#auth_bind = no/auth_bind = yes/' /etc/dovecot/dovecot-ldap.conf.ext
# Définition de la version du LDAP
sed -i 's/^#ldap_version = .*/ldap_version = 3/' /etc/dovecot/dovecot-ldap.conf.ext
# Définition de la base à partir de laquelle commencer les recherches
sed -i 's/^base =.*/base = '"${LDAP_BASE}"'/' /etc/dovecot/dovecot-ldap.conf.ext
# Autoriser la recherche dans les branches sous-jacentes de cette base
sed -i 's/^#scope = subtree.*/scope = subtree/' /etc/dovecot/dovecot-ldap.conf.ext
# Réaliser la correspondance entre l'UID (côté LDAP) et partie nom d'utilisateur de
# l'adresse mail (côté client).
sed -i 's/^#user_filter = .*/user_filter = '"${USER_FILTER}"'/' /etc/dovecot/dovecot-ldap.conf.ext
sed -i '130s/^.*/pass_attrs = uid=user,userPassword=password,uid=userdb_user/' /etc/dovecot/dovecot-ldap.conf.ext
sed -i 's/^#pass_filter = .*/pass_filter = '"${PASSWORD_FILTER}"'/' /etc/dovecot/dovecot-ldap.conf.ext
# On ne récupère aucun attribut car le nom du répertoire des mails correspond à la
# partie nom d'utilisateur de l'adresse mail. On n'a donc besoin d'aucun attribut.
echo "user_attrs =" >> /etc/dovecot/dovecot-ldap.conf.ext
#sed -i 's/^# = .*//' /etc/dovecot/dovecot-ldap.conf.ext
### Modification de /etc/dovecot/conf.d/auth-ldap.conf.ext
sed -i '15s/^#userdb {.*/userdb {/' /etc/dovecot/conf.d/auth-ldap.conf.ext
sed -i '16s/.*/ driver = prefetch/' /etc/dovecot/conf.d/auth-ldap.conf.ext
sed -i '17s/.*/}/' /etc/dovecot/conf.d/auth-ldap.conf.ext
#sed
### Modification de /etc/dovecot/conf.d/10-auth.conf
# Le mécanisme d'authentification ne se fait pas par le système mais par un LDAP (inclusion du fichier de config)
sed -i 's/^!include auth-system\.conf\.ext.*/#!include auth-system.conf.ext/' /etc/dovecot/conf.d/10-auth.conf
sed -i 's/^#!include auth-ldap\.conf\.ext.*/!include auth-ldap.conf.ext/' /etc/dovecot/conf.d/10-auth.conf
# Permet l'authentification en clair même si SSL/TLS n'est pas utilisé. À décommenter UNIQUEMENT pour des tests
# car les mots de passe sont transmis en clair sur le réseau !!
##sed -i 's/^#disable_plaintext_auth = yes.*/disable_plaintext_auth = no/' /etc/dovecot/conf.d/10-auth.conf
#sed -i 's/^# = .*//' /etc/dovecot/conf.d/10-auth.conf
### modification de /etc/dovecot/conf.d/10-logging.conf
# Redirection des logs vers stdout
sed -i 's/^#log_path = .*/log_path = \/dev\/stdout/' /etc/dovecot/conf.d/10-logging.conf
#sed -i 's/^# = .*//' /etc/dovecot/conf.d/10-logging.conf
### Modification de /etc/dovecot/conf.d/10-mail.conf
# Définition du format de stockage des mails (Maildir), du chemin pour l'emplacement
# de stockage des mails (/home/vmail/username/Maildir/) et du chemin pour l'emplacement
# de stockage des fichiers spécifiques à l'utilisateur. /!\ Il n'y aucun rapport avec
# le home directory d'UNIX! Voir https://wiki.dovecot.org/VirtualUsers/Home.
sed -i 's/^mail_location = .*/mail_location = maildir:\/home\/vmail\/%n\/Maildir\
mail_home = \/home\/vmail\/%n/' /etc/dovecot/conf.d/10-mail.conf
# Définition d'un UID et d'un GID générique pour tous les utilisateurs.
# Spécifique au fonctionnement d'utilisateur virtuel.
sed -i 's/^#mail_uid =.*/mail_uid = vmail/' /etc/dovecot/conf.d/10-mail.conf
sed -i 's/^#mail_gid =.*/mail_gid = vmail/' /etc/dovecot/conf.d/10-mail.conf
#sed -i 's/^# = .*//' /etc/dovecot/conf.d/10-mail.conf
mkdir /home/vmail
chmod +w /home/vmail
chown vmail /home/vmail
### Modification de /etc/dovecot/conf.d/10-master.conf
# Suppression de la connexion LMTP (communication avec Postfix) par socket UNIX
sed -i 's/^ unix_listener lmtp {.*/# unix_listener lmtp {/' /etc/dovecot/conf.d/10-master.conf
sed -i 's/^ #mode = .*/# #mode = 0666/' /etc/dovecot/conf.d/10-master.conf
sed -i '51s/^ }.*/ #}/' /etc/dovecot/conf.d/10-master.conf
# Définition de la connexion LMTP par paquets IP
sed -i 's/^ #inet_listener lmtp {.*/ inet_listener lmtp {/' /etc/dovecot/conf.d/10-master.conf
sed -i '56s/^ #address =.*/ address = 0.0.0.0/' /etc/dovecot/conf.d/10-master.conf
sed -i '57s/^ #port =.*/ port = 24/' /etc/dovecot/conf.d/10-master.conf
sed -i '58s/^ #}.*/ }/' /etc/dovecot/conf.d/10-master.conf
# Spécification des protocoles utilisés
echo "protocols = imap lmtp" >> /etc/dovecot/conf.d/10-master.conf
#sed -i 's/^# = .*//' /etc/dovecot/conf.d/10-master.conf
### Modification de /etc/dovecot/conf.d/10-ssl.conf
sed -i 's/^ssl = no.*/ssl = yes/' /etc/dovecot/conf.d/10-ssl.conf
sed -i 's/^#ssl_cert = .*/ssl_cert = <'"${SSL_CERT}"'/' /etc/dovecot/conf.d/10-ssl.conf
sed -i 's/^#ssl_key = .*/ssl_key = <'"${SSL_KEY}"'/' /etc/dovecot/conf.d/10-ssl.conf
#sed -i 's/^# = .*//' /etc/dovecot/conf.d/10-ssl.conf
#Dockerfile pour le MTA et MSA de Picasoft
#actuellement basé sur postfix
From debian:stretch
#lors de l'installation de postfix, par défaut, il y a des "fenêtres dans la console", ceci les désactive et utilise des réponses par défaut
ENV DEBIAN_FRONTEND noninteractive
#installation des paquets debian
RUN apt-get update -y \
&& apt-get install -y \
postfix postfix-ldap libsasl2-modules sasl2-bin opendkim opendkim-tools rsyslog opendmarc \
&& rm -rf /var/lib/apt/lists/*
#configuration de postfix
#nom de domaine des courriers dont on est à l'origine (pour s'en réserver l'exclusivité)
ENV MY_DOMAIN picasoft.net
#nom d'\hôte de la machine qui va faire tourner le MTA
ENV MY_HOSTNAME pica01-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
#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=readonly,dc=picasoft,dc=net
ENV LDAP_BIND_PW readonly
#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-ldap.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
#configuration de OpenDKIM
COPY spam/opendkim.conf /etc/
COPY spam/opendmarc.conf /etc/
COPY spam/dkimkeys/* /etc/dkimkeys/
COPY spam/opendkim /etc/default/opendkim
COPY spam/opendmarc /etc/default/opendmarc
RUN mkdir /etc/opendmarc
COPY --chown=opendmarc:opendmarc spam/ignore.hosts /etc/opendmarc/ignore.hosts
COPY saslauthd-postfix /etc/default/
COPY opendkim-tables.sh /
COPY config.sh /
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
# Conteneur MTA (Postfix)
## Pour build:
```
docker build -t pica-mail-mta .
```
Pour run, utiliser le docker-compose en se plaçant dans son répertoire (pour que le .env soit pris en compte) :
```
cd ../docker-compose
docker-compose -f mail.yml up
```
#!/bin/bash
#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"
#map: donne la liste des adresses existantes
cat <<EOF >> /etc/postfix/ldap-virtual-mailbox-maps
server_host = ${LDAP_PROTOCOL}://${LDAP_SERVER_HOSTNAME}:${LDAP_PORT}
search_base = ${LDAP_SEARCH_BASE}
query_filter = ${LDAP_VIRTUAL_MAILBOX_FILTER}
bind = yes
bind_dn = ${LDAP_BIND_DN}
bind_pw = ${LDAP_BIND_PW}
result_attribute = uid
EOF
postconf -e "virtual_mailbox_maps = ldap:/etc/postfix/ldap-virtual-mailbox-maps"
postconf -e "smtpd_sender_login_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"
postconf -e 'smtpd_recipient_restrictions = reject_unknown_recipient_domain, permit_sasl_authenticated, reject_unauth_destination'
#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"
postconf -e "smtpd_helo_required = yes"
#blacklists basées sur l'adresse du client
postconf -e "smtpd_client_restrictions = ${SMTPD_CLIENT_RESTRICTIONS}"
#on interdit aux gens d'utiliser une adresse qui leur appartient pas
postconf -e "smtpd_sender_restrictions = reject_unauthenticated_sender_login_mismatch reject_authenticated_sender_login_mismatch"
#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
#activation du sasl
postconf -e 'smtpd_sasl_local_domain = '
postconf -e 'smtpd_sasl_auth_enable = yes'
#autorise l'auth sasl seulement sur un canal tls
postconf -e 'smtpd_tls_auth_only = yes'
#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
#on enlève le démon saslauthd par défaut de debian (nous utilisons saslauthd-postfix)
#ça ne change rien à part qu'il n'y a pas de warning dans les logs concernant un service non utilisé
rm /etc/default/saslauthd
#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
service postfix restart
cat <<EOF >> /etc/opendmarc.conf
#ajout de mon nom d'hôte
TrustedAuthservIDs ${MY_HOSTNAME}
AuthservID ${MY_HOSTNAME}
#si le mail vient de quelqu'un (de chez picasoft) qui s'est connecté avec un client SMTP (un humain ou mattermost) alors son mail n'aura pas de headers spf/dkim, ce qui fait qu'il est invalide au vu de notre propre politique dmarc. On trust donc tous les gens qui se sont connectés en sasl et on les force à pass le dmarc.
IgnoreAuthenticatedClients true
EOF
#configuration DKIM
#ecriture des tables indiquant quoi signer avec quelle clef
/opendkim-tables.sh
postconf -e "milter_default_action = accept"
postconf -e "milter_protocol = 6"
postconf -e "smtpd_milters = local:/opendkim/opendkim.sock, local:/opendmarc/opendmarc.sock"
postconf -e "non_smtpd_milters = local:/opendkim/opendkim.sock, local:/opendmarc/opendmarc.sock"
#création des répertoires où transiteront les sockets + gestion des permissions
mkdir /var/spool/postfix/opendkim
mkdir /var/spool/postfix/opendmarc
#mkdir /etc/opendmarc
chown -R opendmarc:opendmarc /etc/opendmarc
chown -R opendkim:opendkim /etc/opendkim.conf /etc/dkimkeys
chown opendmarc:opendmarc /etc/opendmarc.conf
chown opendkim:postfix /var/spool/postfix/opendkim
chown opendmarc:postfix /var/spool/postfix/opendmarc
adduser postfix opendkim
adduser postfix opendmarc
#SSL : récupération des certificats (qui seront utilisés pour la connexion smtp)
postconf -e 'smtpd_tls_cert_file = /certs-ssl/cert'
postconf -e 'smtpd_tls_key_file = /certs-ssl/key'
postconf -e 'smtpd_tls_security_level = may'
#autorise le SSL pour des mails sortant mais n'interdit pas le clair lorsque ce n'est pas disponible
postconf -e "smtp_tls_security_level=may"
#logs
#on redirige les logs des fichiers vers le stdout
rm /var/log/mail.log
rm /var/log/opendmarc.log
ln -s /dev/stdout /var/log/mail.log
ln -s /dev/stdout /var/log/opendmarc.log
#activation du service smtps (sur le port 465 par défaut)
cat <<EOF >> /etc/postfix/master.cf
smtps inet n - y - - smtpd
submission inet n - y - - smtpd
EOF
#workaround pour un problème de permission
touch /var/log/opendmarc.log
chown opendmarc:opendmarc /var/log/opendmarc.log
#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"
#enregistrement de cette instruction
postfix reload
#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
#!/bin/bash
/config.sh
service rsyslog start
service opendmarc start
service opendkim start
/usr/lib/postfix/sbin/master -c /etc/postfix -d 2>&1
From pica-mail-mta
#installation des paquets debian
RUN apt-get update -y \
&& apt-get install -y \
nano telnet rsyslog dnsutils \
&& rm -rf /var/lib/apt/lists/*
#serveur MDA/LDA sous la forme d'un serveur LMTP : donner l'adresse et le port du conteneur avec pica-mail-mda
ENV LMTP_LAN_HOSTNAME pica-mail-mda-auth_plaintext.local-mail-delivery
ENV LMTP_PORT 24
ENV LDAP_SERVER_HOSTNAME ldap.test.picasoft.net
ENV LDAP_PORT 389
COPY local_users /
COPY saslauthd-postfix /etc/default/
COPY entrypoint2.sh /
ENTRYPOINT ["/entrypoint2.sh"]
Cette image Docker a pour but de tester pica-mail-mta en se passant du LDAP.
Elle prend pica-mail-mta et rajoute :
* des adresses mails reconnues localement (inscrites dans la recipient table) : mail1@picasoft.net, mail2@picasoft.net
* des comptes d'utilisateur autorisés à utiliser ces adresses mail: mail1 et mail2 de mots de passe respectifs mail1pwd et mail2pwd autorisés à envoyer des mails respectivement en tant que mail1@picsoft.net et mail2@picasoft.net
Cette image docker est actuellement en développement. Pour le moment, nous sommes en train de travailler sur le premier point et pas sur le second, c'est-à-dire que n'importe qui peut se connecter au serveur et envoyer des mails en tant qu'une adresse de son choix, mais le destinataire doit être une adresse connue.
Le le réseau 127.0.0.1 a le droit de se connecter à la machine, mais pas besoin de mot de passe. On peut donc la tester en faisant
```
docker exec -it conteneur /bin/bash
apt update
apt install telnet
telnet localhost 25
helo pica01-test.test.picasoft.net
MAIL FROM:<mail1@picasoft.net>
RCPT TO:<mail2@picasoft.net>
DATA
Subject: bonjour
bla bla bla
.
```
Voilà!
#!/bin/bash
/entrypoint.sh true
postfix stop
#génération du .db à partir du fichier texte
postmap /local_users
#ajout du .db en tant que source
postconf -e "virtual_mailbox_maps = hash:/local_users"
#on modifie temporairement les restrictions pour permettre à tout le monde d'envoyer du mail par notre serveur tant que la destination est autorisée (par les autres règles) et que celui qui tente de se servir du serveur est sur un réseau autorisé (typiquement l'hôte et le subnet)
postconf -e "mynetworks = 127.0.0.0/8"
#voir en dessous pour la config sasl
postconf -e "smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination"
postconf -e "smtpd_client_restrictions = "
#désactivation des restrictions sur le helo
postconf -e "smtpd_helo_restrictions = "
#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
#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
#on utilise les comptes unix de l'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 sécurisés mais utilisant des syntaxes obsolètes/non standard (=outlook)
postconf -e 'broken_sasl_auth_clients = yes'
useradd toto
useradd bobo
echo "toto:toutou"|chpasswd
echo "bobo:boubou"|chpasswd
postfix start
postfix reload
postfix stop
service rsyslog start
service postfix stop
service postfix start
tail -F /var/log/mail.log
mail1 mail1
mail2 mail2
#attention: la partie après les deux points n'est pas interprétée, ceci liste les adresses existantes mais n'effectue aucun contrôle d'accès
#
# Settings for saslauthd daemon
# Please read /usr/share/doc/sasl2-bin/README.Debian for details.
#
# Should saslauthd run automatically on startup? (default: no)
START=yes
# Description of this saslauthd instance. Recommended.
# (suggestion: SASL Authentication Daemon)
DESC="SASL Auth. Daemon for Postfix"
# Short name of this saslauthd instance. Strongly recommended.
# (suggestion: saslauthd)
NAME="saslauthd-postf"
# Which authentication mechanisms should saslauthd use? (default: pam)
#
# Available options in this Debian package:
# getpwent -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam -- use PAM
# rimap -- use a remote IMAP server
# shadow -- use the local shadow password file
# sasldb -- use the local sasldb database file
# ldap -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="pam"
MECHANISMS="pam"
# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
MECH_OPTIONS=""
# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5
# Other options (default: -c -m /var/run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# WARNING: DO NOT SPECIFY THE -d OPTION.
# The -d option will cause saslauthd to run in the foreground instead of as
# a daemon. This will PREVENT YOUR SYSTEM FROM BOOTING PROPERLY. If you wish
# to run saslauthd in debug mode, please run it by hand to be safe.
#
# See /usr/share/doc/sasl2-bin/README.Debian for Debian-specific information.
# See the saslauthd man page and the output of 'saslauthd -h' for general
# information about these options.
#
# Example for chroot Postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
# Example for non-chroot Postfix users: "-c -m /var/run/saslauthd"
#
# To know if your Postfix is running chroot, check /etc/postfix/master.cf.
# If it has the line "smtp inet n - y - - smtpd" or "smtp inet n - - - - smtpd"
# then your Postfix is running in a chroot.
# If it has the line "smtp inet n - n - - smtpd" then your Postfix is NOT
# running in a chroot.
# Option -m sets working dir for saslauthd (contains socket)
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd" # postfix/smtp in chroot()
From pica-mail-mta
#installation des paquets debian
RUN apt-get update -y \
&& apt-get install -y \
nano telnet rsyslog dnsutils \
&& rm -rf /var/lib/apt/lists/*
#serveur MDA/LDA sous la forme d'un serveur LMTP : donner l'adresse et le port du conteneur avec pica-mail-mda
ENV LMTP_LAN_HOSTNAME pica-mail-mda-auth_plaintext.local-mail-delivery
ENV LMTP_PORT 24
ENV LDAP_SERVER_HOSTNAME ldap.test.picasoft.net
ENV LDAP_PORT 389
COPY local_users /
COPY saslauthd-postifx /etc/default/
COPY entrypoint2.sh /
ENTRYPOINT ["/entrypoint2.sh"]
Cette image Docker a pour but de tester pica-mail-mta en se passant du LDAP.
Elle prend pica-mail-mta et rajoute :
* des adresses mails reconnues localement (inscrites dans la recipient table) : mail1@picasoft.net, mail2@picasoft.net
* des comptes d'utilisateur autorisés à utiliser ces adresses mail: mail1 et mail2 de mots de passe respectifs mail1pwd et mail2pwd autorisés à envoyer des mails respectivement en tant que mail1@picsoft.net et mail2@picasoft.net
Cette image docker est actuellement en développement. Pour le moment, nous sommes en train de travailler sur le premier point et pas sur le second, c'est-à-dire que n'importe qui peut se connecter au serveur et envoyer des mails en tant qu'une adresse de son choix, mais le destinataire doit être une adresse connue.
Le le réseau 127.0.0.1 a le droit de se connecter à la machine, mais pas besoin de mot de passe. On peut donc la tester en faisant
```
docker exec -it conteneur /bin/bash
apt update
apt install telnet
telnet localhost 25
helo pica01-test.test.picasoft.net
MAIL FROM:<mail1@picasoft.net>
RCPT TO:<mail2@picasoft.net>
DATA
Subject: bonjour
bla bla bla
.
```
Voilà!
#!/bin/bash
/entrypoint.sh true
postfix stop
#génération du .db à partir du fichier texte
postmap /local_users
#ajout du .db en tant que source
postconf -e "virtual_mailbox_maps = hash:/local_users"
#on modifie temporairement les restrictions pour permettre à tout le monde d'envoyer du mail par notre serveur tant que la destination est autorisée (par les autres règles) et que celui qui tente de se servir du serveur est sur un réseau autorisé (typiquement l'hôte et le subnet)
postconf -e "mynetworks = 127.0.0.0/8"
#voir en dessous pour la config sasl
postconf -e "smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination"
postconf -e "smtpd_client_restrictions = "
#désactivation des restrictions sur le helo
postconf -e "smtpd_helo_restrictions = "
#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
#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
#on utilise les comptes unix de l'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 sécurisés mais utilisant des syntaxes obsolètes/non standard (=outlook)
postconf -e 'broken_sasl_auth_clients = yes'
useradd toto
useradd bobo
echo "toto:toutou"|chpasswd
echo "bobo:boubou"|chpasswd
postfix start
postfix reload
postfix stop
service rsyslog start
service postfix stop
service postfix start
tail -F /var/log/mail.log
mail1 mail1
mail2 mail2
#attention: la partie après les deux points n'est pas interprétée, ceci liste les adresses existantes mais n'effectue aucun contrôle d'accès
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