Service de messagerie sortante SMTP

De OpenWikiBSD
Aller à : navigation, rechercher

Cette page résulte du split de la doc messagerie.


MTA

Ca y est je franchis le pas. Exit Sendmail, Welcome OpenSMTPd ...

Si vous cherchez sendmail, c'est encore là.

OpenSMTPd

une doc

Installation

J'ai suivi cette doc en simplifiant beaucoup, car OpenSMTPd est intégré désormais. Et Calomel a mauvaise réputation chez OpenBSD, de par leur lenteur à faire évoluer les docs....(Qui a dit "y'en a d'autres"?)

On active smtpd et on désactive sendmail :

perl -pi -e 's/smtpd_flags=NO/smtpd_flags=""/' /etc/rc.conf
kill `cat /var/run/sendmail.pid  |grep -v "sendmail"`
perl -pi -e 's/sendmail_flags=/sendmail_flags=NO#/' /etc/rc.conf
echo "    sendmail        /usr/sbin/smtpctl
          send-mail       /usr/sbin/smtpctl
          mailq           /usr/sbin/smtpctl
          makemap         /usr/libexec/smtpd/makemap
          newaliases      /usr/libexec/smtpd/makemap " > /etc/mailer.conf

Le fichier de config est /etc/mail/smtpd.conf et si vous avez suivi pf, et subi sendmail.cf, alors la syntaxe de smtpd va vous enchanter...

le fichier de config par défaut, avec mails locaux acceptés et déposés dans les mbox locales

listen on lo0
map "aliases" { source db "/etc/mail/aliases.db" }
accept for local alias aliases deliver to mbox
accept for all relay


Puis

newaliases

pour refaire les aliases de messagerie

smtpd

limpide,non ?

Configuration

On n'oubliera pas sa page de man.. Tout à fait indispensable ici:

man 5 smtpd.conf
listen on $IF

On écoute sur l'interface $IF

map "aliases" { source db "/etc/mail/aliases.db" }

Le fichier d'aliases de messagerie

Il faut modifier /etc/mail/aliases puis lancer la commande newaliases pour régénérer le fichier d'alias binaires.

accept for LOCAL/DOMAIN/ALL   deliver to/relay via ..
  • accept for local : N'autorise que les mails vers une boite locale sur la machine
  • accept for domain "Nom.de.domaine" : N'autorise que les mails vers une boite en@nom.de.domaine"

Relais SMTP authentifié

Lire le man, comme toujours sous OpenBSD :[[1]]

openssl genrsa -out /etc/ssl/private/mail.openbsd-edu.net.key 4096
openssl req -new -x509 -key /etc/ssl/private/mail.openbsd-edu.net.key -out /etc/ssl/mail.openbsd-edu.net.crt -days 3650
chmod 600 /etc/ssl/mail.openbsd-edu.net.crt 
chmod 600 /etc/ssl/private/mail.openbsd-edu.net.key 

smtpd.conf devient :

pki mail.openbsd-edu.net  certificate "/etc/ssl/mail.openbsd-edu.net.crt"
pki mail.openbsd-edu.net  key          "/etc/ssl/private/mail.openbsd-edu.net.key" 
listen on lo0
listen on re0 port 25  tls pki mail.openbsd-edu.net 
listen on re0 port 587  tls-require pki mail.openbsd-edu.net  auth mask-source
table aliases db:/etc/mail/aliases.db
table secrets db:/etc/mail/secrets.db 
accept from any for domain "openbsd-edu.net" alias <aliases> deliver to mbox
accept for local alias <aliases> deliver to mbox
accept for any relay

Et si on veut de l'IMAP plutôt que du POP ?

Alors les mots-clés mbox deviennent maildir :

accept from any for domain "openbsd-edu.net" alias <aliases> deliver to maildir "/var/mail/%{user.username}/Maildir"

Debug

  • lancer smtp en mode debug
smtpd -dv
  • NB: Le mot clé all a disparu.
  • mot clé hostname qui permet de spécifier le nom affiché //OBSOLETE//
  • mask-source permet de ne pas montrer le plan d'adressage interne
  • Alors que tls permet l'usage du chiffrement, tls-require le rend obligatoire; utile pour la soumission de mail depuis un client authentifié.


Envoi: Sur le MUA (Thunderbird) utiliser STARTTLS , TCP/587 , avec un compte Unix préexistant (sans shell, tant qu'à faire!)

Réception: SSL/TLS TCP/993

Imap et dépôt dans les bal

Attention aux multiples docs pas à jour qui vous font perdre un temps précieux: RTFM les OpenBSDs docs :

  • Variables :[2]
  • Expansion des variable : [3]

Créer un MX secondaire le temps d'un café

Un ventilo qui s'arrête plein de poussières et c'est votre unique serveur de messagerie qui s'arrête...alors que vous êtes à l'autre bout de la France (oui, c'est du vécu..). Créons un tout petit serveur de messagerie de secours prêt à prendre la relève :

listen on lo0
listen on $INTERFACE_WAN

map "aliases" { source db "/etc/mail/aliases.db" }

accept for local alias aliases deliver to mbox
accept for all relay

accept from all for domain "openbsd-edu.net"  relay
accept from all for domain "openbsd-edu.42"  relay
accept from all for domain "schwarz-fr.net"  relay
accept from all for domain "schwarz.42"  relay

Et on déclare dans le DNS un enregistrement :

    IN      MX      20 lepton.openbsd-edu.net.

Pour mémoire, le poids du MX est inversement proportionnel à son attractivité pour les autres SMTP; un MX de poids 10 recevra les mails en priorité devant un MX de poids 20 !

Quand le MX principal est en ligne, il prend tous les mails.

Quand il tombe, les serveurs SMTP se tournent vers le MX de secours qui spoole les messages dans /var/spool/smtpd/queue/

Quand le MX principal est de nouveau en ligne, le serveur de secours lui renvoie les mails en attente.

Attention :

  • Le délai avant retour des mails dépend de paramètres DNS& SMTP (à préciser un poil)
  • Aucun filtrage n'est fait sur l'existence de l'utilisateur ou autre. C'est une pratique hélas commune que de diminuer la qualité de service des sites de secours. Résultat les spammeurs se lâchent sur les MX de poids élevé

Blacklister un utilisateur

Attention, il faut un OpenSMTPD postérieur à 5.5..

[4]

touch /etc/mail/blacklist-recipients
echo "patricklecassepied@gmail.com patricklecassepied@gmail.com" >> /etc/mail/blacklist-recipients

Deux fois sinon, on a makemap: virtual:1: invalid entry

echo "    table blacklist-recipients file:/etc/mail/blacklist-recipients" >> /etc/mail/smtpd.conf
/usr/libexec/smtpd/makemap -t aliases /etc/mail/blacklist-recipients

Puis ajouter la directive recipient !<blacklist-recipients> aux lignes accept from :

accept from any recipient !<blacklist-recipients> for domain "openbsd-edu.net" alias <aliases> deliver to maildir "/var/mail/%{user.username}/Maildir"
/etc/rc.d/smtpd restart

Debug

smtpd : delivery: TempFail for : from=<>, to=<>, user=XXX, method=maildir, delay=1h54m5s, stat=Error ("cannot cd to maildir: No such file or directory")
mkdir /var/mail/XXX
chown -R XXX.XXX /var/mail/XXX

Postfix

Bon, plus classique que l'autre, mais les users dans l'annuaire LDAP, j'y tiens et OpenSMTPd ne le permet pas pour le moment...


Tiré du manuel Postfix SQL et LDAP sont des systèmes complexes. Essayer de mettre en œuvre simultanément Postfix et LDAP ou SQL n'est pas une bonne idée. Vous pouvez vous éviter de nombreux problèmes en implémentant d'abord Postfix avec des fichiers locaux type Berkeley DB. Ces fichiers cachent peu de surprises et sont faciles à déboguer avec la commande postmap(1) :

C'est vraiment une bonne idée...

Installation

pkg_add postfix-2.8.20110113-ldap
/usr/local/sbin/postfix-enable
echo "smtpd_flags=NO">> /etc/rc.conf.local

echo 'sendmail_flags="-bd"' >> /etc/rc.conf.local

echo 'syslogd_flags="-a /var/spool/postfix/dev/log"' >> /etc/rc.conf.local 
pkill syslogd
syslogd
/etc/rc.d/smtpd stop
/usr/local/sbin/sendmail -bd 

Création d'un user dédié pour les mails

useradd -d /var/vmail -g =uid -u 2000 -s /sbin/nologin -c "Virtual Mailboxes Owner" -m vmail

Gestion du LDA (Local Delivery Agent). Gestion de Postfix vers Dovecot

echo " # Dovecot LDA
 dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
" >> /etc/postfix/master.cf


echo " #PS
 dovecot_destination_recipient_limit = 1
 mailbox_transport = dovecot
" >> /etc/postfix/main.cf

Modifier /etc/postfix/main.cf :

home_mailbox = Maildir/
mail_spool_directory = /var/mail
mailbox_command = /usr/local/libexec/dovecot/deliver

Commenter la ligne de crontab du client mqueue. Ligne 9

crontab -e

Gestion des domaines virtuels

Afin que votre serveur SMTP sache gérer que

phil@domaine1 soit l'user phil

et

phil@domaine2 soit l'user philippe

au hasard :-)

  • Ajouter à /etc/postfix/main.cf :
 virtual_alias_maps = hash:/etc/postfix/virtual
  • Ajouter dans /etc/postfix/virtual
phil@domaine1  phil
phil@domaine2  philippe
postmap /etc/postfix/virtual
postfix reload

Plus d'info à la source

  • Gestion d'un smarthost (un relais de messagerie )
    relayhost = [mail.isp.tld]    (deliver via provider mailhub)

SMTP Authentifié

Config

Utiliser votre serveur SMTP depuis votre laptop/Smartphone/whatever quelle que soit votre IP itinérante; le tout sans vous transformer en relais ouvert!

  • Installer la bonne version de postfix depuis les ports
tar zcvf /var/sauve/postfixConf.tar.gz /etc/postfix
pkg_delete  -v postfix-2.8.20110113-ldap
pkg_add -v postfix-2.8.20110113-sasl2


echo "`openssl x509 -fingerprint -in monCert.pem -noout |cut -d"=" -f2` polyp" >> /etc/postfix/cert_relay_clients
postmap /etc/postfix/cert_relay_clients
echo "relay_clientcerts =  hash:/etc/postfix/cert_relay_clients"  >> /etc/postfix/main.cf
echo "smtpd_recipient_restrictions = permit_tls_clientcerts "  >> /etc/postfix/main.cf
  • Configurer sasl2 comme indiqué ici
echo "
# SASL2 Authentication Daemon
# This configuration sets saslauthd to use the system password file.
if [ -x /usr/local/sbin/saslauthd ]; then
  echo -n ' sasl2';/usr/local/sbin/saslauthd -a getpwent -m /var/spool/postfix/var/run/sasl2/
fi

" >> /etc/rc.local

echo "
 pwcheck_method:saslauthd
 mech_list: PLAIN LOGIN
 log_level: 3
 saslauthd_path: /var/run/sasl2/mux
 " >> /etc/postfix/smtpdsasl2.conf
ln -s /usr/local/lib/sasl2/smtpd.conf  /etc/postfix/smtpdsasl2.conf
mkdir -p /var/spool/postfix/var/run/sasl2
  • Décommentez les lignes de master.cf relatives à smtps
smtps     inet  n       -       -       -       -       smtpd
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
 -o milter_macro_daemon_name=ORIGINATING
postfix reload

/usr/local/sbin/saslauthd -a getpwent -m /var/spool/postfix/var/run/sasl2/


  • Tester la conf de postfix
postconf -n
openssl rsa -in key.pem  -check
openssl x509 -in cert.pem  -text

ne doivent renvoyer aucune erreur

Debug
postfix/smtpd[]: warning: cannot get RSA private key from file /etc/postfix/key.pem: disabling TLS support

Souci de clé, vérifiez avec OpenSSL

Warning: SASL authentication failure: Could not open db

Le fichier /etc/postfix/smtpdsasl2.conf est absent ou manque d'infos.

Warning: TLS library problem: error: :SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate alert number 42

Votre serveur n'a pas le nom contenu dans votre certificat


telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 FQDN ESMTP Postfix
ehlo domain
250-FQDN
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN OTP NTLM LOGIN GSSAPI DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN OTP NTLM LOGIN GSSAPI DIGEST-MD5 CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
starttls
220 2.0.0 Ready to start TLS

C'est tout bon.

Configuration du MUA ThunderBird pour le SMTP auth
  • Edition/Avancé/Certificats/Voir les certificats/Importer
  • Choisissez le p12 préalablement construit.
  • Donnez la passphrase du p12.
  • Récupération des certificats et clés privées réussie

LDAP

perl -pi -e 's/#alias_maps = hash:\/etc\/aliases/alias_maps = hash:\/etc\/mail\/aliases,ldap:\/etc\/postfix\/ldap-aliases.cf/' /etc/postfix/main.cf
alias_maps = ldap:/etc/postfix/ldap-aliases.cf, hash:/etc/mail/aliases
echo "server_host = 127.0.0.1 
version = 3 
search_base = dc=openbsd,dc=edu 
query_filter = (&(objectClass=mailAccount)(mailalias=%s)(mailenable=OK)) 
result_attribute = mail" > /etc/postfix/ldap-aliases.cf
  • A noter

Vous aviez l'habitude dans /etc/mail/aliases de :

alias: Nom/Adresse de redirection

maintenant, dans LDAP, vous aurez : mailacceptinggeneralid: maildrop

Commandes

  • Liste les paramètres
postconf -n
  • Modifie un paramètre
postconf -e "myorigin = openbsd-edu.net"
  • Supprimer un mail de la file d'attente
postsuper -d ID_DU_MESSAGE


Blacklister un utilisateur

Source

touch /etc/postfix/sender_access 
echo "cassepied@mondomaine.fr REJECT" >> /etc/postfix/sender_access 
postmap hash:sender_access 
echo "smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access"  >> /etc/postfix/main.cf
postfix stop
postfix start

Ce qui dans, les logs donne :

postfix/smtpd  NOQUEUE: reject: RCPT from IP 554 5.7.1 <cassepied@mondomaine.fr>: Sender address rejected: Access denied; from=<cassepied@mondomaine.fr> to=<> proto=ESMTP helo=<>


Désinstall

postfix-disable 
pkg_delete postfix
/usr/sbin/userdel _postfix
/usr/sbin/groupdel _postdrop
/usr/sbin/groupdel _postfix

Debug

  • warning: dict_ldap_lookup
warning: dict_ldap_lookup: /etc/postfix/ldap-aliases.cf: Search base 'ou=people,dc=openbcd,dc=edu' not found: 32: No such object

Pourtant la coquille était facile à voir.. Vous avez une erreur dans le baseDN.

  • NOQUEUE: reject: Recipient address rejected: User unknown in local recipient table

Votre utilisateur n'a pas d'entrées

mailacceptinggeneralid: MAIL@schwarz-fr.net
maildrop: compteLDAP

Antispam : Tellement facile à installer

Un ensemble de techniques, ici et [5]

Très simplement, on va utiliser les ressources développées par l'équipe OpenBSD : spamd

  • Aucun changement dans la config d'OpenSMTPD, /etc/mail/smtpd.conf
  • pf va faire le boulot de redirection; on va se contenter de décommenter les lignes relatives à spamd sans rien y changer :
# rules for spamd(8)
table <spamd-white> persist
table <nospamd> persist file "/etc/mail/nospamd"
pass in on egress proto tcp from any to any port smtp rdr-to 127.0.0.1 port spamd
pass in on egress proto tcp from <nospamd> to any port smtp
pass in log on egress proto tcp from <spamd-white> to any port smtp
pass out log on egress proto tcp to any port smtp
  • Dans /etc/rc.conf, on active spamd :
spamd_flags="-v -G 3:4:864" # NO              # for normal use: "" and see spamd(8

Et on redémarre tout ça :

/etc/rc.d/smtpd restart
/etc/rc.d/spamd restart
pfctl -d && pfctl -e -f /etc/pf.conf

Et on attend de voir le travail :

spamdb | sort
GREY|190.21.126.171|190-21-121-28.baf.movistar.cl|<classifiedshkbg@aktuellezeit.com>|<phil@openbsd-edu.net>|1412172661|1412187061|1412187061|1|0

Lui, il vient de vouloir me spammer, il est greylisté; pas certain qu'il passe

GREY|193.54.149.10|pluton.ac-grenoble.fr|<l.crdp-...fr>|<philippe@openbsd-edu.net>|1412171728|1412172411|1412186128|3|0

Lui, il veut juste m'écrire, il est greylisté; comme il est poli, il va revenir et on le "whitelistera"

WHITE|212.27.42.9|||1412169899|1412170454|1415280884|2|0

Lui, c'est le SMTP de free; il a subi les tests, il passe

Whitelister quelqu'un

spamdb -a @IP


  • Souci avec les gros domaines avec plusieurs SMTP. On va supposer que les MX du domaine sont également les serveurs SMTP sortants...
Mauvaises méthodes
# Usage script google.com ou ovh.fr 
WHITEIN=$(spamdb |grep WHITE |wc|awk '{print $1}')
MX=$(dig -t mx $1 |grep "A" |grep -v ";" |awk '{print $5}')
for DOMAIN in $MX
       do
       /usr/sbin/spamdb -a $DOMAIN
done
WHITEOUT=$(spamdb |grep WHITE |wc|awk '{print $1}')
DIFF=$(bc -e "$WHITEOUT - $WHITEIN" -e quit)
echo "$DIFF serveurs SMTP whitelistes"

A lancer sur les domaines de google, free, hotmail,...


Idem mais partir des logs de spamdb

GREY=$( spamdb |grep GREY |grep $1|cut -d"|" -f2)
WHITEIN=$(spamdb |grep WHITE |wc|awk '{print $1}')
for SMTP in $GREY
       do
       /usr/sbin/spamdb -a $SMTP
done
WHITEOUT=$(spamdb |grep WHITE |wc|awk '{print $1}')
DIFF=$(bc -e "$WHITEOUT - $WHITEIN" -e quit)
echo "$DIFF serveurs SMTP whitelistes"
Bonne méthode

Il faut juste demander poliment aux domaines de nous donner la liste des SMTP sortant autorisés. SPF

# Usage script google.com ou ovh.fr 
WHITEIN=$(spamdb |grep WHITE |wc|awk '{print $1}')
SPF=$(dig $1 txt |grep $1 |grep "ip4"|grep -v ";"|cut -d'"' -f2|awk '{print $3,$4,$5,$6,$7,$8,$9}'|cut -d"~" -f1)
echo "SPF $SPF"
for IP in $SPF
       do
       NET=$(echo $IP| cut -d":" -f2)
       NETTRUNC=$(echo $NET| cut -d"." -f1-3)
       HOSTMIN=$(ipcalc $NET|grep "host min" |cut -d"." -f4)
       HOSTMAX=$(ipcalc $NET|grep "host max" |cut -d"." -f4)
       #echo "NET $NET - TRUNC $NETTRUNC - MIN $HOSTMIN - AX $HOSTMAX"
       CPT=$HOSTMIN
       while  [ $CPT -le $HOSTMAX ]
               do      #echo "$NETTRUNC.$CPT"
                       CPT=$(( CPT+1 ))
                       /usr/sbin/spamdb -a $NETTRUNC.$CPT
       done
done
WHITEOUT=$(spamdb |grep WHITE |wc|awk '{print $1}')
DIFF=$(bc -e "$WHITEOUT - $WHITEIN" -e quit)
echo "$DIFF serveurs SMTP whitelistes"