Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
pratique:informatique:mail:serveur_mail [20/09/2024 07:33] – supprimée - modification externe (Unknown date) 127.0.0.1 | pratique:informatique:mail:serveur_mail [20/09/2024 07:36] (Version actuelle) – ↷ Liens modifiés en raison d'un déplacement. Zatalyz | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Paramétrer son propre serveur mail ====== | ||
+ | ===== Pas à pas ===== | ||
+ | <WRAP center round todo 60%> | ||
+ | Version en travail, non testée, reprenant les points clés vu dans les divers tutos et adaptés à ma propre façon de fonctionner. | ||
+ | </ | ||
+ | |||
+ | ===== Paramétrage des DNS, première partie ===== | ||
+ | |||
+ | Ça peut se faire par la suite mais comme ça met toujours un peu de temps à se propager... et autant avoir rapidement le nom de domaine dispo. | ||
+ | * Nom de sous-domaine pour le serveur mail, MX en A et AAAA vers lui depuis le domaine principal. | ||
+ | * ReverseDNS sur la machine. | ||
+ | * Tester tout ça | ||
+ | |||
+ | Quelque chose dans ce genre : | ||
+ | < | ||
+ | mail.example.org. | ||
+ | mail.example.org. | ||
+ | example.org. | ||
+ | </ | ||
+ | |||
+ | Le faire sur ipv6 si possible... Aujourd' | ||
+ | |||
+ | Il faut aussi configurer son Reversedns et ça, c'est permis ou non par l' | ||
+ | |||
+ | Sur Oneprovider, | ||
+ | |||
+ | Ensuite, pour tester : | ||
+ | dig +short -x " | ||
+ | dig +short -x " | ||
+ | |||
+ | L'un et l' | ||
+ | |||
+ | ===== Installation de l'OS ===== | ||
+ | CF [[pratique: | ||
+ | * Partir d'une installation fraîche, ne pas tenter de saut de version entre Debian (cf [[https:// | ||
+ | * Dans l' | ||
+ | * Utiliser LVM, cela permettra les snapshots (entre autres avantages). | ||
+ | |||
+ | Pour le pare-feu : dans la majorité des cas, le serveur est déjà derrière un pare-feu (proxy, box), les ports autorisés le sont explicitement. Chez moi, derrière la box. Un coup de '' | ||
+ | |||
+ | Il faut tout de même s' | ||
+ | |||
+ | Certains sont non-chiffrés : | ||
+ | * 25 : SMTP | ||
+ | * 143 : IMAP | ||
+ | * 110 : POP (plus vraiment utilisé) | ||
+ | Et d' | ||
+ | * 587 (ou 467) : SMTP ; 587 est " | ||
+ | * 993 (ou 220) : IMAP, 993 en SSL | ||
+ | * 995 : POP (SSL) | ||
+ | |||
+ | Et suivant les besoins : | ||
+ | * 4190 : Sieve | ||
+ | * 10025 ? : Antivirus ? Vérifier, je ne suis pas sûre de l' | ||
+ | |||
+ | <WRAP center round help 60%> | ||
+ | J'ai un doute : 25 doit être ouvert puisqu' | ||
+ | </ | ||
+ | |||
+ | |||
+ | Pour le reste, c'est le paramétrage d' | ||
+ | |||
+ | ===== Vérifier l'host ===== | ||
+ | Vérifier que /etc/hosts a un nom de domaine cohérent (si renseigné) avec notre reversedns. Dans mon cas il avait doublé " | ||
+ | |||
+ | Cela donne un fichier de ce genre comme ceci : | ||
+ | |||
+ | <code bash / | ||
+ | 127.0.0.1 | ||
+ | 127.0.1.1 | ||
+ | |||
+ | # The following lines are desirable for IPv6 capable hosts | ||
+ | ::1 | ||
+ | ff02::1 ip6-allnodes | ||
+ | ff02::2 ip6-allrouters</ | ||
+ | |||
+ | ===== Systemd, ton univers impitoyable ===== | ||
+ | Parait que la commande suivante permet d' | ||
+ | journalctl -ru postfix@-.service | ||
+ | |||
+ | Le -r c'est pour inverser l' | ||
+ | |||
+ | En gros postfix.service ça doit être les logs du démon postfix, et postfix@-.service ceux de son pool de mails. | ||
+ | |||
+ | ===== Logiciels à installer ===== | ||
+ | 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' | ||
+ | |||
+ | Bases de données : | ||
+ | * Avec postfix, mariadb ne sert qu'à stocker les infos des utilisateurs et des domaines (pas les mails), si bien que sa taille devrait rester très faible. À voir comment ça marche avec opensmtpd. Note : on se co en root à mariadb depuis le localhost, donc sans mot de passe, et ajouter un mot de passe à root peut ajouter du bazar. | ||
+ | * Je pourrais évidement gérer les utilisateurs avec LDAP et je le ferais peut-être un jour... mais là vu le taf à faire, mariadb me suffit. | ||
+ | * redis-server gère plus du cache, façon dite plus rapide de gérer le spam et ses données. | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | juillet 2024 : je vais tenter de gérer les utilisateurs avec [[https:// | ||
+ | </ | ||
+ | |||
+ | |||
+ | Je fais le choix de Postfix (avec postfix-mysql pour parler à Mariadb) ; aujourd' | ||
+ | * Énormément plus de tutos, à destination des noobs et des experts, sur tous les cas de figures | ||
+ | * J'aime la doc plus organique que des manpages | ||
+ | * En discutant avec des sysadmin connaissant les deux logiciels, leur avis n'est pas absolument tranché en faveur de l'un ou l' | ||
+ | * Leur avis est aussi que Postfix est extrêmement puissant. Il permet de faire " | ||
+ | |||
+ | |||
+ | Dovecot, tout le monde le plébiscite, | ||
+ | |||
+ | * dovecot-mysql : pour communiquer avec mysql et donc partager la même base d' | ||
+ | * dovecot-pop3d : qui utilise encore pop3 ? à voir si on le gère ou pas... je serais d'avis de laisser, pour le moment, et ajouter plus tard au besoin | ||
+ | * dovecot-imapd : pour utiliser l'IMAP donc obligé | ||
+ | * dovecot-lmtpd : une fois arrivé sur le serveur, va aiguiller les mails aux bons utilisateurs (MDA) | ||
+ | * dovecot-managesieved : permet aux utilisateurs de définir leurs règles de filtre. | ||
+ | |||
+ | La chasse aux spams se fera avec rspamd, un logiciel tiers qui traite les spams. Il gère aussi la signature automatique des clés de domaine (DKIM) MAIS je n'ai jamais réussi à le faire marcher de mon côté sur ça, et il m'a bien enquiquiné sur le reste. Donc, le DKIM est géré par Opendkim chez moi. | ||
+ | |||
+ | Quelques outils pratiques à avoir : | ||
+ | * adminer : remplaçant de phpmyadmin. On verra... | ||
+ | * swaks : " | ||
+ | * bsd-mailx : permet de lire/ | ||
+ | * mutt : autre logiciel pour voir les mails, plus " | ||
+ | |||
+ | Le certificat SSL sera géré avec certbot, classique et fonctionnel. | ||
+ | |||
+ | On va avoir un peu d' | ||
+ | |||
+ | ==== Installation des logiciels ==== | ||
+ | Finalement : | ||
+ | sudo apt install mariadb-server redis-server apache2 php postfix postfix-mysql dovecot-mysql dovecot-pop3d dovecot-imapd dovecot-lmtpd dovecot-managesieved rspamd adminer swaks mutt certbot python3-certbot-apache python3-icu opendkim opendkim-tools | ||
+ | |||
+ | Quand Postfix demande sa configuration, | ||
+ | |||
+ | Faire de nouveau un petit ''< | ||
+ | |||
+ | Refaire un snapshot parce que c'est long d' | ||
+ | |||
+ | sudo lvcreate -L 20g -s -n snap_root_$(date --iso)_logicielsok / | ||
+ | |||
+ | <WRAP center round info 100%> | ||
+ | Maj juillet 2024 : je vais tester : | ||
+ | |||
+ | sudo apt install mariadb-server redis-server apache2 php postfix postfix-mysql dovecot-mysql dovecot-imapd dovecot-lmtpd dovecot-managesieved rspamd swaks mutt certbot | ||
+ | |||
+ | puis (une fois mariadb configuré) | ||
+ | sudo apt install phpmyadmin postfixadmin | ||
+ | |||
+ | 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 shared-mime-info xdg-user-dirs php-curl php-gd | ||
+ | | ||
+ | et enfin (parce qu'il est un chouïa pénible sinon) | ||
+ | sudo apt install rkhunter | ||
+ | |||
+ | Après, snapshot et on continue. | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Apache et certbot ===== | ||
+ | Ouais, Apache, parce que je le connais, mais vu ce qu'il y a à faire, Nginx suffira aussi. | ||
+ | |||
+ | On se crée une entrée DNS pour un sous-domaine qui permettra de gérer la partie " | ||
+ | |||
+ | |||
+ | ==== Html ==== | ||
+ | sudo mkdir / | ||
+ | sudo mkdir / | ||
+ | |||
+ | Une page web " | ||
+ | |||
+ | sudo nano / | ||
+ | <code html / | ||
+ | < | ||
+ | < | ||
+ | <html class=" | ||
+ | <meta http-equiv=" | ||
+ | |||
+ | <!-- meta --> | ||
+ | <meta name=" | ||
+ | <meta name=" | ||
+ | |||
+ | </ | ||
+ | < | ||
+ | Ceci est un serveur mail. En cas de problème, merci de contacter l' | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | sudo nano / | ||
+ | |||
+ | <code html / | ||
+ | < | ||
+ | < | ||
+ | <html class=" | ||
+ | <meta http-equiv=" | ||
+ | |||
+ | <!-- meta --> | ||
+ | <meta name=" | ||
+ | <meta name=" | ||
+ | |||
+ | </ | ||
+ | < | ||
+ | Lapin ! | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Puis les droits | ||
+ | < | ||
+ | sudo chown -R www-data: / | ||
+ | sudo chown -R www-data: / | ||
+ | </ | ||
+ | |||
+ | ==== Apache ==== | ||
+ | < | ||
+ | sudo nano / | ||
+ | |||
+ | Mettre ça : | ||
+ | < | ||
+ | ServerName lapin.example.org | ||
+ | DocumentRoot / | ||
+ | </ | ||
+ | |||
+ | Idem sur la poste. | ||
+ | |||
+ | sudo nano / | ||
+ | < | ||
+ | ServerName poste.example.org | ||
+ | DocumentRoot / | ||
+ | </ | ||
+ | |||
+ | Puis les commandes suivantes. | ||
+ | < | ||
+ | sudo a2ensite poste.conf | ||
+ | sudo systemctl reload apache2</ | ||
+ | |||
+ | Se rendre sur le web et voir que la page " | ||
+ | |||
+ | Et maintenant on crée un certificat mais juste pour le domaine (hé, on limite les trucs autogénérés dans Apache !) : | ||
+ | sudo certbot certonly --webroot --webroot-path / | ||
+ | sudo certbot certonly --webroot --webroot-path / | ||
+ | |||
+ | Puis on crée le fichier apache pour https : '' | ||
+ | < | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | On va aussi modifier (re) ''/ | ||
+ | |||
+ | < | ||
+ | RewriteEngine On | ||
+ | RewriteCond %{REQUEST_URI} !.well-known/ | ||
+ | RewriteRule ^(.*)$ https:// | ||
+ | |||
+ | Enfin on active ssl, le module rewrite, le site https puis on relance apache. | ||
+ | < | ||
+ | sudo a2enmod rewrite | ||
+ | sudo a2ensite lapin-https.conf | ||
+ | sudo a2ensite poste-https.conf | ||
+ | sudo apachectl -t | ||
+ | sudo apachectl graceful</ | ||
+ | |||
+ | Enfin, vu qu'on a un certbot sur-mesure, il faut lui préciser de redémarrer les logiciels quand le certificat est renouvelé (en théorie rien à faire de ce côté, il gère seul quand demander le renouvellement à ce stade). On édite ''/ | ||
+ | post-hook = systemctl restart postfix dovecot apache2 | ||
+ | |||
+ | |||
+ | ===== Base de donnée ===== | ||
+ | On commence en ligne de commande. Ça va bien se passer. | ||
+ | |||
+ | Passons root afin de pouvoir bidouiller mysql sans mot de passe (sinon on ne peux rien faire), lançons mysql puis créons la première database. | ||
+ | |||
+ | < | ||
+ | mysql | ||
+ | CREATE DATABASE mailserver;</ | ||
+ | |||
+ | On va créer 2 users, mailadmin et mailserver (ce dernier ayant seulement le droit de lire la bdd du même nom). Comme mailadmin sera admin, trouvez-lui un nom personnalisé. Générez aussi une phrase de passe pour chaque utilisateur et stockez ça dans votre gestionnaire de clé. | ||
+ | |||
+ | Adaptez les commandes suivantes à ces personnalisations : | ||
+ | < | ||
+ | grant select on mailserver.* to ' | ||
+ | </ | ||
+ | |||
+ | Pour la suite, je suis presque bêtement [[https:// | ||
+ | |||
+ | |||
+ | < | ||
+ | USE mailserver; | ||
+ | |||
+ | CREATE TABLE IF NOT EXISTS `virtual_domains` ( | ||
+ | `id` int(11) NOT NULL auto_increment, | ||
+ | | ||
+ | | ||
+ | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||
+ | |||
+ | USE mailserver; | ||
+ | |||
+ | CREATE TABLE IF NOT EXISTS `virtual_users` ( | ||
+ | `id` int(11) NOT NULL auto_increment, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||
+ | |||
+ | USE mailserver; | ||
+ | |||
+ | CREATE TABLE IF NOT EXISTS `virtual_aliases` ( | ||
+ | `id` int(11) NOT NULL auto_increment, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||
+ | </ | ||
+ | |||
+ | Et on va à présent peupler notre base de donnée, et c'est là qu'on adapte un peu le tuto... Bien remplacer " | ||
+ | |||
+ | On quitte un instant mysql et on va générer un mot de passe salé avec dovecot : | ||
+ | sudo doveadm pw -s BLF-CRYPT | ||
+ | |||
+ | Bien le noter et le mettre à la place de celui de l' | ||
+ | |||
+ | Le code à adapter à présent ! On revient dans '' | ||
+ | < | ||
+ | |||
+ | REPLACE INTO mailserver.virtual_users (id, | ||
+ | | ||
+ | |||
+ | REPLACE INTO mailserver.virtual_aliases (id, | ||
+ | | ||
+ | |||
+ | Si on veut ajouter un autre utilisateur : | ||
+ | < | ||
+ | | ||
+ | </ | ||
+ | * X est à incrémenter, | ||
+ | * Y est l'id du domaine, donc " | ||
+ | * Le mot de passe à générer avec la commande dessus | ||
+ | * et le vrai mail. | ||
+ | ==== Adminer ==== | ||
+ | Étape facultative. | ||
+ | |||
+ | On va utiliser adminer pour nous aider un peu. On rebidouille ''/ | ||
+ | Alias /adminer / | ||
+ | |||
+ | Ça n'a hélas pas l'air de bien marcher si on met une autre adresse que " | ||
+ | |||
+ | Pour prendre ça en compte : | ||
+ | sudo systemctl reload apache2 | ||
+ | |||
+ | La page devrait être accessible à l' | ||
+ | |||
+ | On peut contrôler visuellement que les tables et leurs données sont cohérentes. | ||
+ | |||
+ | ===== Postfix et Dovecot ===== | ||
+ | Ici on suit très bêtement https:// | ||
+ | |||
+ | Idem sur la suite avec Dovecot et LMTP, rien de nouveau face au tuto. | ||
+ | |||
+ | <WRAP center round todo 100%> | ||
+ | En fait à ce stade, j'ai suivi sans diverger les pages suivantes : | ||
+ | - https:// | ||
+ | - https:// | ||
+ | - https:// | ||
+ | - https:// | ||
+ | - https:// | ||
+ | - https:// | ||
+ | - Sur ce dernier, j'ai mis de coté le petit encadré final "Allow aliases?" | ||
+ | |||
+ | J'ai sauté le chapitre sur le webmail, il n'est pas question de l' | ||
+ | |||
+ | Je pense tout de même que ça serait bien de reprendre ça à ma sauce, à un moment. La façon dont les modifs sont faites dans ''/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Quota ==== | ||
+ | Je personnalise en français le message aux utilisateurs : | ||
+ | |||
+ | <code bash / | ||
+ | #!/bin/sh | ||
+ | PERCENT=$1 | ||
+ | USER=$2 | ||
+ | cat << EOF | / | ||
+ | From: postmaster@webmail.example.org | ||
+ | Subject: Quota warning - $PERCENT% reached | ||
+ | |||
+ | FR : | ||
+ | Votre boîte aux lettres ne peut stocker qu'un nombre limité d' | ||
+ | Actuellement, | ||
+ | les nouveaux courriels ne pourront plus être stockés. Merci de votre compréhension. | ||
+ | |||
+ | EN : | ||
+ | Your mailbox can only store a limited amount of emails. | ||
+ | Currently it is $PERCENT% full. If you reach 100% then | ||
+ | new emails cannot be stored. Thanks for your understanding. | ||
+ | EOF</ | ||
+ | |||
+ | Et pour qu' | ||
+ | sudo nano / | ||
+ | |||
+ | Avoir la ligne suivante : | ||
+ | mail_plugins = $mail_plugins imap_quota imap_sieve | ||
+ | |||
+ | J'ai aussi affiné via Dovecot les valeurs par défaut. Modifier ''/ | ||
+ | |||
+ | < | ||
+ | plugin { | ||
+ | quota = maildir: | ||
+ | # Mettre 5G de quota par défaut | ||
+ | quota_rule = *: | ||
+ | # Ajouter 100M pour ce qui est dans la corbeille, ça permet de faire du tri sans " | ||
+ | quota_rule2 = Trash: | ||
+ | quota_status_success = DUNNO | ||
+ | quota_status_nouser = DUNNO | ||
+ | quota_status_overquota = "452 4.2.2 Mailbox is full and cannot receive any more emails" | ||
+ | } | ||
+ | |||
+ | service quota-status { | ||
+ | executable = / | ||
+ | unix_listener / | ||
+ | user = postfix | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | ===== Paramétrer les alias systèmes vers admin@ ===== | ||
+ | C'est bien beau tout ça, mais quand un mail interne au système (par exemple à root) est envoyé, il arrive où ? Nul part, et cette fois pas question de jouer avec [[pratique: | ||
+ | |||
+ | On commence par éditer ''/ | ||
+ | <code txt / | ||
+ | mailer-daemon: | ||
+ | postmaster: root | ||
+ | nobody: root | ||
+ | hostmaster: root | ||
+ | usenet: root | ||
+ | news: root | ||
+ | webmaster: root | ||
+ | www: root | ||
+ | ftp: root | ||
+ | abuse: root | ||
+ | noc: root | ||
+ | security: root | ||
+ | default: admin@nomdomaine.org | ||
+ | root: admin@nomdomaine.org | ||
+ | </ | ||
+ | |||
+ | Oui, sans le @ à la fin des alias, cette fois. Et vers admin@mondomaine ou autre, hein, tant que c'est un utilisateur présent sur le système. | ||
+ | |||
+ | Puis on régénère le fichier de postfix à propos des alias : | ||
+ | postalias / | ||
+ | |||
+ | Et on peut tester l' | ||
+ | echo " | ||
+ | |||
+ | Cela arrive bien dans la boite mail configurée ! | ||
+ | |||
+ | |||
+ | ===== Autodécouverte par Thunderbird et autres ===== | ||
+ | Les logiciels de courriel correctement fichus peuvent chercher leur info à ''< | ||
+ | |||
+ | Donc, on ajoute ce fichier, soit directement " | ||
+ | |||
+ | <code txt / | ||
+ | Alias / | ||
+ | </ | ||
+ | |||
+ | Redémarrer Apache. | ||
+ | |||
+ | Dans ce dossier, on va donc mettre '' | ||
+ | < | ||
+ | <?xml version=" | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | * Changez '' | ||
+ | * Changez '' | ||
+ | * Adaptez '' | ||
+ | * Vérifiez que c'est bien ces ports chez vous... par défaut ça devrait. Et que c'est ouvert sur le pare-feu ! | ||
+ | |||
+ | À noter, il y a potentiellement d' | ||
+ | * https:// | ||
+ | * https:// | ||
+ | Mais, je m' | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | Oui ben, des soucis, y'en a... Faudra revoir la chose. En tout cas sur l' | ||
+ | </ | ||
+ | |||
+ | ===== SPF, DKIM et DMARC : retour au DNS ===== | ||
+ | Voir la page dédiée : [[pratique: | ||
+ | |||
+ | ===== Alias avec joker ===== | ||
+ | On en arrive au point vital. Et on va voir que ce n'est pas si simple. | ||
+ | |||
+ | Mais de quoi je cause ? | ||
+ | |||
+ | Il faut savoir que Gandi a une fonctionnalité épatante : l' | ||
+ | |||
+ | Extrait de leur doc : | ||
+ | <WRAP center round box 100%> | ||
+ | Entrez le nom de d' | ||
+ | </ | ||
+ | Un peu plus d' | ||
+ | * nom.prenom@mondomaine.org | ||
+ | * autrealias@mondomaine.org | ||
+ | * news.*@mondomaine.org | ||
+ | * marchand.*@mondomaine.org | ||
+ | * wtf.*@mondomaine.org | ||
+ | |||
+ | Les deux premiers ('' | ||
+ | |||
+ | Je peux non seulement recevoir des mails à ces adresses avec joker, mais aussi répondre avec au besoin, bien que dans ce cas je sois dans l' | ||
+ | |||
+ | Voilà la killer feature de Gandi, si difficile à trouver ailleurs. | ||
+ | |||
+ | Coup de bol pour moi, tous mes alias fonctionnels sont de la forme '' | ||
+ | |||
+ | On va bidouiller quelque chose d' | ||
+ | * D' | ||
+ | * Ensuite, on utilisera un service du type [[https:// | ||
+ | |||
+ | ==== Recevoir les alias avec joker de type " | ||
+ | <WRAP center round important 100%> | ||
+ | Dans ces manipulations, | ||
+ | |||
+ | Cela se réglera, chez nous, par l' | ||
+ | </ | ||
+ | |||
+ | C'est Dovecot qui débloque la solution. | ||
+ | |||
+ | sudo nano / | ||
+ | |||
+ | Il y a là la ligne '' | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | Lors de mes premiers tests, ça ne permettait pas de répondre. | ||
+ | |||
+ | Mais... Au fil des bidouilles "là ça marche" | ||
+ | |||
+ | J'ai aussi mes alias déclarés. Par exemple " | ||
+ | |||
+ | Par contre tous les alias déclarés sont sans point ; c'est peut-être ça qui bloquait dans mes précédents tests... je n'ai pas déclaré un spam.moi@mondomaine.org" | ||
+ | |||
+ | Tout cela demandera plus d' | ||
+ | </ | ||
+ | |||
+ | Recharger dovecot et postfix. | ||
+ | |||
+ | |||
+ | ==== Recevoir les alias avec plusieurs jokers ==== | ||
+ | En plus de la manipulation précédente, | ||
+ | |||
+ | Dans ''/ | ||
+ | virtual_alias_maps = regexp:/ | ||
+ | |||
+ | Modifier ''/ | ||
+ | < | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | Le fait de déclarer des noms de domaine évitera qu'on permette n' | ||
+ | |||
+ | Recharger postfix. | ||
+ | |||
+ | * Source (entre autre) : https:// | ||
+ | |||
+ | |||
+ | ==== Permettre aux alias d' | ||
+ | À la fin de [[https:// | ||
+ | <WRAP center round box 60%> | ||
+ | Allow aliases? | ||
+ | |||
+ | If you want to allow users to send as one of their aliases you could create a new *.cf file with a mapping query like this: | ||
+ | SELECT email FROM virtual_users WHERE email=' | ||
+ | </ | ||
+ | |||
+ | Dans un premier temps, j'ai laissé ça de côté. | ||
+ | |||
+ | Mais, il faut que nos alias puissent répondre. Si John reçoit un mail via son alias Jack, il faut qu'il puisse répondre avec Jack ; et je confirme qu'à ce stade, le serveur refuse que Jack envoie un mail. | ||
+ | |||
+ | Voici la méthode plus détaillée. | ||
+ | |||
+ | J'ai créé ''/ | ||
+ | |||
+ | < | ||
+ | password = | ||
+ | hosts = 127.0.0.1 | ||
+ | dbname = mailserver | ||
+ | query = SELECT email FROM virtual_users WHERE email=' | ||
+ | |||
+ | Pour le faire prendre en compte, modifions '' | ||
+ | smtpd_sender_login_maps=mysql:/ | ||
+ | |||
+ | Et ça marche. Mieux, si je déclare un alias forgé dans Thunderbird, | ||
+ | < | ||
+ | |||
+ | Ouf ! Ça, ça marche ! | ||
+ | |||
+ | ==== Alias avec joker, version améliorée ==== | ||
+ | Ce sera avec Anonaddy, mais c'est pour une autre fois. Voir la [[pratique: | ||
+ | |||
+ | Anonaddy va permettre d' | ||
+ | |||
+ | |||
+ | ===== Améliorer des détails de sécurité ===== | ||
+ | L' | ||
+ | |||
+ | (à vérifier, là je teste) | ||
+ | |||
+ | ==== Désactiver la commande VRFY ==== | ||
+ | Cela sert à avoir la liste des mails valides sur un serveur. Utilisé par les spammeurs pour contacter les gens... Donc, le désactiver n'est pas vu comme une mauvaise pratique. | ||
+ | |||
+ | Dans ''/ | ||
+ | disable_vrfy_command = yes | ||
+ | |||
+ | ==== Cacher la version du serveur et autres infos indiscrètes ==== | ||
+ | Il faut camoufler les infos sur les versions des logiciels, pas besoin qu'on sache sur quelles failles compter. Rien de compliqué, il suffit de revoir le paramètre '' | ||
+ | |||
+ | On passe de ceci : | ||
+ | smtpd_banner = $myhostname ESMTP $mail_name (Debian/ | ||
+ | à cela : | ||
+ | smtpd_banner = $myhostname ESMTP | ||
+ | |||
+ | Ça devrait suffire. | ||
+ | ==== Cacher les infos envoyées dans les mails ==== | ||
+ | <WRAP center round todo 60%> | ||
+ | Ce morceau n'est pas fait ni testé. | ||
+ | </ | ||
+ | |||
+ | Créer le fichier / | ||
+ | < | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | Là il faut regarder plus en détail... attends, on n' | ||
+ | </ | ||
+ | |||
+ | ==== Activer/ | ||
+ | Dans l' | ||
+ | |||
+ | J'ai cependant rencontré un souci de taille : mon routeur n'est pas tout jeune, et ne me permet pas de déclarer l'ipv6 de ma machine. Pour le dire autrement, le réseau local n'est qu'en ipv4 (si j'ai bien compris), et je ne peux rien y faire. En attendant d' | ||
+ | |||
+ | La première chose à faire est d' | ||
+ | |||
+ | Mais par défaut, postfix va quand même tenter d' | ||
+ | |||
+ | <WRAP center round info 60%> | ||
+ | Je note ça plusieurs jours après l' | ||
+ | </ | ||
+ | |||
+ | Il faut donc ajouter ces lignes dans ''/ | ||
+ | < | ||
+ | # Forcer ipv4 tant que je n'ai pas un routeur me permettant d' | ||
+ | smtp_address_preference = ipv4 | ||
+ | inet_protocols = ipv4 | ||
+ | |||
+ | </ | ||
+ | Et déclarer uniquement le réseau en ipv4 (mais commentez la partie en ipv6, on espère un jour l' | ||
+ | < | ||
+ | #mynetworks = 127.0.0.0/8 [:: | ||
+ | mynetworks = 127.0.0.0/8 | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Personnalisation suivant les GAFAMS ==== | ||
+ | |||
+ | <WRAP center round todo 60%> | ||
+ | Cette partie risque d' | ||
+ | |||
+ | Je garde trace ici de la manip, mais ce n'est pas pertinent à ce stade, puisque le souci d'ipv6 avec Google venait du routeur et non d'en face... | ||
+ | </ | ||
+ | |||
+ | On peut indiquer des règles spécifiques suivant la destionation. Par exemple pour forcer les communications avec Google à passer par ipv4, créer le fichier ''/ | ||
+ | gmail.com | ||
+ | |||
+ | Ajouter la ligne suivante dans ''/ | ||
+ | transport_maps = hash:/ | ||
+ | |||
+ | Il faut aussi générer un fichier ''/ | ||
+ | postmap / | ||
+ | |||
+ | Redémarrer Postfix. | ||
+ | |||
+ | ==== Limiter l' | ||
+ | |||
+ | Là on est dans un truc entre sécurité et mesures antispam. Il est toujours possible qu'un compte mail se fasse pirater, et que le compte serve alors à flooder du spam à fond. Et ça, ce sera très, trèèès mauvais pour nous, parce qu'on va se faire bannir de partout et inscrire en block-list. | ||
+ | |||
+ | Bref, il est temps de paramétrer la chose. | ||
+ | |||
+ | La limite du nombre de mail envoyé à la minute est vraiment facile. Dans ''/ | ||
+ | < | ||
+ | smtpd_client_message_rate_limit = 10 | ||
+ | anvil_rate_time_unit = 60s | ||
+ | smtpd_recipient_limit = 40 | ||
+ | </ | ||
+ | |||
+ | Ce qui ici, veut dire qu'on a le droit d' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Il y a d' | ||
+ | |||
+ | ==== Limiter les tentatives de connexions des crackbots ==== | ||
+ | En regardant les logs on peut voir que tout le net tente de se connecter à notre pauvre serveur. | ||
+ | |||
+ | Fail2ban éjecte les plus nuisibles (et stupides) mais on peut ajouter aussi ceci dans ''/ | ||
+ | < | ||
+ | smtpd_soft_error_limit = 3 | ||
+ | smtpd_hard_error_limit = 10</ | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Là je me fais plaisir à bien baisser la limite... parce que les serveurs sérieux ne font pas d' | ||
+ | |||
+ | Attention cependant car cela peut aussi ralentir tout postfix et donc appliquer des délais à des clients légitimes. | ||
+ | |||
+ | ==== Avertir l' | ||
+ | Dans ''/ | ||
+ | < | ||
+ | notify_classes = resource, software, | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Cela peut faire pas mal de flood sur postmaster, mais permet aussi de voir rapidement si le serveur a un souci. | ||
+ | |||
+ | Cf https:// | ||
+ | |||
+ | ==== Postscreen, pour filtrer plus de bandits ==== | ||
+ | Doc de référence : [[https:// | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Attention, c'est pas au point parce que je n'ai pas encore mis en place " | ||
+ | </ | ||
+ | |||
+ | |||
+ | Postscreen va appliquer des vérifications sur les domaines (entre autre) et faciliter le tri. On pourra ainsi déclarer certains domaines comme bloqués, et d' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Dans le fichier ''/ | ||
+ | smtp inet | ||
+ | |||
+ | et décommenter | ||
+ | |||
+ | < | ||
+ | smtp inet | ||
+ | smtpd pass | ||
+ | -o cleanup_service_name=subcleanin | ||
+ | dnsblog | ||
+ | tlsproxy unix | ||
+ | </ | ||
+ | |||
+ | <WRAP center round info 100%> | ||
+ | Qu' | ||
+ | |||
+ | Les colonnes se réfèrent aux informations suivantes : | ||
+ | * Nom du service (smtp, dnsblog, etc) | ||
+ | * Type de service : sur quel port/socket ce dernier écoute. | ||
+ | * '' | ||
+ | * '' | ||
+ | * Private : si le service est interne à postfix ou public. '' | ||
+ | * Unprivileged : si le service tourne avec les privilèges root ou avec l' | ||
+ | * Chroot : si le service tourne en version chrooté. Pour certains, il ne faut pas (cf manpage), sinon par défaut ça semble " | ||
+ | * Wake up time (default: 0) : réveille le service après ce nombre de secondes. Si on ajoute ''?'' | ||
+ | * Limite de processus : nombre maximum de processus simultanés sur ce service, défini par défaut ailleurs ; 0 indique de ne pas mettre de limite. | ||
+ | * Commande et arguments : la commande à exécuter. Les arguments demandent de revenis à la ligne. | ||
+ | * '' | ||
+ | |||
+ | Source : le [[http:// | ||
+ | |||
+ | Ici, donc, on va activer l' | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | On ajoute les lignes suivantes dans ''/ | ||
+ | < | ||
+ | postscreen_blacklist_action = drop</ | ||
+ | |||
+ | ''/ | ||
+ | < | ||
+ | |||
+ | Mais bon, ce travail est surtout réalisé par fail2ban en principe. Ne pas oublier de créer le fichier quand même ! | ||
+ | |||
+ | On ajoute ensuite une grande subtilité de postscreen : un petit temps de délai avant de répondre. Un serveur mail bien configuré attend poliment qu'on lui donne la parole... cela éjecte donc un certain nombre de " | ||
+ | < | ||
+ | postscreen_greet_banner = Cool, we have time... | ||
+ | postscreen_greet_action = drop</ | ||
+ | |||
+ | === Listes de blocage === | ||
+ | |||
+ | Ensuite, on va ajouter des listes à interroger pour savoir si l'ip ne serait pas bloquée. Si oui, alors... on vire | ||
+ | < | ||
+ | | ||
+ | | ||
+ | | ||
+ | postscreen_dnsbl_threshold = 3 | ||
+ | postscreen_dnsbl_action = drop | ||
+ | </ | ||
+ | Ici, quelques subtilités (si j'ai compris, ce qui n'est pas certain !) : | ||
+ | * Si on rejette le mail, l' | ||
+ | * Interroger les listes demande du temps, pas la peine d'en ajouter trop, mais, on va le voir ensuite, pas la peine d'en mettre trop peu non plus. | ||
+ | * Forcément, on fait appel à un prestataire externe, avec ce que ça peut questionner sur la confiance. Les listes en question peuvent parfaitement faire une liste des ip qui contactent notre serveur. Personnellement je me dis que l' | ||
+ | * '' | ||
+ | |||
+ | Si une ip est trouvée dans une des listes, ça va compter pour " | ||
+ | |||
+ | Interroger plusieurs listes augmente donc les chances que l'ip bloquée le soit pour des raisons légitimes. | ||
+ | <WRAP center round todo 60%> | ||
+ | Et c'est une partie que je dois améliorer dans ma config | ||
+ | </ | ||
+ | |||
+ | Mais, attention. Ces listes ne sont pas toutes gratuites, elles ont des conditions d' | ||
+ | |||
+ | === Greylisting === | ||
+ | |||
+ | |||
+ | Enfin, quelques manip qui passent les ip en " | ||
+ | Ajout : ça risque aussi de foutre le boxon dans d' | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | postscreen_pipelining_action = enforce | ||
+ | postscreen_non_smtp_command_enable = yes | ||
+ | postscreen_non_smtp_command_action = enforce | ||
+ | postscreen_bare_newline_enable = yes | ||
+ | postscreen_bare_newline_action = enforce | ||
+ | </ | ||
+ | Toutes ces actions demandent que le client en face agisse proprement : il passe le test, se déconnecte, | ||
+ | * **pipelining** : pour les clients qui envoient plusieurs commandes en même temps, au lieu d' | ||
+ | * **non_smtp_command** : si le client envoie une commande qui n'est pas SMTP (voir [[https:// | ||
+ | * **bare_newline** : quand le client envoie un caractère de retour à la ligne, sans retour chariot avant. Ça doit filtrer ce qui est scripté avec les pieds ? Si on suit la norme, chaque ligne doit se terminer par < | ||
+ | |||
+ | Un petit '' | ||
+ | ===== ISPMail pour gérer domaines et users ===== | ||
+ | C'est quand même plus pratique que de bidouiller la base de donnée, bien que la solution mérite d' | ||
+ | |||
+ | En profiter (si ce n'est déjà fait) pour sécuriser Apache d' | ||
+ | |||
+ | En principe on a déjà un admin pour la base de donnée Mailuser si on a suivi le tuto plus haut. | ||
+ | |||
+ | Télécharger [[https:// | ||
+ | |||
+ | Dans '' | ||
+ | - Modifier '' | ||
+ | - Décommenter '' | ||
+ | - Modifier '' | ||
+ | |||
+ | Dans la config apache de ''/ | ||
+ | < | ||
+ | < | ||
+ | Options FollowSymLinks MultiViews | ||
+ | AllowOverride All | ||
+ | Order allow,deny | ||
+ | allow from all | ||
+ | </ | ||
+ | < | ||
+ | Require all denied | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | Se rendre sur index.php (chemin vers isp) et admirer une interface plus commode pour ajouter users, domaines, etc. | ||
+ | |||
+ | Une fois ISPMail installé, adminer ne sert à rien et présente une faille potentielle, | ||
+ | sudo apt remove adminer | ||
+ | |||
+ | ===== Rspamd (à faire) ===== | ||
+ | À présent, la gestion des spams. | ||
+ | |||
+ | Vu que j' | ||
+ | apt --install-recommends install rspamd | ||
+ | | ||
+ | Et... je vais avoir un souci parce que opendkim a besoin de ceci dans postfix : | ||
+ | < | ||
+ | |||
+ | smtpd_milters = inet: | ||
+ | non_smtpd_milters = $smtpd_milters | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | Et rspamd de cela... | ||
+ | < | ||
+ | non_smtpd_milters=inet: | ||
+ | |||
+ | |||
+ | </ | ||
+ | la grande question... peut-on déclarer plusieurs milters ? ça sent les ennuis ça. | ||
+ | |||
+ | Tant qu'on a opendkim, y'a ça à faire | ||
+ | nano / | ||
+ | |||
+ | enabled = false; | ||
+ | |||
+ | Je pense que rspamd donne les infos : https:// | ||
+ | |||
+ | Et donc on envoie à rspamd qui délègue à opendkim... bon... pas certain que ça soit au top tout ça. Pause, hélas. | ||
+ | |||
+ | https:// | ||
+ | |||
+ | ===== Filtres SIEVE ===== | ||
+ | Cela va permettre de créer des règles de filtre sur le serveur et donc de trier automatiquement les emails sans lien avec le client courriel. Pratique quand on switche entre webmail et divers thunderbird. | ||
+ | |||
+ | En principe ce qu'on a déjà fait suffit en bonne partie, mais il vient le moment de le tester, et surtout de permettre de gérer ces filtres via un client mail (et ce sera plutôt via notre webmail snappymail que via thunderbird dont l' | ||
+ | |||
+ | Il faut modifier ''/ | ||
+ | < | ||
+ | protocols = $protocols sieve | ||
+ | |||
+ | service managesieve-login { | ||
+ | inet_listener sieve { | ||
+ | port = 4190 | ||
+ | } | ||
+ | |||
+ | service_count = 1 | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Décommenter aussi cette ligne dans ''/ | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | Relancer Dovecot, puis vérifier que les ports sont bien ouverts : | ||
+ | service dovecot restart | ||
+ | lsof -i :4190 -P | ||
+ | |||
+ | Cela devrait donner ce genre de retour | ||
+ | < | ||
+ | COMMAND | ||
+ | dovecot 371602 root | ||
+ | dovecot 371602 root | ||
+ | </ | ||
+ | Il faut qu' | ||
+ | |||
+ | iptables -A INPUT -p tcp --dport 4190 -j ACCEPT | ||
+ | netfilter-persistent save | ||
+ | |||
+ | Il faut aussi permettre à ce port d' | ||
+ | |||
+ | Et voilà, plus qu'à configurer le port et la possibilité d' | ||
+ | ===== Encore à faire ===== | ||
+ | * Paramétrage de rspamd, juste pour gérer les spams. | ||
+ | * S'il gonfle on fera sans, il y a d' | ||
+ | * Commenter postfix et nettoyer afin que ce soit plus facile à maintenir. Déplacer les fichiers personnalisés dans un dossier ? (fait mais à documenter) | ||
+ | * Voir les infos récupérés dans le pdf pour améliorer les choses, ainsi que les autres blogs. pas urgent, quand on aura le temps. | ||
+ | * Mettre en place le backup | ||
+ | * < | ||
+ | |||
+ | Documenter : | ||
+ | * S' | ||
+ | * Mettre en place anonaddy et voir si ça permet de gérer les users | ||
+ | * Sinon ajouter de quoi gérer les users aussi... | ||
+ | * Vérifier que ça fait ce qu'on veut sur les alias | ||
+ | * Notes sur [[pratique: | ||
+ | * test imapsync ou autre. | ||
+ | * reprendre ici et harmoniser les noms de domaine entre autre | ||
+ | * Mise en place du webmail, à la fois plus pratique en déplacement | ||
+ | * J'ai mis imapS (993) en place mais pas noté les détails. En même temps ça va avec la reprise de la config de dovecot et postfix en version plus détaillée ici. | ||
+ | {{tag> | ||
+ | |||
+ | [[https:// | ||
+ | |||