Envoyer des emails
La plupart des services web vont chercher à envoyer des emails depuis vos zfs ou depuis l'hôte.
sendmail
C'est le service de base fourni par FreeBSD, ne conserver que '_submit
':
- rc.conf.d/sendmail
sendmail_enable="NO" sendmail_submit_enable="YES" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO"
Si vous préférez utiliser un service commun à toutes vos jails:
- rc.conf.d/sendmail
sendmail_enable="YES" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="YEs"
Dans tous les cas, vérifiez les interfaces qui écoutent sur le port SMTP:
/etc/rc.d/sendmail restart sockstat -l -P tcp -p 25 USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS root sendmail 83699 3 tcp4 *:25 *:*
Par contre, en l'état, il est peu probable que vos emails soient accepté par vos destinataires. Au mieux, il finiront dans la boite à SPAMs. Il faut mettre en place tout un système pour que les serveurs acceptent vos requêtes. Pour comprendre ces mécanismes, le plus compliqué est de digérer la documentation concernant la jungle des entrées DNS, nécessaire pour la suite. Ces entrées sont à intégrer chez votre gestionnaire de nom de domaine.
rDNS
C'est tout simple: les serveurs vont regarder si vous êtes bien qui vous prétendez être. Tout simplement, vos emails seront forgés par sendmail avec votre hostname.
- header
Received: from popeye.lapinbilly.eu (popeye.lapinbilly.eu [188.40.73.126])
Le destinataire va vérifier auprès du fournisseur de l'IP 188.40.73.126
que le domaine enregistré est bien popeye.lapinbilly.eu
. C'est un réglage qui s'effectue chez votre ISP, aussi bien en IPv4 qu'en IPV6.
SPF
SPF, pour Send Policy Framework est la première étape qui sert à vérifier auprès des DNS, que le serveur expéditeur est autorisé à le faire. C'est une simple entrée dans votre DNS.
- DNS
popeye 10800 IN TXT "v=spf1 a ~all"
Ici, on vérifie que l'expéditeur correspond à une des entrée DNS A ou AAAA (a
).Dans tous les cas (all
), le mail est seulement marqué (~
) comme étant douteux.
Notez qu'il faut ajouter une entrée SPF pour chaque sous-domaine.
DKIM
Plus compliqué puisqu'il fait intervenir un jeu de clef public/privé dans la boucle.
Installez le port mail/opendkim. Désactivez l'option unbound
pour Stock Resolver
, a moins d'avoir réellement besoin du unbound
des ports.
Générez la clef qui servira à signer vos messages:
mkdir /var/db/dkim opendkim-genkey -D /var/db/dkim -d lapinbilly.eu -s lapinbilly
En fait le dernier champ, appelé selector
est le plus important. C'est par ce biais que sera choisi la clef utilisée pour la signature, ainsi que l'entrée DNS correspondante.
Cette clef se retrouve maintenant dans /var/db/dkim
sous la forme d'un fichier public
et d'un fichier txt
.
ls -l /var/db/dkim total 18 -rw------- 1 mailnull mailnull 891 Nov 4 16:34 lapinbilly.private -rw------- 1 mailnull mailnull 330 Nov 4 16:34 lapinbilly.txt
Notez le couple utilisateur/groupe, mailnull
qui est celui de sendmail.
chown -R mailnull:mailnull /var/db/dkim
Ajustez la configuration de opendkim:
- /usr/local/etc/mail/opendkim.conf
Domain lapinbilly.eu KeyFile /var/db/dkim/lapinbilly.private Selector lapinbilly Socket inet:8891@localhost # # gestion des sous-domaines # ------------------------- # InternalHosts /usr/local/etc/mail/dkim-intenal.conf # SubDomains yes # # debug # ----- # LogWhy yes # MilterDebug 3 # SyslogSuccess yes
Les dernière lignes seront utiles lors de la mise au point. C'est assez compliqué à faire tomber en marche.
La gestion des sous-domaines est essentielle pour l'utiliser depuis des jails. Créez le fichier défini par InternalHosts
avec les IP de vos jails ainsi que 127.0.0.1
.
Démarrez automatiquement le service:
sysrc milteropendkim_enable="YES" service milter-opendkim start
Insérons le service dans sendmail:
cd /etc/mail cp freebsd.mc lapinbilly.mc
Dans le fichier mc
, ajoutez:
- lapinbilly.mc
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost')
C'est à dire la même formule que dans opendkim.
Reconstruire la configuration de sendmail:
make lapinbilly.cf
Et remplacez freebsd.cf
par le fichier produit: lapinbilly.cf
cp lapinbilly.cf sendmail.cf
Redémarrez sendmail:
/etc/rc.d/sendmail restart
Ajoutez l'entrée du fichier txt
de la clef dans votre configuration DNS:
- dns
lapinbilly._domainkey 10800 IN TXT "v=DKIM1; k=rsa;p=icimettrelaclef"
DMARC
C'est la touche finale, définir la politique en cas d'échec de vérification. Toujours dans une entrée DNS:
- DNS
_dmarc 10800 IN TXT "v=DMARC1; p=none; sp=none"
Bon, ici, les mails seront quand même transférés en cas d'échec.
Relais
Nombre de serveurs mails comme celui de gmail vont refuser les mails arrivés de cette façon et les rejeter silencieusement. Il est plus simple de se connecter à un serveur mail extérieur, comme celui généreusement fourni par votre fournisseur de nom de domaine.
Pour cela, utilisons un relai comme mail/ssmtp. Après installation, assurez vous qu'aucun service de sendmail n'est plus configuré et terminez les services en cours:
# root@:/ killall sendmail
configurez le:
- /usr/local/etc/ssmtp/ssmtp.conf
root=postmaster mailhub=mail.ailleurs.net:465 rewriteDomain=service.lapinbilly.eu hostname=service.lapinbilly.eu UseTLS=YES AuthUser=david@mail.eu AuthPass=coucou
Sécurité
Associer un utilisateur à ce service:
$ root@:/ pw useradd ssmtp -g nogroup -h - -s /sbin/nologin -d /nonexistent -c "sSMTP pseudo-user"
Et régler les permissions:
$ root@:/ cd /usr/local/etc/ssmtp $ root@:/ chown ssmtp:wheel . $ root@:/ chmod 4750 . $ root@:/ chown ssmtp:wheel ssmtp.conf $ root@:/ chmod 640 ssmtp.conf $ root@:/ chown ssmtp:nogroup /usr/local/sbin/ssmtp $ root@:/ chmod 4555 /usr/local/sbin/ssmtp
test
Envoyez un message:
$ root@:/ mail -s sujet toto@lapinbilly.eu coucou, c'est david . EOT
C'est la ligne avec le “.” qui indique la fin du message.
Ou, préparer un message type:
To: turtle@turtle.crazy Subject: sendmail test Ceci est un test. .
Et lancer la commande:
sendmail -vt < tmp/mail.txt turtle@turtle.crazy... Connecting to [127.0.0.1] via relay... 220 epee.lapinbilly.eu ESMTP Sendmail 8.17.1/8.17.1; Sat, 4 Nov 2023 13:53:17 GMT >>> EHLO epee.lapinbilly.eu 250-epee.lapinbilly.eu Hello [192.168.0.17], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-STARTTLS 250-DELIVERBY 250 HELP >>> STARTTLS 220 2.0.0 Ready to start TLS >>> EHLO epee.lapinbilly.eu 250-epee.lapinbilly.eu Hello [192.168.0.17], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-DELIVERBY 250 HELP >>> MAIL From:<root@epee.lapinbilly.eu> SIZE=76 250 2.1.0 <root@epee.lapinbilly.eu>... Sender ok >>> RCPT To:<turtle@turtle.crazy> >>> DATA 250 2.1.5 <turtle@turtle.crazy>... Recipient ok 354 Enter mail, end with "." on a line by itself >>> . 250 2.0.0 3A4DrHG2042530 Message accepted for delivery turtle@turtle.crazy... Sent (3A4DrHG2042530 Message accepted for delivery) Closing connection to [127.0.0.1] >>> QUIT 221 2.0.0 epee.lapinbilly.eu closing connection