Serveur de mail Postfix, mysql, dovecot, amavis

bigpicture

Serveur de mail Postfix, mysql, dovecot, amavis

Ici nous verrons la mise en place d’un serveur de mail avec Postfix , mysql (pour la gestion des alias, des domaines et des users) et enfin dovecot comme MDA pour la livraison des mails dans les boites . Après tout ceci on verra comment traiter le spam , analyse antivirale , et pour compléter le tout un webmail.

Étant donné que cela risque d’être assez long je traiterais de la partie cryptage spam et antivirus un peu plus tard. (Pour ceux que cela intéresse j’ai pas mal utilisé le site de workaround donc la quasi totalité de la configuration ici présente et aussi détaillé ici en anglais. Cet article servira surtout de support au moins anglophones d’entre nous mais également ceux qui souhaite avoir de plus ample détails sur certaines options.

Vous pouvez également vous rendre sur l’irc serveur===>Freenode et choisir le channel (dovecot, debianfr , postfix )

Je vous conseil d’aller faire un petit tour sur wikipédia pour la compréhension des MTA,MDA

Pour commencer nous allons devoir récupérer tout ce dont nous avons besoins à la configuration de notre serveur de mail .

Attention cette documentation avait été faites sur une Debian Lenny , sur Squeeze ceratisn paramètres changent surtout dans dovecot .

apt-get install postfix postfix-mysql mysql-server dovecot-imapd dovecot-pop3d

Nous commençons par créer l’utilisateur qui aura accès à la base de donnée que nous allons créer . Vous pourrez utiliser soit Phpmyadmin ou directement la ligne de commande.

Si vous êtes moins à l’aise avec la ligne de commande Mysql

apt-get install phpmyadmin

Avant de commencer nous créeons l’utilisateur vmail et le groupe vmail

groupadd -g 5000 vmailuseradd -g vmail -u 5000 vmail -d /var/vmail -m

On se connecte à la base de donnée avec le compte root pour le moment

mysql -u root -p

Un password vous sera demandé
Si c’est votre première connexion le password est vide

mysql > create database mailserver;

On donne les droits Select

mysql > GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'password'; => Personnellement je génère un paswword avec apg voir le billet précédent.

Nous allons commencer par créer nos tables mysql pour le stockage de nos utilisateurs de nos domaines mais également des alias
Nous créeons la table qui contiendra les domaines virtuels

mysql > CREATE TABLE `virtual_domains` (  `id` int(11) NOT NULL auto_increment,  `name` varchar(50) NOT NULL,  PRIMARY KEY  (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql >CREATE TABLE `virtual_users` (  `id` int(11) NOT NULL auto_increment,  `domain_id` int(11) NOT NULL,  `password` varchar(32) NOT NULL,  `email` varchar(100) NOT NULL,  PRIMARY KEY  (`id`),  UNIQUE KEY `email` (`email`),  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql > CREATE TABLE IF NOT EXISTS `virtual_aliases` (`id` int(11) NOT NULL auto_increment,`domain_id` int(11) NOT NULL,`source` varchar(100) NOT NULL,`destination` varchar(100) NOT NULL,PRIMARY KEY  (`id`),FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Maintenant que cela est fait nous devons créer les fichier qui permettront à postfix de se connecter à notre base
On commence par créer le fichier :

/etc/postfix/mysql-virtual-mailbox-domains.cf

On y ajoute :
;

user = mailuser
password = Votre password créer par APG si s'était le cas. 
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Puis nous ajoutons cette ligne dans le fichier main.cf de postfix

virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Nous créons un second fichier

/etc/postfix/mysql-virtual-mailbox-maps.cf

On y ajoute :

user = mailuser
password = Votre password créer par APG si s'était le cas. 
hosts = 127.0.0.1
dbname = mailserver 
query = SELECT 1 FROM virtual_users WHERE email='%s'

Puis nous ajoutons cette ligne dans le fichier main.cf de postfix

virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Nous créeons un troisième fichier/etc/postfix/mysql-virtual-alias-maps.cfOn y ajoute :

user = mailuser
password = Votre password créer par APG si s'était le cas.
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'

Pour terminer nous créeons

/etc/postfix/mysql-email2email.cf

On y ajoute :

user = mailuser
password = Votre password créer par APG si s'était le cas.
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'

On ajoute ceci dans notre main.cf

virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf

On donne les droits nécessaire sur les fichiers que l’on vient de créer nous faisons cela pour que d’autre utilisateur n’est pas accès à des informations sensibles telles que les mots de passe de connexion à notre base de donnée.

chgrp postfix /etc/postfix/mysql-*.cfchmod 640 /etc/postfix/mysql-*.cf.

Passons maintenant à dovecot => Dovecot s’occupe de la livraison des mails dans votre boite aux lettres
On ajoute cette ligne dans le master.cf de postfix

dovecot   unix  -       n       n       -       -       pipe    flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Puis on rajoute les deux lignes suivantes dans le fichier main.cf

virtual_transport=dovecot
dovecot_destination_recipient_limit=1

Le paramètre dovecot_destination_recipient_limit=1 permet de recevoir des mails à destination de plusieurs destinataires .

Maintenant il faut passer à la configuration de dovecot.
Cela se passe dans /etc/dovecot/dovecot.conf

base_dir = /var/run/dovecot/protocols = imaps pop3s pop3 imap ====> Les protocoles pris en charge
ssl_cert_file = /etc/ssl/certs/popimap.crt ====> Notre certificat 
ssl_key_file = /etc/ssl/private/popimap.key ====> Notre certificat 
disable_plaintext_auth = yes
log_timestamp = "%Y-%m-%d %H:%M:%S "
ssl_listen = ====> Correspond à l'interface d'écoute si vide écoute sur toutes les interfaces 
verbose_ssl = yes
ssl_disable = no ====> Activation du SSL 
disable_plaintext_auth = yes ====> Authentification crypté 

mail_location = maildir:/var/vmail/%d/%n/Maildir 

namespace private { 	
separator = .	
prefix = INBOX.	
inbox = yes
}

mail_privileged_group = mail

mail_debug = yes

first_valid_uid = 1029

protocol imap {	
ssl_cert_file = /etc/ssl/certs/popimap.crt	
ssl_key_file = /etc/ssl/private/popimap.key
}

protocol pop3 {  
pop3_uidl_format = %08Xu%08Xv	
ssl_cert_file = /etc/ssl/certs/popimap.crt	
ssl_key_file = /etc/ssl/private/popimap.key
}

protocol managesieve {  
sieve=~/.dovecot.sieve  
sieve_storage=~/sieve
}

protocol lda {    
log_path = /var/vmail/dovecot-deliver.log    
auth_socket_path = /var/run/dovecot/auth-master    
postmaster_address = [email protected]    
mail_plugins = cmusieve
}

auth_verbose = yes
auth default {  
mechanisms = plain login cram-md5    
passdb sql {    args = /etc/dovecot/dovecot-sql.conf  
}  
userdb passwd {  }

userdb static {    
args = uid=5000 gid=5000 
home=/var/vmail/%d/%n 
allow_all_users=yes
}

  userdb sql {    
args = /etc/dovecot/dovecot-sql.conf ====> C'est notre fichier de conf pour les requêtes mysql  
}

  user = root

socket listen {    
master {        
path = /var/run/dovecot/auth-master        
mode = 0600        
user = vmail   
 }
client {        
path = /var/spool/postfix/private/auth       
 mode = 0660        
user = postfix        
group = postfix    
}
}
}

Le fichier ci dessus autorise uniquement la réception des mails pour les clients utilisant SSL . Dans mon exemple même si protocols = pop3 et imap qui ne sont pas sécurisé le fait de mettre:

ssl_disable = no
disable_plaintext_auth = yes

C’est deux options obligent les clients à utiliser le mode SSL de leur client mail. Vous me direz alors pourquoi ne pas désactiver cela tout simplement. Par la suite nous verrons cela avec la configuration de squirrelmail (qui pour l’instant me pose quelques problèmes) et que je n’ai pas encore trouvé de solution mis à part en passant par imap et non imaps.
Il nous suffit de relancer dovecot

/etc/init.d/dovecot restart

Pour vérifier que notre configuration est bonne :

netstat -nap |grep login
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      26916/imap-login
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      27886/pop3-login
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      27886/pop3-login
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      26916/imap-login
0.0.0.0:993 ====> IP:Port d'écoute

Nous avons vu juste au dessus qu’il fallait configurer le fichier dovecot-sql.conf afin de permettre à dovecot de pouvoir interroger notre base de donnée on édite le fichier si il n’existe pas on le crée et on y colle ceci :

driver = mysqlconnect = host=127.0.0.1 
dbname=mailserver 
user=mailuser 
password= (Celui générer avec apg)
default_pass_scheme = PLAIN-MD5 
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

On relance une dernière fois dovecot. Il faut maintenant mettre les bons droits sur le fichier dovecot.conf

chown root:vmail dovecot.conf
chmod 644 dovecot.conf

Pour clôturer cette étape il nous faut générer notre clé certificat :

openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/popimap.pem  -keyout /etc/ssl/private/popimap.pem

On peut maintenant essayer notre configuration. Soit en telnet soit avec un client de messagerie.

Pour voir le certificat récupérer : Edition => Préférences => Avancés => Certificats => Voir les certificats => SiteWeb

Je continuerais l’article petit à petit en fonction de mon temps libre (les vacances sont malheureusement finis 🙁 depuis deux semaines , le temps se fait de moins en moins rare).

La on peut recevoir des mails mais pas en envoyer c’est bien dommage. Voici pour vous.

Maintenant que l’on peut recevoir et emettre des mails il faut être sur de ne pas recevoir une demande de [email protected] qui dis que son grand pére anglais lui a laissé de l’argent sur un compte en chine 🙂 bref , mais également des virus. Pour ca nous allons utilisé AMAVIS.
Amavis sert à faire l’interconnection entre votre serveur smtp et le traitement des mails ( spam , antivirus ) . Avant tout on crée un utilisateur :

adduser clamav amavis

On commence par éditer le fichier 15-content_filter_mode et on décommente les lignes suivantes :

@bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); @bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
/etc/amavis/conf.d/

On y ajoute :

$sa_spam_subject_tag = undef;

$spam_quarantine_to  = undef;
$sa_tag_level_deflt  = undef;
$final_spam_destiny  = D_PASS;
1;  # ensure a defined return

@lookup_sql_dsn = (    ['DBI:mysql:database=votrebdd;host=127.0.0.1;port=3306',     'userdb',     'PasswordApg']);

$sql_select_policy = 'SELECT name FROM virtual_domains WHERE CONCAT("@",name) IN (%k)';

Comme dis plus haut Amavis sert à interconnecter notre MTA au système de traitement des virus et des spams. Pour cela dans le main.cf de Postfix il y a une option qui permet d’envoyer les mails qui arrivent vers Amavis .

content_filter=smtp-amavis:[127.0.0.1]:10024 
receive_override_options=no_address_mappings

Et ceci dans notre master.cf

smtp-amavis unix -      -       n     -       2  smtp    
-o smtp_data_done_timeout=1200    
-o smtp_send_xforward_command=yes    
-o disable_dns_lookups=yes    
-o max_use=20

127.0.0.1:10025 inet n  -       -     -       -  smtpd    
-o content_filter=    -o local_recipient_maps=    
-o relay_recipient_maps=    
-o smtpd_restriction_classes=    
-o smtpd_delay_reject=no    
-o smtpd_client_restrictions=permit_mynetworks,reject    
-o smtpd_helo_restrictions=    
-o smtpd_sender_restrictions=    
-o smtpd_recipient_restrictions=permit_mynetworks,reject    
-o smtpd_data_restrictions=reject_unauth_pipelining    
-o smtpd_end_of_data_restrictions=    
-o mynetworks=127.0.0.0/8    
-o smtpd_error_sleep_time=0    
-o smtpd_soft_error_limit=1001    
-o smtpd_hard_error_limit=1000    
-o smtpd_client_connection_count_limit=0    
-o smtpd_client_connection_rate_limit=0    
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks    
-o local_header_rewrite_clients=

On redémarre les services ( amavis , postfix et clamav ) Maintenant que nous avons fait tout ca il existe une petite procédure afin de tester tout cela c’est ici. Suite à ce test dans vos logs vous devez avoir une ligne de ce type

Jan 24 11:26:37 serveur amavis[7877]: (07877-08) Blocked INFECTED (Eicar-Test-Signature), LOCAL [192.168.xxx.xxx] [192.168.xxx.xxx]  -> , quarantine: A/virus-Az9fqj8yJvTK, Message-ID: <[email protected]>, mail_id: Az9fqj8yJvTK, Hits: -, size: 1032, 723 ms

On voit ici que le mail a été mis en quarantaine ( Le seul problème c’est que l’expéditeur n’a pas été averti que le mail n’a pas été transmit je ne sais pas encore pourquoi il faut que je revois la conf de Amavis ) . C’est déjà mieux vous avez un serveur de mail et qui en plus permet de traiter les virus et les spams , mais se serait encore mieux si vous y aviez accès via webmail 🙂 . Pour la suite je vais continuer dans un nouveau billet car cette page me semble déjà assez chargé , pour ne pas vous effrayer 😉

Vous pouvez avoir ce message d’erreur dans vos logs :

Aug  6 11:53:53 mailserver /usr/sbin/amavisd-new[2367]: (02367-03) (!)run_av (ClamAV-clamd) FAILED - unexpected , output="/var/lib/amavis/tmp/amavis-20130806T112300-02367-WUlZg9_z/parts: lstat() failed: Permission denied. ERROR\n"

Pour corriger ceci rien de plus simple

# adduser clamav amavis
Ajout de l'utilisateur « clamav » au groupe « amavis »...
Ajout de l'utilisateur clamav au groupe amavis
Terminé.

Related posts

Leave a Comment