Jonathan’s Blog

un blog pas comme les autres …

Mon installation debian chez OVH

December 4th, 2007 by eCliPs

Postfix + Courrier avec MySQL

On va installer postfix avec domaines et utilisateurs virtuels facilement gerable grace a phpmyadmin et une simple base de données.
apt-get install postfix postfix-mysql postfix-doc courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl postfix-tls libsasl2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql phpmyadmin
On doit répondre à quelques questions, voici les réponses:
Create directories for web-based administration ? <-- No
General type of configuration? <-- Internet Site
Mail name? <-- nsxxxxx.ovh.net
SSL certificate required <-- Ok

Puis on installe les outils suivants:
apt-get install fakeroot debhelper libgdbm-dev libldap2-dev libpcre3-dev libsasl2-dev postgresql-dev po-debconf dpatch libdb4.3-dev libmysqlclient15-dev lsb-release libcdb-dev

On doit appliquer un patch pour quota a postfix donc on récupère la source
cd /usr/src
apt-get source postfix

on vérifie notre version de postfix
postconf -d | grep mail_version
et on recupere le bon patch pour quota, on l’applique, on crée nos packages et on les installe
wget http://vda.sourceforge.net/VDA/postfix-2.3.8-vda.patch.gz
gunzip postfix-2.3.8-vda.patch.gz
cd postfix-2.3.8
patch -p1 < ../postfix-2.3.8-vda.patch
dpkg-buildpackage
cd ..
dpkg -i postfix_2.3.8-2_i386.deb
dpkg -i postfix-mysql_2.3.8-2_i386.deb

On crée la base de données MySQL et ses utilisateurs (on doit utiliser le password précédement défini pour le compte root de mysql)
mysqladmin -u root -p create mail
mysql -u root -p

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;

USE mail;
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;
CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
quit;

on passe au fichiers de configuration
vi /etc/postfix/mysql-virtual_domains.cf
le contenu:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_forwardings.cf
le contenu:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_mailboxes.cf
le contenu:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_email2email.cf
le contenu:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_transports.cf
le contenu:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT transport FROM transport WHERE domain='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf
le contenu:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT quota FROM users WHERE email='%s'
hosts = 127.0.0.1

On cree un user vmail et on change les droits des fichiers
chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Encore un petit peu de configuration
postconf -e 'myhostname = ns28885.ovh.net'
postconf -e 'mydestination = localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_mailbox_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = "The user you are trying to reach is over quota."'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'

On crée un certificat SSL, on reponds au question et on met le nom de notre serveur pour common name (nsxxxxx.ovh.net)
cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
chmod o= /etc/postfix/smtpd.key

on configure saslauthd
mkdir -p /var/spool/postfix/var/run/saslauthd
vi /etc/default/saslauthd

on met
START=yes
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Encore et encore des fichiers de config …
vi /etc/pam.d/smtp
contenu:
auth required pam_mysql.so user=mail_admin passwd=mail_admin_s3cureCOD3 host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_s3cureCOD3 host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

vi /etc/postfix/sasl/smtpd.conf
Contenu:
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: select password from users where email = '%u'

La config de courier maintenant
vi /etc/courier/authdaemonrc
on change authmodulelist=”authpam” en authmodulelist=”authmysql”

allez encore un dernier fichier !
cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
cat /dev/null > /etc/courier/authmysqlrc
vi /etc/courier/authmysqlrc

et son contenu
MYSQL_SERVER localhost
MYSQL_USERNAME mail_admin
MYSQL_PASSWORD mail_admin_password
MYSQL_PORT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD
MYSQL_QUOTA_FIELD quota

Voila. Il nous reste plus qu’à redémarrer le tout
/etc/init.d/postfix restart
/etc/init.d/saslauthd restart
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Ha oui il faut aussi modifier le fichier aliases
vi /etc/aliases
on modifie juste la ligne root et postmaster comme ca:
postmaster: root
root: postmaster@nsxxxxx.ovh.net

Puis on tape:
newaliases
/etc/init.d/postfix restart

Pages: 1 2 3 4 5

Posted in linux, tutorials

17 Responses

  1. harraken

    Superbe!
    Nervous eCliPs!

  2. Setup debian ovh - Firewall | Jonathan’s Blog

    [...] 2 petits post qui vont venir completer mon premier post sur mon installation debian chez ovh. Le premier tout de suite avec la configuration d’un firewall simple pour notre [...]

  3. Setup debian ovh - monitoring | Jonathan’s Blog

    [...] promis voici le 2èm post de la journée pour compléter le tutorial d’installation d’une machine debian chez ovh. Nous venons juste de voir comment installer et configurer un firewall pour protéger notre [...]

  4. Didier

    Très bien fait ce document!

    Une question:

    Comment configurer Bind9 (Debian 4) pour un nom de domaine en .fr par exemple “domaine.fr” tout en utilisant le serveur dédié du client(OVH) comme DNS primaire?

  5. eCliPs

    POur configurer bind9 avec n’importe quel domaine c’est assez simple:

    Tout d’abord il faut creer un fichier de zone pour ce domaine.
    En general je creer le repertoire /etc/bind/zones/master dans lequel je depose tous mes fichiers de zone puis je creer un fichier example.fr.hosts dans ce repertoire.

    on edite le fichier et voici le contenu:

    example.fr. IN SOA example.fr. webmaster.example.fr. (
    2008010601
    21600
    3600
    604800
    86400 )
    IN NS nsxxxxx.ovh.net.
    IN NS sdns1.ovh.net.
    IN MX 10 mail.example.fr.
    IN A IP.DE.TA.MACHINE
    www IN A IP.DE.TA.MACHINE
    mail IN A IP.DE.TA.MACHINE
    smtp IN A IP.DE.TA.MACHINE
    pop IN A IP.DE.TA.MACHINE
    pop3 IN A IP.DE.TA.MACHINE
    imap IN A IP.DE.TA.MACHINE
    sql IN A IP.DE.TA.MACHINE
    mysql IN A IP.DE.TA.MACHINE

    ensuite il suffit de rajouter cette zone a la fin du fichier /etc/bind/named.conf/local

    zone “example.fr” {
    type master;
    file example.fr.hosts”;
    };

    Voila on redemarre bind et c’est ok
    /etc/init.d/bind9 restart

  6. Olivier

    Excellent.Merci pour ce tutorial.

    Au cas où voici un point où j’ai un peu galéré :

    J’avais mis dans /etc/hosts.deny : ALL:ALL

    Résultat, les fichiers de ce tutoriel utilisant “127.0.0.1″ pour mysql, rien ne fonctionnait. Il a fallu ajouter un “mysqld : LOCAL”.

    Ca peut paraitre bête mais avec “localhost” ceci n’est pas nécessaire et d’habitude je ne le met pas.

    Merci.

  7. jim

    Merci pour ce tuto !

    Je suis novice et j’ai un petit souci avec mysql :

    mysqladmin -h 127.0.0.1 -u root password votrepassmysqlroot

    error: ‘Access denied for user ‘root’@'localhost’ (using password: NO)’

    Le mot de passe root fonctionne bien si je tape : mysql -u root mysql -p

    Je me connecte à mysql sans problème.

    Savez-vous pourquoi ?

    Cordialement,

    Jim

  8. eCliPs

    Tout est ok. Si la commande te retourne ce message: error: ‘Access denied for user ‘root’@’localhost’ (using password: NO)’

    ca veut dire qu’un mot de passe a deja ete defini pour le user root donc pas de soucis :)

  9. Kal Abdi

    Un grand merci pour ce tuto clair net et précis :)

    Ca a marché du 1er coup pour moi

    Kal

  10. Marc

    Bonjour, merci pour tout ce petit tuto bien sympa !

    Malheureusement apres avoir suivi les instructions je me retrouve avec un probleme de creation de repertoire, par defaut le repertoire /home/vmail se crée sans soucis, mais le probleme est les sous dossier /home/vmail/nsxxxxx.ovh.net/webmaster par exemple
    apres les avoir crée manuellement
    le log me retourne le message suivant : May 5 20:39:52 ks30989 postfix/master[3171]: fatal: /etc/postfix/master.cf: line 77: bad transport type: smtp_data_done_timeout=1200

    et bien sur lorsque je veux lire les mail par pop il me retourne cela
    May 5 20:42:16 ks30989 courierpop3login: LOGIN, user=webmaster@nsxxxxxx.ovh.net, ip=[::ffff:]
    May 5 20:42:16 ks30989 courierpop3login: scancur opendir(”cur”): No such file or directory

    merci de votre aide

  11. eCliPs

    Bonjour,
    Peut tu me coller ton fichier master.cf ?
    De plus tu n’avias pas a creer les erpertoire a la main (a part /home/vmail)
    Les repertoires se cree seul a la reception du premier message.
    Ce que tu dois faire c’est desuite apres la creation d’un domaine+ compte, envoyer un email a ce compte pour creer les repertoires et ouvrir la boite.

    Jonathan

  12. бйлут

    Marc,

    Essaye en ajoutant ça dans ta base MySQL:
    insert into transport values(”domain”,”virtual:”);

  13. fred

    bonjour
    de mon coté pas de probleme avec postfix mais impossible de s’authentifier avec courier que se soit en imap ou en pop malgres l’existence du repertoire (pour info mysql5)
    fred

  14. eCliPs

    Fred -> as-tu bien utiliser la fonction ENCRYPT sur las passwdord de ton compte mail dans la base de donnees ?
    avec phpmyadmin tu dois utiliser ENCRYPT sur le champ password de la table users

  15. patou

    Même pb que fred, je n’arrive pas à m’authentifier sur le POP, et j’ai bien utiliser ENCRYPT lors de la création du user dans MySQL

  16. Accélérer Wordpress - Partie 4 - Installer des caches | Yann "Bug" Dubois

    [...] fois eAccelerator installé (sous Debian, en quelques minutes comme détaillé ici en français sur le Jonathan’s Blog), configuré et testé, l’installation optionnelle du Plugin eAccelerator pour Wordpress de [...]

  17. Configurer un serveur dédié OVH/Kimsufi/Debian pour LAMP | Yann "Bug" Dubois

    [...] Mon installation debian chez OVH | Jonathan’s Blog [...]

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.