Comment ça, version 3 alors que je n'ai jamais fini la 2 ?
C'est comme ça… Le bordel sur l'autre page ne me plaisait pas.
Une partie est liée à des scripts bash/ansibles.
Concernant les domaines :
poste.example.org sera le relai mail (ce qu'on paramètre en priorité ici)example.org sera le nom de domaine du mail, avec des adresses en machin@example.orgTODO : lvm, lien vers paramétrage des trucs de base.
C'est définitivement mieux de le faire en amont. Ça laisse le temps que ça se propage et de voir les erreurs. De toute façon, bosser sans vrai nom de domaine va être une belle galère.
Il faut :
Quelque chose dans ce genre, dans la zone DNS :
poste.example.org. IN A a.b.c.d poste.example.org. IN AAAA 2001:a::b example.org. IN MX 10 poste.example.org.
Le faire sur ipv6 si possible… Aujourd'hui tous les serveurs devraient le permettre, mais dans les faits, ça dépend entièrement du bon vouloir du fournisseur. Pas évident de savoir en amont, sauf à déjà avoir des machines chez ce fournisseur et accès à l'interface d'administration.
Quand on monte un serveur mail en local, cela dépend du FAI, mais aussi des capacités de la box.
Pour MX, une priorité plus basse veut dire que ce sera choisi en premier. Donc si on a un relai paramétré à 10 et un second à 20, le courrier sera d'abord envoyé à 10. Si plusieurs relais ont le même chiffre, ça sera l'un ou l'autre. On verra dans un autre document comment mettre un relai backup MX (qui permet de récupérer les mails si notre relai principal tombe, et de lui renvoyer quand il revient) ; quand à avoir deux serveurs mails qui peuvent envoyer et recevoir, c'est sacrément plus complexe donc on va laisser ça de côté pour un bon moment1).
Il faut aussi configurer son Reversedns et ça, c'est permis ou non par l'hébergeur (dans l'interface web de gestion de la machine). La machine prend le “nom” du serveur mail.
Ensuite, pour tester :
dig +short -x "a.b.c.d" @9.9.9.9 dig +short -x "2001:a::b" @9.9.9.9
L'un et l'autre doivent donner le nom de domaine configuré pour les ip en question. Le “@9.9.9.9” à la fin permet de passer par l'extérieur, si on teste en local sur un ordi local, dig ne retourne rien…
Il faut que certains ports soient accessibles avec internet.
Suivant la configuration, il faut ouvrir ces ports explicitement sur la machine, et potentiellement aussi sur un proxy ou la box avec redirection vers les ports du serveur. On ouvre les ports sur le proxy quand tout le reste est fini… Ça évite d'exposer une machine en cours de paramétrage.
Certains sont non-chiffrés :
Et d'autres pour les échanges chiffrés :
Et suivant les besoins :
En réalité on ne va ouvrir que ceci sur le nftables de la machine : 25, 587, 993, 4190. Oublions POP, l'IMAP en non-chiffré, et préférons SMTP-TLS2).
Avec la config paramétrée dans nftables, ce qu'il faut modifier/surveiller :
/etc/nftables.d/30-fight.nft : Protection contre le SMTP/Email Bombing, vérifier si ça ne bloque pas des serveurs légitimes./etc/nftables.d/40-confperso.nft : Autoriser en entrée 80, 443, 25, 587, 993, 4190 (encore que les deux premiers, uniquement si on a des outils de gestion web sur le serveur même ? mais c'est mon cas…))./etc/nftables.d/50-output.nft : Autoriser en sortie 25, 465, 587 (TODO : J'ai un petit doute sur SIEVE, on vérifiera…).Vérifier que /etc/hosts a un nom de domaine cohérent (si renseigné) avec notre reversedns. Dans mon cas il avait doublé “poste” ce qui faisait un domaine en “poste.poste.example.org”. Cela créait ensuite des soucis.
Cela donne un fichier de ce genre comme ceci :
127.0.0.1 localhost 127.0.1.1 poste.example.org poste # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters
Configuration classique avec postfix, dovecot, mariadb, et postfixadmin pour gérer graphiquement les détails. Ainsi que phpmyadmin le temps des bidouilles (désactivé ensuite pour réduire les surfaces d'attaque).
Il y a plein de possibilité de panachages. J'ai fait un choix, ça m'aura pris des jours à me décider, plus des jours à adapter… Je vais essayer d'expliquer mais ce qui est fait pour un logiciel, peut s'adapter à un autre.
Aucune solution n'est parfaite ou meilleure. D'autres préféreront un serveur “tout en un” où tout est installé et géré. J'en avais listé quelques uns ici. Mais au final je préfère configurer à ma sauce. Cela me permet d'adapter à certains besoins spécifiques (comme les jokers) et de tourner sur une machine peu puissante.
Quelques outils pratiques à avoir :
Mon apt est configuré pour ne pas installer par défaut les recommandés et suggérés, ce qui demande de voir la liste et de compléter au besoin. Ici, à installer en complément pour se simplifier la vie :
sudo apt install swaks mutt shared-mime-info xdg-user-dirs
Mariadb ne sert qu'à stocker les utilisateurs donc très peu de données, sa perfomance ne sera pas un souci. Il sera aussi utilisé par Postfixadmin (cf plus bas).
sudo apt install mariadb-server
Il n'y a plus besoin de lancer “mysql_secure_installation” sur Debian3) (d'ailleurs remplacé par la commande “mariadb-secure-installation”), par défaut c'est propre.
On peut tout de même se paramétrer un user “superadmin” (avec un autre nom que “root”) et un user pour postfixadmin, ce sera fait.
Ce qui suit est un demi-script bash. Juste le copier tel quel ne fonctionnera pas.
DB_ROOT_PASS="" DB_POSTAL_PASS="" sudo systemctl enable --now mariadb sudo mariadb -u root -- Configuration admin avec nom dédié CREATE USER 'superadmin'@'localhost' IDENTIFIED BY '$DB_ROOT_PASS'; GRANT ALL PRIVILEGES ON *.* TO 'superadmin'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; -- Configuration Postfixadmin CREATE DATABASE IF NOT EXISTS postfixadmin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; DROP USER IF EXISTS 'postfixadmin'@'localhost'; CREATE USER 'postfixadmin'@'localhost' IDENTIFIED BY '$DB_POSTAL_PASS'; GRANT ALL PRIVILEGES ON postfixadmin.* TO 'postfixadmin'@'localhost'; FLUSH PRIVILEGES; EXIT;
Je fais le choix de Postfix (avec postfix-mysql pour parler à Mariadb) ; aujourd'hui pas mal de gens apprécieront plus Opensmtpd et c'est legit. Pourquoi j'ai finalement pris Postfix ?
Quand Postfix demande sa configuration, répondre “Site Internet”. Vérifier le nom de domaine, par exemple “poste.example.org”.
sudo apt install postfix postfix-mysql
Dovecot, tout le monde le plébiscite, et ce n'est pas celui qui m'aura posé de souci.
sudo apt install dovecot-mysql dovecot-imapd dovecot-lmtpd dovecot-managesieved
redis-server, opendkim etc
sudo apt install redis-server opendkim
Rspamd est certes plebiscité mais… j'ai des misères à le faire tourner, et puis ça m'agace qu'il fasse “tout” (je préfère le KISS). Je ne veux pas que si rspamd plante, ça fasse foirer la signature DKIM… La solution Spamassassin+Opendkim est sans doute plus adaptée. Je vais quand même refaire des tests avec les deux et voir. Par ailleurs j'ai fait un test avec Modoboa (tout compris !) et rspamd consommait bien plus de mémoire “à vide” que Spamassassin+Amavis+Opendkim…
La chasse au spam reste donc un point en suspens pour le moment, attendant plus d'expérimentations, mais je vais plutôt vers la solution SpamAssassin.
Il faudrait que je gère un chouïa mieux DMARC. C'est paramétré mais :
Dmarc-srg semble plutôt sympa sur l'analyse des rapports. En bonus, il se connecte en imap donc peut être installé sur une autre machine sans aucun souci.
OpenDmarc (référence sur le sujet) génère les rapports à envoyer aux autres admins. Ça semble une sacré usine à gaz, probablement assez lourd. À voir et tester, mais… jusqu'ici, ne pas envoyer les rapports ne me fait pas “jeter” non plus. Par ailleurs cela demande que les milters aient vérifié SPF et DKIM (ce qui, de toute façon, serait mieux…). Opendkim gère DKIM, pour SPF voir le milter policyd-spf peut-être.
Je vais avoir la surcouche graphique avec Postfixadmin, qui permettra à mes utilisateurs de gérer leurs propres alias et mot de passe.
Il y aura aussi phpmyadmin le temps des bidouilles5), mais faut penser à l'enlever à la fin, ça fait une surface d'attaque en moins.
Paramétrer postfixadmin est l'un des premiers trucs qu'on va faire histoire que la base de donnée soit utilisable ensuite par les autres logiciels.
On commence par paramétrer Apache, installer ce qu'il faut.
sudo apt install apache2 php certbot php-curl php-gd php-cli php-sqlite3
Pour la configuration d'apache, cf script Ansible (ouais, ça pourrait être sur une forge ; peut-être un jour).
Demander un certificat let's encrypt
sudo certbot certonly --standalone -d mondomain.org --pre-hook "service apache2 stop" --post-hook "service apache2 restart"
Créer ensuite une page index basique histoire de vérifier si tout va bien. Ou utiliser celle sur /var/www/html (par défaut) pour le moment.
TODO : c'est bien de faire une page qui présente le nom de domaine. Dire que c'est un serveur mail, indiquer comment reporter les abuse, etc. Faudrait que je fasse une page en kit pour ça, respectant les bonnes pratiques (car il y a des attendus). En attendant, osef, c'est pas vital du tout.
<VirtualHost *:80> ServerName poste.example.org DocumentRoot /var/www/html RewriteEngine On RewriteCond %{REQUEST_URI} !.well-known/acme-challenge RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R=301,L] </VirtualHost> <VirtualHost *:443> ServerName poste.example.org DocumentRoot /var/www/html Alias /postfixadmin /srv/postfixadmin/public <Directory /srv/postfixadmin/public> Require all granted </Directory> SSLEngine on SSLCertificateFile /etc/letsencrypt/live/poste.example.org/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/poste.example.org/privkey.pem </VirtualHost>
Désactiver le site de base, activer le “notre” :
sudo a2dissite 000-default.conf sudo a2ensite org.example.poste.conf sudo apachectl -t sudo apachectl graceful
Lors de l'étape de Mariadb, on lui a déjà préparé la base de donnée.
Pour l'installer, on va passer par github plutôt que par le paquet, ce sera plus à jour. La doc d'installation officielle est là, je résume ici mes étapes en français.
Télécharger la dernière release (pas forcément jouer avec master qui est la version dev !) et la dézipper :
wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/v4.0.1.zip unzip v4.0.1.zip mv postfixadmin-4.0.1 /srv/postfixadmin cd /srv/postfixadmin sudo chmod a+x install.sh ./install.sh
Modifier /srv/postfixadmin/config.local.php (voir /srv/postfixadmin/config.inc.php pour les options pertinentes) :
<?php // Ce qui est ici surcharge config.inc.php. // Montrer qu'on a compris : $CONF['configured'] = true; // Parce que j'aime causer en français $CONF['default_language'] = 'fr'; // Les trucs de la BDD $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfixadmin'; $CONF['database_password'] = 'HO JE SAIS PLUS'; $CONF['database_name'] = 'postfixadmin'; // Comment on chiffre les mots de passe. Faudrait que je vérifie l'idéal... La doc propose : // $CONF['encrypt'] = 'dovecot:SHA512'; // Mais ça fait planter postfixadmin si je met ça... // Nombre d'entrée par page. On peut mettre plus que le défaut... $CONF['page_size'] = '30'; // Valeurs par défaut des boîtes. Quota en MB. 5120=5GB, 10240=10GB $CONF['aliases'] = '100'; $CONF['mailboxes'] = '10'; $CONF['maxquota'] = '5120'; $CONF['domain_quota_default'] = '10240'; // Activer les quotas $CONF['quota'] = 'YES'; // Ne pas permettre l'envoi de mail via cette interface $CONF['sendmail'] = 'NO';
Il y aura d'autres trucs à voir par la suite (transport, autoreply, les alias automatiques (abuse ok, mais les autres ?), etc6).
Se rendre ensuite sur https://poste.example.org/postfixadmin/setup.php : on devrait pouvoir générer le mot de passe et ajouter dans config.local.php quelque chose de ce genre :
$CONF['setup_password'] = 'Un truc chiffré';
En rafraichissant https://poste.example.org/postfixadmin/setup.php , on peut alors corriger d'éventuelles erreurs et créer le premier compte admin (l'identifiant doit être une adresse mail, le mot de passe doit être avec chiffres etc), puis se connecter.
Y'a plus à faire, dans l'absolu autant le paramétrer “là”.
Enfin (parce qu'il est un chouïa pénible sinon)
sudo apt install rkhunter
Refaire un snapshot parce que c'est long d'installer ces logiciels.
sudo lvcreate -L 10g -s -n snap_root_$(date --iso)_logicielsOK /dev/VgPoste/root