Postfix, Dovecot, et des utilisateurs virtuels sans Mysql

par souci de lisibilité et de référencement, j'ai finalement scindé mon précédent billet en deux: un sujet, un billet.

postfixUn petit mémo sur la façon de configurer postfix et dovecot pour héberger des domaines de mail multiples et virtuels, le tout sur une seule et même installation, sans passer par l'usine à gaz qu'est MySql (enfin, tant que vous n'avez pas des milliers d'utilisateurs)

Dans postfix

  • main.cf, la section qui autorise les domaines virtuels est la suivante:
virtual_mailbox_domains = hash:/etc/postfix/vdomains
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = hash:/etc/postfix/virtual_uids
virtual_gid_maps = hash:/etc/postfix/virtual_gids
### 200 Mo ( a peu pres )
virtual_mailbox_limit = 200000000
local_recipient_maps    = proxy:unix:passwd.byname $alias_maps $virtual_mailbox_maps

N'oubliez pas de postmaper les fichiers qui sont indiqués après hash:/ !!

  • vdomains est de la forme:
domain1.tld    pouet
domain2.tld    pouet
domain3.tld    pouet
  • vmailbox est de la forme:
#user@domain         domain/user/
user1@domain1.tld    domain1.tld/user1/
user2@domain2.tld     domain2.tld/user2/
  • virtuals_uids et virtual_gids sont de la forme:
#virtuals_gids
#grep -i vmail /etc/group
#@tutu.com   5000 (pour vmail)
#####################
@domain1.tld    5000
@domain2.tld    5000

C'est tout dans postfix. Il faut créer un utilisateur qui accédera aux Maildir. J'ai choisi de créer un user system vmail, d'uid:gid 5000:5000

Les mails seront distribués dans: /home/vmail/domain1.tld/user1/
Maintenant, nous devons permettre aux utilisateurs d'accéder à ces boites emails, et ça va être le travail de dovecot (best imap server ever!)

Dans dovecot

La configuration de dovecot, comme d'habitude, est hyper simple:

protocols = imaps
listen = *
disable_plaintext_auth = yes
log_path = /var/log/dovecot/dovecot.log
info_log_path=/var/log/dovecot/dovecot.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
login_greeting = ready....
auth default {
    mechanisms = plain cram-md5
    user = root
    userdb passwd-file {
        args = /etc/dovecot/dovecot.users
        }
    #fallback to PAM
    userdb passwd {
    }
        passdb passwd-file {
            args = /etc/dovecot/dovecot.users
            }
    #fallback to PAM
        passdb pam {
        }
            socket listen {
                client {
                    # Assuming the default Postfix $queue_directory setting
                    path = /var/spool/postfix/private/auth
                    mode = 0660
                    # Assuming the default Postfix user and group
                    user = postfix
                   group = postfix
                   }
    }
}
 
mail_extra_groups = mail
protocol imap {
}
protocol pop3 {
}
dict {
}
plugin {
}

Le fallback vers PAM me permet de supporter une phase de transition depuis des utilisateurs systèmes vers des utilisateurs virtuels, mais va disparaître sous peu.
Le truc important ici, c'est le fichier /etc/dovecot/dovecot.users, qui est en fait notre table de correspondance user, password, chemin vers le Maildir.
Il est de la forme:

user1@domain1.tld:{HMAC-MD5}12999732f70a30191be8c552bff077b3876d7a1fe89b9e61389b941ab598cf15:5000:5000::::userdb_mail=maildir:/home/vmail/domain1.tld/user1/
user2@domain2.tld:{HMAC-MD5}a91cbc2e844e773e464eb76786cebd6edd0c7baf5d64de09c8a4ed67851e961e:5000:5000::::userdb_mail=maildir:/home/vmail/domain2.tld/user2/

les passwords sont salés en HMAC-MD5 (ce qui n'est pas de la grande cryptographie, entendons nous bien, mais inutile de casser ceux là, ce sont des fakes), et générés avec la commande:
dovecotpw -p le_mot_de_passe

Bien sur, c'est fastidieux à faire à la main, alors voici un petit script qui ajoute un email de façon entièrement automatisée (lancez le script en root, répondez aux questions (nom, domaine, et mot de passe) et voila). Si par hasard vous vous en serviez (il est probablement très laid!), pensez à le lire, a comprendre ce qu'il fait, et à l'adapter à vos besoins, bien sur.

#!/usr/bin/perl
use strict;
use POSIX;
#script sous licence WTFPL http://sam.zoy.org/wtfpl/
# mathieu - http://blog.effraie.org/
#
#Créer un email pour un utilisateur
#tester que le script est lancé avec les droits root
my $uid = getuid();
if ($uid != 0) {
    print "Vous devez etre root pour lancer ce script.\n";
    exit(0);
    }
#récupérer le nom, le domaine, le pass
print "Nom du nouvel utilisateur mail:" . "\n";
my $name = <STDIN>;
chomp($name);
print "Domaine du nouveau mail:" . "\n";
my $domain = <STDIN>;
chomp($domain);
print "Mot de passe:" . "\n";
my $clear_pass = <STDIN>;
chomp($clear_pass);
my $newmail = "$name\@$domain";
#tests de base
die "Le nom domaine n'est pas défini." . "\n" unless ($domain);
die "Le nom n'est pas défini." . "\n" unless ($name);
die "Le mot de passe n'est pas valide." . "\n" unless ($clear_pass);
# vérifier la validité du domaine
my $test_domain = "grep $domain /etc/postfix/vdomains > /dev/null";
system($test_domain);
if ($? != 0) {
    print "le domaine n'est pas valide" . "\n";
    exit (0);
    }
# vérifier la validité du noveau mail
my $test_mail = "grep $name\@$domain /etc/postfix/vmailbox > /dev/null";
system($test_mail);
if ($? == 0) {
    print "Ce mail est déjà attribué" . "\n";
   exit (0);
    }
#saler le pass pour dovecot
my $salted_pass = `dovecotpw -p $clear_pass`;
chomp($salted_pass);
#ajouter le mail dans postfix
`echo "$newmail     $domain/$name/" | tee -a /etc/postfix/vmailbox && postmap /etc/postfix/vmailbox`;
#autoriser l'user dans dovecot
`echo "$newmail:$salted_pass:5000:5000::::userdb_mail=maildir:/home/vmail/$domain/$name/" | tee -a /etc/dovecot/dovecot.users`;
#redémarrer les services
`/etc/init.d/postfix reload && /etc/init.d/dovecot restart 2>&1 /dev/null`;
#envoyer un mail de bienvenue
`cat /home/effraie/scripts/welcome_mail | mail $newmail -s "Bienvenue sur $domain !"`;
print "le Mail $newmail a bien été créé, avec le pass: $clear_pass" . "\n";
exit (0);



Voila voila, ça n'a rien d'un tutoriel, c'est juste un petit mémo perso que je partage, dans l'hypothèse ou il puisse servir à quelqu'un (moi ça m'aurait bien aidé, heureusement, il y a Uggy).

Vos commentaires, sur la méthode, le script ou n'importe quoi d'autre, sont les bienvenus.

Vus : 1110
Publié par Effraie : 96