====== Service simple de messagerie ======
La plupart des services web vont chercher à envoyer des emails depuis vos [[jails:zfs|jails]] ou depuis l'hôte. De même, l'hôte va envoyer des messages localement, en cas d'erreur ou lors de contrôle périodiques.
===== Sendmail =====
C'est le [[https://www.sendmail.org/~ca/email/|service de base]] fourni par FreeBSD.
Si le seul service qui vous intéresse est la transmission à un autre //SMTP//, depuis l'hôte:
sendmail_enable="NO"
sendmail_submit_enable="YES"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
Si vous souhaitez un service commun à toutes vos [[jails:zfs|jails]]:
sendmail_enable="YES"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="YES"
La différence majeure ici est que '''sendmail_submit''' n'écoute que sur l'interface //localhost//.
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//.
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 =====
[[http://www.open-spf.org/|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.
popeye 10800 IN TXT "v=spf1 a ~all"
Ici, on vérifie que l'expéditeur correspond à une des entrée DNS ou (''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 [[https://www.freshports.org/mail/opendkim/|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//:
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:
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:
lapinbilly._domainkey 10800 IN TXT "v=DKIM1; k=rsa;p=icimettrelaclef"
==== DMARC ====
C'est la touche finale, définir la [[https://dmarc.org|politique]] en cas d'échec de vérification. Toujours dans une entrée 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.
==== TLS ====
Pour chiffrer vos messages:
cd /etc/mail/certs
openssl dhparam -out dh.param 4096
La procédure est assez longue.
==== Relayer les sous-domaines ====
Par défaut, //Sendmail// ne relaye les messages reçu que sur le domaine de la machine, soit le ''hostname'' précisé dans ''rc.conf''. Pour simplifier, il ne relaye rien.
Mais, il prévoit un mécanisme simple pour définir les domaine locaux, notamment ceux de vos [[jails:zfs|jails]]. Il suffit d'enregistrer les sous-domaines dans ''/etc/mail/relay-domains''.
jail1
jail2
jail3
192.168.5.10
===== Déléguer =====
Pour éviter toute cette configuration, 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 ou votre ISP.
Pour cela, utilisons un relai comme [[https://www.freshports.org/mail/ssmtp|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:
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
===== Tests ====
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: SIZE=76
250 2.1.0 ... Sender ok
>>> RCPT To:
>>> DATA
250 2.1.5 ... 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
===== Recevoir =====
Cette documentation ne s'adresse pas à ceux qui voudrait un serveur de messagerie complet, avec utilisateurs virtuels, IMAP/POP et tout le tintouin.
==== Service ====
Il s'agit ni plus ni moins que d'envoyer, ou de relayer, les messages reçus vers l'hôte, en local.
Ensuite, il suffit d'ajouter une entrée [[https://www.cloudflare.com/fr-fr/learning/dns/dns-records/dns-mx-record/|MX]] dans votre gestionnaire de domaine:
@ 28800 MX 10 destination
La destination est une IP ou une machine, qu'elle soit ou nom dans votre domaine. Attention, les noms de machine complet doivent se terminer par un point (''.'').
@ 28800 MX 10 matarje.dmarec.fr.
Ici la machine est enregistré en tant que //MX// sur le domaine, soit .
Ainsi, les messages pour , appelé le ''recipient'' (en), iront dans la boite locale de .
C'est aussi simple que ça en l'air.
En fait de boite locale, il s'agit d'un fichier //spool// qui se trouve par défaut dans ''/var/mail/${USER}'' et est décrit dans la variable ''${MAIL}''.
Ce fichier est une file d'attente que ne demande qu'à être vidée par un lecteur de messagerie.
Celui fournit en base en mail(1). Il est simple et vous permettra surtout de vérifier que tout fonctionne.
Le problème ici est que le nom de domaine du //MX//, , ne correspond pas à celui de //Sendmail//, hébergé par
==== Domaine de messagerie ====
Vous pouvez alors associer vos utilisateur à ces noms de domaine, autre que celui de la machine.
Comme indiqué dans le chapitre sur les relais de sous-domaine, //Sendmail// ne relaye les messages reçu que sur le domaine de la machine.
Indiquez le domaine de messagerie dans le ''/etc/mail/relay-domains'' s'il n'est pas exactement celui de l'hôte. Ce qui est probablement le cas.
dmarec.fr
Ensuite, créer une base d'utilisateur, dans ''virtusertable'':
#
# Map one or all usernames at a source hostname to a specific (or the same)
# username at another target hostname. Remember to add the source hostname
# to /etc/mail/local-host-names so that sendmail will accept mail for the
# source hostname.
#
david@dmarec.fr david
david.marec@dmarec.fr david
david@matarje.dmarec.fr david
Construisez un fichier de base de donnée à partir de ce dernier:
/usr/sbin/makemap hash virtusertable.db < virtusertable
Lancer make depuis ''/etc/mail'' va reconstruire tous ces fichiers
==== Client ====
Le client de base est assez simple, tapez ''mail'':
Mail version 8.1 6/6/93. Type ? for help.
"/var/mail/david": 1 message 1 new
>N 1 david.marec@x.y Thu Dec 21 17:14 39/1702 "yop"
& t 1
Message 1:
From david.marec@x.y Thu Dec 21 17:14:29 2023
Date: Thu, 21 Dec 2023 17:14:12 +0000
To: "david@matarje.dmarec.fr"
From: David Marec
Subject: yop
coucou
- David
Après lecture les messages sont empilés dans le fichier ''${HOME}/mailbox''.
mail -f
Mail version 8.1 6/6/93. Type ? for help.
"/home/david/mbox": 1 message
> 1 david.marec@x.y Thu Dec 21 17:14 40/1713 "yop"
Ensuite, installez des lecteurs plus évolués, comme [[https://www.freshports.org/mail/mutt/|mutt]] et vous pourrez lire vos mails d'un simple '' ssh -tt machine.x.y mutt''
===== Information ====
Pour obtenir des informations sur le //sendmail// que vous utilisez, utilisez le drapeau ''-dx.y'':
sendmail -d0.1 -bp
Version 8.17.1
Compiled with: DNSMAP IPV6_FULL LOG MAP_REGEX MATCHGECOS MILTER
MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS
PIPELINING SCANF STARTTLS TCPWRAPPERS TLS_EC TLS_VRFY_PER_CTX
USERDB XDEBUG
============ SYSTEM IDENTITY (after readcf) ============
(short domain name) $w = matarje
(canonical domain name) $j = matarje.dmarec.fr
(subdomain name) $m = dmarec.fr
(node name) $k = matarje.dmarec.fr
========================================================
/var/spool/mqueue is empty
Total requests: 0
Les catégories que l'on peut consulter sont listées dans ''/usr/src/contrib/sendmail/src/TRACEFLAGS''.