Table des matières

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

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.