Le mail sous OpenBSD
De OpenWikiBSD.
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é
- [[1]]
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
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
- Suivre la doc de Calomel ou celle du man..
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
- Reprendre votre certificat client (Par ex. celui incorporé dans Ffox) et l'exporter au format .p12
- Exporter le p12 en .pem
- Prendre l'empreinte du certificat
- Ajouter l'empreinte dans un fichier des clients à relayer :
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
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>
- Changez $rcmail_config['enable_installer'] = à true dans /var/www/roundcubemail/config/main.inc.php
- Un petit tour sur http://Mon_serveur/roundcubemail/installer
- Changez le mot de passe (pass) dans le fichier /var/www/htdocs/roundcubemail/config/db.inc.php
- Installez de quoi faire du mail depuis Apache
- 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..
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
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.


