Service simple de messagerie
La plupart des services web vont chercher à envoyer des emails depuis vos 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 service de base fourni par FreeBSD. Si le seul service qui vous intéresse est la transmission à un autre SMTP, depuis l'hôte:
- rc.conf.d/sendmail
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:
- rc.conf.d/sendmail
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.
- 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.
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. Il suffit d'enregistrer les sous-domaines dans /etc/mail/relay-domains
.
- /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 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
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:<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
Recevoir
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 MX dans votre gestionnaire de domaine:
- unbound.conf
@ 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 (.
).
- unbound.conf
@ 28800 MX 10 matarje.dmarec.fr.
Ici la machine matarje.dmarec.fr est enregistré en tant que MX sur le domaine, soit dmarec.fr.
Ainsi, les messages pour toto@matarje.dmarec.fr, appelé le recipient
(en), iront dans la boite locale de toto.
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, dmarec.fr, ne correspond pas à celui de Sendmail, hébergé par matarje.dmarec.fr
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.
- /etc/mail/relay-domains
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
/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" <david@matarje.dmarec.fr> From: David Marec <david.marec@x.y> 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 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
.