====== 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''.