07/03/2020

Installation d’un serveur mail

[TOC]

Introduction

Bonjour, je vais vous montrer comment installer un serveur mail pour remplacer gmail, outlook ou autre. Ce serveur mail fonctionnera avec postfix et dovecot. L’administration des noms de domaines et des comptes se fera avec postfixadmin et le tout sera stocké dans une base sqlite. Vous pouvez aussi suivre le tutoriel en utilisant mysql au lieu de sqlite je l’ai déjà fait cependant pour un usage personnelle ou même pour vos proches sqlite est largement suffisant (et consomme beaucoup moins).

Technologies :

Installation

apt install wget dbconfig-common sqlite3 php-fpm php-cli php-mbstring php-imap php-sqlite3
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail -m

Nginx

apt install nginx
vim /etc/nginx/sites-available/postfixadmin
server {
   listen 80;
   server_name postfixadmin.mail.private;
   root            /var/www/postfixadmin-3.0;
   index           index.php;
   charset         utf-8;

   location / {
      try_files $uri $uri/ index.php;
   }

   location ~* \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include       fastcgi_params;
        fastcgi_pass  unix:/run/php/php7.3-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
   }
}
ln -s /etc/nginx/sites-available/postfixadmin /etc/nginx/sites-enabled/postfixadmin
systemctl restart nginx
systemctl enable nginx

PostfixAdmin

wget -q -O - "http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-3.0/postfixadmin-3.0.tar.gz" | tar -xzf - -C /var/www
chown www-data:www-data -R /var/www/postfixadmin-3.0

/var/www/postfixadmin-3.0/config.inc.php

$CONF['configured'] = true;
$CONF['database_type'] = 'sqlite';
$CONF['database_name'] = '/var/vmail/postfixadmin.db';
// $CONF['database_host'] = 'localhost';
// $CONF['database_user'] = 'postfix';
// $CONF['database_password'] = 'postfixadmin';

$CONF['domain_path'] = 'NO';
$CONF['domain_in_mailbox'] = 'YES';

Database

Tout ce que vmail à accès, www-data pourras aussi y accéder

usermod -a -G vmail www-data

Création de la base de données sqlite

touch /var/vmail/postfixadmin.db

Avec sqlite il faut donner les droits à www-data (nginx) sur le fichier mais aussi sur le dossier.

chown vmail:vmail /var/vmail/postfixadmin.db
chmod 774 /var/vmail/postfixadmin.db 
chmod 774 /var/vmail

Après cette étape faut tout relancer… Ok !

Navigateur http://postfixadmin.domain/setup.php

Alors perso je suis tombé sur l’erreur suivante : ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver

Avec un peu de recherche (merci LV1 l’allemand) et du débogage à foison, il faut simplement créer un dossier templates_c avec les droits pour www-data.

Voili voilou

Sur cette page, ajouter un admin en remplissant le formulaire. Si tout ce passe bien, il devrai apparaître dans la table admin de la base

L’erreur Connect: given database path does not exist, is not writable, or $CONF['database_name'] is empty.c’est un problème sur la base de données.

Suivez l’installation comme ça vous aurez un administrateur. Comme indiqué vous pourrez vous connecter sur la page login.php

Ajouter un domaine

abuse est un alias qui permet de signaler un spam en provenance d’un domaine.

Et vous pouvez aussi vous créer une boite mail dans add mailbox.

Postfix

apt install postfix postfix-sqlite libsasl2-modules sasl2-bin

Faut mettre site internet.

Configuration

Le fichier de configuration est /etc/postfix/main.cf. Nous allons mettre chaque requête dans un sous-fichier et ajouter un lien dans le fichier principal.

Domaines

/etc/postfix/sqlite_virtual_mailbox_domains.cf

dbpath = /var/vmail/postfixadmin.db
query = SELECT 1 FROM domain WHERE domain='%s' AND active = '1'

Pour l’activer :

Cette commande va ajouter la configuration au fichier principal /etc/postfix/main.cf.

postconf -e virtual_mailbox_domains=sqlite:/etc/postfix/sqlite_virtual_mailbox_domains.cf

Pour tester :

postmap -q arkalo.ovh sqlite:/etc/postfix/sqlite_virtual_mailbox_domains.cf

Ici la requête doit juste renvoyer quelque chose (ici 1)

Boite mail

/etc/postfix/sqlite_virtual_mailbox_maps.cf

dbpath = /var/vmail/postfixadmin.db
query = SELECT 1 FROM mailbox WHERE username='%s'

Pour l’activer :

postconf -e virtual_mailbox_maps=sqlite:/etc/postfix/sqlite_virtual_mailbox_maps.cf

Pour tester :

postmap -q omer@arkalo.ovh sqlite:/etc/postfix/sqlite_virtual_mailbox_maps.cf

Alias

/etc/postfix/sqlite_virtual_alias_maps.cf*

dbpath = /var/vmail/postfixadmin.db
query = SELECT goto FROM alias WHERE address='%s'

pour l’activer :

postconf -e virtual_alias_maps=sqlite:/etc/postfix/sqlite_virtual_alias_maps.cf

pour tester :

postmap -q omer@arkalo.ovh sqlite:/etc/postfix/sqlite_virtual_alias_maps.cf 

Le port 587

Le port 25 est considéré comme spam (par les FAI) donc on met le port 587 à la place.

Pour pouvoir faire ça, il faut dé-commenter cette ligne dans la config

/etc/postfix/master.cf

submission inet n       -       -       -       -       smtpd

SASL

J’ai pas encore bien compris ce que c’est mais ça permet de ne pas se faire trop spammer.

Toujours dans le fichier /etc/postfix/main.cf ajouter :

Virer le arkalo.ovh de mydestination

et ajouter

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

/etc/default/saslauthd

START=yes
systemctl restart saslauthd

Dovecot

Dovecot sert à recevoir de postfix les mails et les ranger comme il faut.

Installation

apt install dovecot-imapd dovecot-lmtpd dovecot-pop3d dovecot-sqlite dovecot-pop3d dovecot-managesieved

Configuration

La configuration de dovecot se situe dans le répertoire /etc/dovecot/conf.d/

Authentification

Alors si j’ai bien compris, dovecot utilise des utilisateurs linux. Mais nous c’est login mot de passe dans la base de données. Du coup /etc/dovecot/conf.d/10-auth.conf

auth_mechanisms = plain login
...
!include auth-sql.conf.ext

Et ensuite dans le fichier auth-sql.conf.ext

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

Mail

10-mail.conf :

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

Master

10-master.conf :

# smtp-auth de postfix
unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
}

J’avais pas trop pigé au début mais mode c’est les droits mais le 0 au début je sais pas…

SSL

Générer des certificats

openssl req -new -x509 -days 3650 -nodes -newkey rsa:4096 -out /etc/ssl/certs/mailserver.pem -keyout /etc/ssl/private/mailserver.pem

10-ssl.conf

ssl_cert = </etc/ssl/certs/mailserver.pem
ssl_key = </etc/ssl/private/mailserver.pem

Et pensez à mettre

ssl = yes

Normalement il y a déjà cette option mais bon…

LDA

15-lda.conf

protocol lda {
    # Space separated list of plugins to load (default is global mail_plugins).
    mail_plugins = $mail_plugins sieve
}

sieve est un plugin qui permet de mettre les fichiers au bon endroit

PTDR ça commence à devenir chaud à comprendre là wesh !

SQL

/etc/dovecot/dovecot-sql.conf.ext

driver = sqlite
...
connect = /var/vmail/postfixadmin.db
...
password_query = SELECT username,domain,password FROM mailbox WHERE username='%u';
systemctl restart dovecot

Normalement à cette étape dovecot et postfix sont lancé et fonctionne :

systemctl status postfix
systemctl status dovecot

Si c’est le cas, il faut juste que quand postfix reçoit un mail il le dise à dovecot de le stocker.

Ajouter ces ligne dans /etc/postfix/master.cf

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

Attention c’est deux espace avant flags (comme ces P***** de M**** de fichier yaml)

systemctl restart postfix

Ensuite on applique cette conf à postfix (tu connais maintenant oh !) :

postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1

J’ai eu un bug : Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission denie))

En cherchant un peu sur internet, j’ai trouvé ceci : Rajouter à la fin dans /etc/dovecot/dovecot.conf c’est un peu le bordel mais bon…

service stats {
  unix_listener stats-reader {
    user = vmail
    group = vmail
    mode = 0660
  }

  unix_listener stats-writer {
    user = vmail
    group = vmail
    mode = 0660
  }
}

Voilà…

Les tests

Maintenant testouillons tout ça !

Normalement à cette étape vous pouvez envoyer un mail :

echo test | mail omer@arkalo.ovh

Et le recevoir dans /var/vmail/arkalo.ovh/omer/Maildir/new

Les log postfix ne se sont pas affiché au début /var/log/mail.log, j’ai trouvé sur un forum qui fallait installer le paquet rsyslog

apt install rsyslog

Récupérer les mails

Voila la configuration que j’ai mis en place pour Thunderbird : En réception, IMAPS :

serveur : example.com
port : 143
nom d'utilisateur : user@example.com
sécurité : StartTLS
Méthode d'authentification : Mot de passe normal

En envoi :

serveur : example.com
port : 587
nom d'utilisateur : user@example.com
sécurité : StartTLS
Méthode d'authentification : Mot de passe normal

Dans un conteneur lxc il faut NATER les ports 587 143 et 25 Comme d’habitude j’ai fait ça avec iptables :

iptables -t nat -A PREROUTING -i enp1s0 -p tcp --dport 25 -j DNAT --to 10.0.30.11:25
iptables -t nat -A PREROUTING -i enp1s0 -p tcp --dport 143 -j DNAT --to 10.0.30.11:143
iptables -t nat -A PREROUTING -i enp1s0 -p tcp --dport 587 -j DNAT --to 10.0.30.11:587

iptables a trouvé tout seul le nom des protocoles et ouiii !!!!!

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp dpt:submission to:10.0.30.11:587
DNAT       tcp  --  anywhere             anywhere             tcp dpt:imap2 to:10.0.30.11:143
DNAT       tcp  --  anywhere             anywhere             tcp dpt:smtp to:10.0.30.11:25

Ah oui aussi ! Dans le DNS J’ai rajouté une une entrée : IN MX 10 arkalo.ovh

Tester si votre ip est ban :