Le mail sous OpenBSD

De OpenWikiBSD.

La vieille documentation

Sommaire

Envoi de mails

Envois depuis la machine locale

Rien à faire , c'est prévu par défaut :

netstat -na |grep 25
tcp          0      0  127.0.0.1.25           *.*                    LISTEN
tcp6         0      0  ::1.25                 *.*                    LISTEN

Mail en PHP sous un Apache chrooté

pkg_add mini_sendmail-chroot
pkg_add mini_sendmail
mkdir /var/www/tmp
chown www.www /var/www/tmp
mkdir /var/www/bin
cp /bin/sh /var/www/bin/sh
cd /var/www/bin/
ln -s mini_sendmail sendmail
mkdir /var/www/etc
cp /etc/resolv.conf  /var/www/etc/resolv.conf
perl -pi -e 's/;sendmail_path =/ sendmail_path = "\/bin\/sendmail -t"/' /var/www/conf/php.ini
mkdir -p /var/www/usr/lib
mkdir -p /var/www/usr/libexec

apachectl stop
apachectl start


Faites un test en créant un fichier php dans l'arbo web:

<?php
mail("moi@mondomaine","obj","message");
?>

Service de messagerie

MTA

Ca y est je franchis le pas. Exit Sendmail, Welcome OpenSMTPd ...Enfin c'est ce qui était prévu. Maintenant OpenSMTPD est très jeune mais aux âmes bien nées etc...) et ne dispose pas encore de tous les features qu'on aime...Pas de backend LDAP pour le moment.;-(

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.

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"
  • accept for all : Accepte tous les emails, quelle que soit leur destination.

Usage de submission: TCP/587

echo 'map secrets { source db "/etc/mail/secrets.db" }' >> /etc/mail/smtpd.conf
echo 'accept for all  relay via smtp-auth.fai.fr port 587 tls enable auth' >>/etc/mail/smtpd.conf
echo "smtp-auth.fai.com  username:password" > /etc/mail/secrets
makemap -o /etc/mail/secrets.db /etc/mail/secrets 
chmod 640 /etc/mail/secrets.db
chgrp _smtpd /etc/mail/secrets.db
pkill smtpd
smtpd

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é

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 'sendmail_flags="-bd"' >> /etc/rc.conf.local
echo 'syslogd_flags="-a /var/spool/postfix/dev/log"' >> /etc/rc.conf.local 
pkill syslogd
syslogd
pkill sendmail
/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

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


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

Un ensemble de techniques, ici

MDA

Dovecot pour l'IMAPS, voire le POP3...

Installation

  • Paquet
pkg_add dovecot-1.2.16p2-ldap


echo "if [ -x /usr/local/sbin/dovecot ]; then" >> /etc/rc.local
echo "       echo -n ' dovecot';       /usr/local/sbin/dovecot " >> /etc/rc.local
echo "fi" >> /etc/rc.local
  • Chemins et droits
mkdir -p /var/mail/USER/Maildir
chown -R UID_LDAP.GID_LDAP /var/mail/USER

Avec UID_LDAP et GID_LDAP les uidNumber et gidNumber LDAP de l'utilisateur

et dans /etc/dovecot.conf :

mail_location = maildir:/var/mail/%u/Maildir

Dans un premier temps (Avant LDAP)

mkdir -p /var/mail/USER
chown -R USER.USER /var/mail/USER/

pour chaque user du système

Il est très fortement conseillé de modifier le système comme suit (par ex):

ulimit -n 1024

Sinon :

Authentification LDAP

Changer les deux modes suivants dans /etc/dovecot.conf

 userdb ldap {
   args = /etc/dovecot/dovecot-ldap.conf
              }
 passdb ldap {
   args = /etc/dovecot/dovecot-ldap.conf
      }


mkdir /etc/dovecot
  • Créer /etc/dovecot/dovecot-ldap.conf
echo "
hosts = 127.0.0.1
auth_bind = yes
ldap_version = 3
auth_bind_userdn = cn=%u,ou=people,dc=openbsd,dc=net
base = ou=people,dc=openbsd,dc=net
base= cn=%u,ou=people,dc=openbsd,dc=net
user_filter = (&(objectClass=posixAccount)(cn=%u)) 
pass_attrs = cn=user
pass_filter = (&(objectClass=posixAccount)(cn=%u)
" > /etc/dovecot/dovecot-ldap.conf
  • Autoriser les protocoles non-chiffrés (IMAP et POP3) :

Modifier la ligne dans /etc/dovecot.conf: (yes en no):

disable_plaintext_auth = no

Tests

Ici

telnet @IP 143
Trying @IP...
Connected to @IP
Escape character is '^]'.
* OK  Dovecot ready.
a login USER  PASS
* BAD [ALERT] Plaintext authentication not allowed without SSL/TLS, but your client did it anyway. If anyone was listening, the password was exposed.
a NO [CLIENTBUG] Plaintext authentication disallowed on non-secure (SSL/TLS) connections.

Et oui, pas possible de taper son mdp sur un canal en clair,; bien bien..

  • Test :
openssl s_client -connect @IP:993

sans AC

openssl s_client -CAfile /home/phil/Cert_AC.pem -connect @IP:993

Avec son AC

Dans le second cas, le client openssl râle beaucoup moins..

....
a login toto titi
a NO [AUTHENTICATIONFAILED] Authentication failed.

et la communication avec l'annuaire LDAP fonctionne.

b select INBOX

Debug

  • Le Fatal n'était qu'un warning...
dovecot: deliver(USER): Fatal: postmaster_address setting not given

Il faut ajouter à /etc/dovecot.conf

postmaster_address = Une vraie adresse


  • Le chemin des maildir est incorrect

Il faut ajouter à /etc/dovecot.conf

mail_location = maildir:/var/mail/%u/Maildir



  • Vous avez oublié le chemin des boites :
dovecot: IMAP(USER): mail_location not set and autodetection failed: Mail storage autodetection failed with home=/home/USER
dovecot: IMAP(USER): Fatal: Namespace initialization failed

Avec un peu de lecture, on apprend qu'il faut dire explicitement à Dovecot où sont les boites. Normalement il les découvre seul, mais là, on a affaire à un utilisateur LDAP qui n'a pas de compte local, donc pas de /home/USER...


Et dans les logs, cette fois :

dovecot: imap-login: Login: user=<USER>, method=PLAIN, rip=IP_client, lip=IP_Serveur, TLS


Depuis le client, on se reconnecte et après cette fois on pose des questions :

b select inbox
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 0 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1293058568] UIDs valid
* OK [UIDNEXT 1] Predicted next UID
* OK [HIGHESTMODSEQ 1] Highest
b OK [READ-WRITE] Select completed.
  • Droits sur les boites :
IMAP(USER): mkdir(/var/mail/USER/Maildir/cur) failed: Permission denied (euid=UID(<unknown>) egid=GID(<unknown>) missing +w perm: /var/mail)

Il faut corriger :

  • Droits sur les boites :
deliver(USER): mkdir(/var/mail/USER/Maildir/cur) failed: Permission denied (euid=UID(USER) egid=GID(USER) missing +w perm: /var/mail)

Il faut corriger :

 mkdir -p /var/mail/USER
 chown -R USER.USER /var/mail/USER/

avec un USER créé dans le système.



  • Il manque des attributs à l'utilisateur LDAP.
Internal login failure (auth failed, 1 attempts): ... User XXXXX is missing UID (see mail_uid setting)

Ajoutez les attributs suivants pour chaque user :

mail_uid: 666

gidNumber: 666

uidNumber: 666


  • Dovecot se plante avec :
dovecot: dovecot: pipe() failed: Too many open files
dovecot: dovecot: pipe() failed: Too many open files

Et pourtant, il vous avait bien prévenu à chaque lancement... :

dovecot
Warning: fd limit 128 is lower than what Dovecot can use under full load (more than 768). Either grow the limit or change login_max_processes_count    and max_mail_processes settings


Solution :

ulimit -n 1024

RoundCube: Le Webmail qui vous va bien

Install

pkg_add roundcubemail
ln -fs /var/www/conf/php5.sample/mbstring.ini         /var/www/conf/php5/mbstring.ini
ln -s /var/www/conf/modules.sample/roundcubemail.conf         /var/www/conf/modules
cd /var/www/
ln -s ../roundcubemail /var/www/htdocs
pkg_add pecl-fileinfo
ln -fs /var/www/conf/php5.sample/fileinfo.ini        /var/www/conf/php5/fileinfo.ini
apachectl stop
apachectl start

mysql
CREATE DATABASE roundcubemail /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password';
quit

mysql roundcubemail < /var/www/roundcubemail/SQL/mysql.initial.sql 

afin de ne pas se faire trouer le serveur durant la phase d'install, il peut être utile de coller un .htaccess dans /var/www/roundcubemail/installer

order deny,allow
deny from all
allow from @MONIP
<limit GET>
#require valid-user
</limit>


  • Lorsque l'installateur vous dit que tout est OK:
    • Remettez le enable_installer à false
    • Supprimez le répertoire installer (ou copiez -le à un endroit inaccessible)
  • C'est terminé

Plus d'infos : /var/www/roundcubemail/INSTALL..

Au final, ça donne : Fichier:RoundCube.png


Migration Carnet d'adresses

On a toujours quelqu'un qui a eu le souci avant vous. En plus, comme ça, on apprend Python !

XXX contacts importés avec succès, YYY entrées existantes ignorées:

On peut écraser le carnet de Roundcube pour remettre les choses à plat, après test.

Et si on filtrait les mails directement sur le serveur : SIEVE

Doc et Redoc

pkg_add dovecot-sieve

Désinstall

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

Migration de compte

Avec tout ça, vous allez vouloir migrer vos comptes de POP3 à IMAPS..

Avec ThunderBird

Très facile !

  • Vous vous créez un nouveau compte IMAPS, que vous configurez en demandant la synchronisation des mails avec le serveur.
  • Vous relevez vos messages et validez la configuration du client.
  • Vous déplacez (drag and drop) un dossier depuis le compte POP3, vers le compte IMAPS.

Attention, c'est très long, même en Ethernet (Environ 3 min pour 1000 emails). Si vous comptez synchroniser sur un serveur ADSL distant, comptez plusieurs nuits pour la synchro initiale...

  • Pour les filtres, utilisez ça
    • Outils/Modules complémentaires/installer
    • Outils/Filtres de massages/Exporter
    • Outils/Import de filtres

Comme vous allez vous retrouver avec des flopées de messages en double, je vous conseille cet outil qui supprime les doublons..

Si maintenant, vous avez perdus quelques mails ou dossiers dans la bataille :

  • Fermez TBird
  • Récupérez un backup des dossiers ou mails.
  • Copiez ces mails dans /home/User/.Thunderbird/XXXXX.default/Mail/Local Folders
  • Relancez TBird et déplacez ces mails dans les nouveaux dossiers Imaps, la synchro se fera directement.
Outils personnels