Tags

arm bin_sh blocage blosxom bsd bsdfrance cblog certification chroot cluster dg834 dhcp dns dnsmasq dovecot fail-over fail2ban firefox freebsd ftp git guruplug install ipv6 jail kernel kimsufi lex libre linutop makefile mohawk netbook netbsd nginx ntp ntp.org openntpd openrd openwrt proxy python reverse rmll route rrdcgi sieve sl2009 ssd symon update usb var_empty vimperator world xen yacc zfs

Powered by

blOg
maRkdown
awK
shEll

22/12/2010

[ dovecot sieve ]

201012221958 dovecot sieve

Dovecot et sieve

Ma jail smtp est composée du duo sendmail et dovecot. Le passage à dovecot2 m'a pris un peu de temps, ce qui à mes yeux doit justifier un billet.

dsx@mx81>pkg_add /tmp/dovecot-2.0.7.tbz
dsx@mx81>ls /usr/local/etc/dovecot/
README

Adieu le fichier de configuration unique, bonjour le répertoire conf.d/. Histoire de ne pas faire de connasseries, je commence en mode debug:

dsx@mx81>sudo cp /usr/local/share/doc/dovecot/example-config/dovecot.conf /usr/local/etc/dovecot/
dsx@mx81>sudo /usr/local/sbin/dovecot -F -c /usr/local/etc/dovecot/dovecot.conf
doveconf: Fatal: Error in configuration file /usr/local/etc/dovecot/dovecot.conf line 22: No matches
dsx@mx81>awk 'NR==22 { print }' /usr/local/etc/dovecot/dovecot.conf
!include conf.d/*.conf

Un petit tour dans /usr/local/share/doc/dovecot/example-config/conf.d/ et je me dis que ça ne va pas être aussi simple qu'une bête copie de répertoire. Je commence doucement:

dsx@mx81>sudo mkdir /usr/local/etc/dovecot/conf.d
dsx@mx81>sudo cp /usr/local/share/doc/dovecot/example-config/conf.d/10-logging.conf /usr/local/etc/dovecot/conf.d/

Et je rajoute à la fin de 10-logging.conf

log_path = /dev/stderr

C'est reparti:

dsx@mx81>sudo /usr/local/sbin/dovecot -F -c /usr/local/etc/dovecot/dovecot.conf
doveconf: Fatal: Error in configuration file /usr/local/etc/dovecot/dovecot.conf: ssl enabled, but ssl_cert not set

Bon, c'est vrai, j'ai activé le ssl lors de la compilation mais pour l'instant je ne vais pas m'en servir. Je rajoute dans /usr/local/etc/dovecot/dovecot.conf

ssl = no

C'est un peu mieux:

dsx@mx81>sudo /usr/local/sbin/dovecot -F -c /usr/local/etc/dovecot/dovecot.conf
Dec 19 11:33:17 master: Info: Dovecot v2.0.7 starting up

netstat me rapporte que les ports pop3 et imap sont en écoute sur toutes les interfaces, tout va bien. Première connection:

dsx@mx81>telnet 172.16.0.9 110
Trying 172.16.0.9...
Connected to mx2.bsdsx.fr.
Escape character is '^]'.
USER dsx
PASS foobar

Et mon dovecot qui m'annonce fièrement:

Dec 19 11:39:00 auth: Fatal: No passdbs specified in configuration file. PLAIN mechanism needs one
Dec 19 11:39:00 master: Error: service(auth): command startup failed, throttling

Il doit manquer un truc ou deux:

dsx@mx81>sudo cp /usr/local/share/doc/dovecot/example-config/conf.d/10-auth.conf /usr/local/etc/dovecot/conf.d/
dsx@mx81>sudo /usr/local/sbin/dovecot -F -c /usr/local/etc/dovecot/dovecot.conf
doveconf: Fatal: Error in configuration file /usr/local/etc/dovecot/conf.d/10-auth.conf line 119: No matches
dsx@mx81>awk 'NR == 119 { print } ' /usr/local/etc/dovecot/conf.d/10-auth.conf
!include auth-system.conf.ext
dsx@mx81>sudo cp /usr/local/share/doc/dovecot/example-config/conf.d/auth-system.conf.ext /usr/local/etc/dovecot/conf.d/

Et maintenant:

dsx@mx81>telnet 172.16.0.9 110
Trying 172.16.0.9...
Connected to mx2.bsdsx.fr.
Escape character is '^]'.
+OK Dovecot ready.
USER dsx
+OK
PASS foobar
Connection closed by foreign host.

C'est rapide et sans appel:

Dec 19 11:47:09 pop3-login: Info: Login: user=<dsx>, method=PLAIN, rip=172.16.0.9, lip=172.16.0.9, mpid=43953, secured
Dec 19 11:47:09 pop3(dsx): Error: user dsx: Couldn't drop privileges: Mail access for users with GID 0 not permitted (see first_valid_gid in config file).
Dec 19 11:47:09 pop3(dsx): Error: Internal error occurred. Refer to server log for more information.

Tout s'explique, je suis dans le groupe wheel. Et il est où ce first_valid_gid ?

dsx@mx81>grep first_valid_gid /usr/local/share/doc/dovecot/example-config/conf.d/*
10-mail.conf:#first_valid_gid = 1
dsx@mx81>sudo cp /usr/local/share/doc/dovecot/example-config/conf.d/10-mail.conf /usr/local/etc/dovecot/conf.d/

Une fois first_valid_gid passé à 0, il faut croire que cela ne suffit pas:

Dec 19 12:06:35 pop3(dsx): Error: user dsx: Initialization failed: mail_location not set and autodetection failed: Mail storage autodetection failed with home=/home/dsx
Dec 19 12:06:35 pop3(dsx): Error: Invalid user settings. Refer to server log for more information.

Le format maildir me convient et une fois décommentée la ligne qui va bien dans 10-mail.conf:

dsx@mx81>telnet 172.16.0.9 110
Trying 172.16.0.9...
Connected to mx2.bsdsx.fr.
Escape character is '^]'.
+OK Dovecot ready.
USER dsx
+OK
PASS foobar
+OK Logged in.
STAT
+OK 0 0
QUIT
+OK Logging out.
Connection closed by foreign host.

Un petit mot concernant l'utilisation de cette jail. Elle sert de mailhub aux autres jails, je suis le seul à me connecter dessus, et j'utilise mutt avec un tunnel ssh . Donc les virtu-machins, les es-kuelles-trucs et ldap-pouet ce n'est pas pour moi. Avantage immédiat: pas besoin d'un dovecot tournant en permanence, donc des ports en écoute en moins et des ressources préservées. Par contre j'aime bien sieve. Pour l'utiliser il faut que dovecot délivre les courriels. Je suis aussi une loutre et même si le duo sendmail/dovecot est documenté, je garde la solution du .forward:

dsx@mx81>cat .forward
| "/usr/local/libexec/dovecot/deliver"

Il est temps de tester tout ça grandeur nature. Côté serveur:

dsx@mx81>echo "Acheter une audi rs6" | mail -s "TODO" dsx

Côté client:

dsx@linutop>cat .muttrc.hub 
set folder="imap://mx2.bsdsx.fr/"
set spoolfile="imap://mx2.bsdsx.fr/"
set tunnel="ssh -q mx2 /usr/local/libexec/dovecot/imap"
mailboxes =INBOX
# des explications un peu plus loin
mailboxes `ssh mx81 'cd Maildir && find . -type d -mindepth 1 -name ".*" | tr "\n." " /" | sed "s,///,=,g"'`
dsx@linutop>mutt -F .muttrc.hub 

Maintenant que tout roule, occupons-nous de sieve.

dsx@mx81> sudo pkg_add /tmp/dovecot-pigeonhole-0.2.1.tbz
[ snip ]
 protocol lda {
   # Support for dynamically loadable plugins. mail_plugins is
   # a space separated list of plugins to load.
   mail_plugins = sieve # ... other plugins like quota
 }
[ snip ]

Je ne vais pas être plus royaliste que le roy (oui je préfère cette orthographe). Je copie le bon fichier:

dsx@mx81>sudo cp /usr/local/share/doc/dovecot/example-config/conf.d/15-lda.conf /usr/local/etc/dovecot/conf.d/

Un coup de $EDITOR plus tard, je commence mon premier script sieve.

dsx@mx81>cat .dovecot.sieve
require "fileinto";
if header :contains "subject" "essai" {
    fileinto "junk";
} 
dsx@mx81>echo "essai sieve" | mail -s "essai" dsx
dsx@mx81>find $HOME/Maildir -type d -name junk
# wtf ?
dsx@mx81>cat .dovecot.sieve.log
sieve: info: started log at Dec 19 20:01:56.
error: msgid=<201012191901.oBJJ1uF2063206@mx81.bsdsx.fr>: failed to store into mailbox 'junk': Mailbox doesn't exist: junk.

Quelques googueulades et je comprends que dans sieve, la syntaxe des dossiers imap est de la forme INBOX.dossier, INBOX.dossier.sousdossier. Quant à mutt, il préfère =INBOX/dossier, =INBOX/dossier/sousdossier. Ces syntaxes expliquent la complexité de la ligne mailboxes de mon .muttrc.hub. Petite explication:

dsx@mx81>find . -type d -mindepth 1 -name ".*"
./.INBOX.porsche
./.INBOX.junk
dsx@mx81>find . -type d -mindepth 1 -name ".*" | tr "\n." " /" 
///INBOX/porsche ///INBOX/junk 
dsx@mx81>find . -type d -mindepth 1 -name ".*" | tr "\n." " /" | sed "s,///,=,g"
=INBOX/porsche =INBOX/junk 

Après quelques essais de porsche 964 carrera 4, audi rs6 v8 bi-turbo avant et autre ac cobra (oui j'ai une grande todolist), j'en viens à me demander si tous ces fichiers de conf pour dovecot sont bien utiles:

dsx@mx81>cat /usr/local/etc/dovecot/dovecot.conf
ssl = no
auth_mechanisms = plain
first_valid_gid = 0
mail_location = maildir:~/Maildir
protocol lda {
  mail_plugins = sieve
}
passdb {
  driver = pam
}
userdb {
  driver = passwd
}

C'est-y pas plus simple comme ça ? On peut aussi utiliser doveconf -n qui retourne peu ou prou la même chose.

Pour conclure, cette configuration n'est certes pas la plus courante mais elle convient bien à un type d'utilisation: la réception de courriels éphémères. Un alias subtilement associé à une régle sieve et voilà les missives en lecture seule (genre envoi d'url pour activer un compte) bien rangées là où il faut. Par exemple, si j'ai l'intention de créer un compte sur le site www.fesseplouk.42, je crée un alias fesseplouk et une règle sieve qui dit: si le destinataire est fesseplouk et que le domaine de l'expéditeur contient fesseplouk, alors ranger le courriel dans INBOX.fesseplouk; sinon ranger dans INBOX.spam.fesseplouk Car il n'y a aucune raison valable pour que cet alias reçoive quoi que ce soit de la part d'amafion.khaume. Et lycée de Versailles comme dirait mon ami Alexandre-Benoît Bérurier.

Ps: petit tips pour la route. Au lieu de faire le porkasse à coup de find + xargs + rm pour vider régulièrement des mailboxes, pourquoi ne pas utiliser doveadm ?

for i in liste de mailboxes a vider regulierement; do
    doveadm expunge mailbox INBOX.$i savedbefore 5w
done

Quand on dit que dovecot c'est amour !


Lien vers ce billet

15/12/2010

[ mohawk ]

201012152017 mohawk

Hugh, Mohawk !

Dans la grande famille des serveurs http, apache est celui qui vient le plus rapidement à l'esprit. Au détour d'articles publiés dans une revue de haute volée, cherokee n'est plus un inconnu. Si tu fréquentes le jardin magique, la température de tes serveurs a sûrement baissé grâce à nginx. Mais ami lecteur, connais-tu mohawk ?

mohawk est né du besoin d'un serveur http très léger supportant les cgi. Sur une base de mini_httpd, mon ami bapt et moi-même avons sorti nos tronçonneusestomahawks pour obtenir un résultat que je m'en vais te présenter.

Histoire de ne pas perdre de temps, mohawk est freebsd only. Oui, je sais, portabilité toussa mais que veux-tu, kqueue, sendfile et queue sont nos frères de sang. Au passage, c'est au minimum la version 8.1 qu'il te faudra utiliser/installer. C'est le seul pré-requis, pas besoin d'autre chose.

En parlant d'installation, tu peux récupérer les sources (un port est en chantier) ici puis invoquer l'esprit des sages:

make clean && make prereq && make

Les tests ont été fait sur arm, i386, ia64 et x64 donc, à moins d'utiliser une plateforme qui vienne de l'autre côté de l_eau_où_se_couche_le_soleil, pas de problème de compilation. A l'issue, tu peux jeter un oeil à /tmp/chroot, un répertoire créé par make prereq afin de pouvoir utiliser le fichier de configuration par défaut.

Fichier dont la syntaxe ressemble je l'espère à du doux_miel_des_collines_fleuries. Pour t'aider à la comprendre, le répertoire dump_conf est ton ami:

cd dump_conf && make clean && make && ./dump_conf ../mohawk.conf | $PAGER

Tu vas demander au chaman un petit coup de main avant de partir à la chasse:

sudo ./mohawk -d -c mohawk.conf

Et si l'homme_médecine pouvait rajouter ces 2 lignes dans /etc/hosts, ça serait pas plus mal:

127.0.0.1 bapt.example.com bsdsx.example.com

Vérifie que l'esprit des lutins guide tes flêches:

fetch -q -o - http://localhost:7777/
fetch -q -o - http://bapt.example.com:8888/bapt.html
fetch -q -o - http://bsdsx.example.com:7777/private/status
fetch -q -o - http://localhost:8888/directory
fetch -q -o - 'http://localhost:8888/non-exists/foo?bar=bar'
fetch -q -o - 'http://foo:bar@localhost:8888/private/private.html'

Tu peux maintenant poser une oreille sur les lignes_de_l_homme_blanc_qui_ne_se_croisent_jamais en adaptant la ligne suivante comme par exemple:

#listen on em0 port 6666
listen on vr0

Je te laisse décocher quelques traits depuis un autre tipi et si tu es convaincu, sache que notre papoose n'est pas encore aguerri:

Si toi aussi tu veux marcher une lune dans des mocassins mohawk, il te reste à copier rc.d/mohawk et mohawk.conf là où tu sais. N'oublie pas mime.txt ou tu sera rappelé à l'ordre. J'espère qu'un jour tu croisera dans les grandes plaines un fier guerrier orné de quelques boules de geisha. Hugh !


Lien vers ce billet