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:serveur_mail [09/08/2023 10:38] – Zatalyz | pratique:informatique:serveur_mail [23/05/2024 10:37] (Version actuelle) – Zatalyz | ||
---|---|---|---|
Ligne 32: | Ligne 32: | ||
===== Installation de l'OS ===== | ===== Installation de l'OS ===== | ||
- | + | CF [[pratique: | |
* Partir d'une installation fraîche, ne pas tenter de saut de version entre Debian (cf [[https:// | * Partir d'une installation fraîche, ne pas tenter de saut de version entre Debian (cf [[https:// | ||
- | | + | |
* Utiliser LVM, cela permettra les snapshots (entre autres avantages). | * Utiliser LVM, cela permettra les snapshots (entre autres avantages). | ||
- | Partitionner de cette façon | + | Pour le pare-feu |
- | * sda1 en partition primaire pour /boot. 510MB minimum | + | |
- | * sda2 en LVM. Le VG sera divisé de cette façon côté LV (à adapter suivant la taille, je préfère prendre mes aises) : | + | |
- | * ''/'' | + | |
- | * '' | + | |
- | * ''/ | + | |
- | * ''/ | + | |
- | * swap : autant que de RAM ; ou si vraiment beaucoup de ram, au moins 2GB. | + | |
- | * Il faudra sans doute paramétrer fstab afin d' | + | |
- | * Il est possible sans problème de faire un snapshot de root, puis de revenir en arrière. Je ne sais pas si le merge en arrière peut être pris en compte autrement | + | |
- | Une fois le système installé : | + | Il faut tout de même s'assurer que certains ports seront accessibles |
- | * Paramétrer Grub pour qu'il ne mette pas 4 secondes à se lancer... | + | |
- | * '' | + | |
- | * grub-mkconfig -o / | + | |
- | * Installer sudo et y ajouter l' | + | |
- | * ''apt install sudo'' | + | |
- | * usermod -a -G sudo zatalyz | + | |
- | * Paramétrer ssh. | + | |
- | * Remplacer ''/ | + | |
- | * Ajouter la clé ssh pour pouvoir se co : | + | |
- | < | + | |
- | nano / | + | |
- | # Mettre la clé publique dans ce fichier | + | |
- | chown -R zatalyz: / | + | |
- | chmod 0700 / | + | |
- | chmod 0600 / | + | |
- | * Redémarrer SSH : '' | + | |
- | + | ||
- | Se connecter en SSH (on n' | + | |
- | < | + | |
- | sudo apt upgrade | + | |
- | sudo apt install apt-listbugs debsums apt-listchanges | + | |
- | </ | + | |
- | + | ||
- | On peut aussi installer quelques outils utiles : | + | |
- | sudo apt install git binutils net-tools curl htop dnsutils | + | |
- | + | ||
- | Pour la suite et afin de ne pas se surcharger en paquets non voulu, on va désactiver " | + | |
- | sudo nano / | + | |
- | + | ||
- | Mettre le contenu suivant : | + | |
- | < | + | |
- | APT:: | + | |
- | APT:: | + | |
- | </ | + | |
- | + | ||
- | Et '' | + | |
- | + | ||
- | Et on fait un snapshot de root à ce moment, pour revenir "à zéro" si on se plante trop dans nos essais d' | + | |
- | sudo lvcreate -L 20g -s -n snap_root_$(date --iso) / | + | |
- | + | ||
- | S'il y a un souci, on revient en arrière : | + | |
- | sudo lvconvert --merge / | + | |
- | + | ||
- | Et s'il y a un souci pour recréer un snapshot après ça, c'est | + | |
- | sudo lvchange --refresh VgPoste | + | |
- | + | ||
- | ===== Sécurisation du serveur ===== | + | |
- | Il y aura plusieurs itérations sur le sujet au fil des logiciels installés, mais il me semble important de partir sur une base déjà aussi saine et avec quelques outils que je trouve utile. | + | |
- | + | ||
- | La configuration de SSH était la première partie (et changer le port SSH permet déjà de bloquer une partie des noceurs, les plus idiots, ok). | + | |
- | + | ||
- | On va installer fail2ban, rkhunter, et vérifier que la configuration du pare-feu est bonne. Notez que sans les " | + | |
- | + | ||
- | Par ailleurs, il y a débat sur l' | + | |
- | + | ||
- | ==== Rkhunter ==== | + | |
- | <WRAP center round info 100%> | + | |
- | rkhunter (pour Rootkit Hunter) est un programme qui essaye de détecter les rootkits, portes dérobées et exploits. Pour cela, il compare le hash SHA256, SHA512, SH1 et MD5 des fichiers importants avec les hash connus, qui sont accessibles à partir d'une base de données en ligne. Il alerte également l' | + | |
- | + | ||
- | De par l' | + | |
- | + | ||
- | Source : [[https:// | + | |
- | </ | + | |
- | J'ai souvenir qu'il est effectivement bavard. Et aussi que ce n' | + | |
- | + | ||
- | sudo apt | + | |
- | On le configure un chouia | + | |
- | + | ||
- | sudo nano / | + | |
- | + | ||
- | Modifier les options suivantes pour qu' | + | |
- | + | ||
- | < | + | |
- | UPDATE_MIRRORS=1 | + | |
- | MIRRORS_MODE=0 | + | |
- | #WEB_CMD="/bin/false" | + | |
- | ALLOWHIDDENDIR=/ | + | |
- | ALLOWHIDDENDIR=/ | + | |
- | ALLOWHIDDENDIR="/ | + | |
- | ALLOWHIDDENDIR="/ | + | |
- | ALLOWDEVFILE="/ | + | |
- | PKGMGR=DPKG | + | |
- | ALLOW_SSH_PROT_V1=0 | + | |
- | </ | + | |
- | + | ||
- | Après ces modifications, | + | |
- | rkhunter -C | + | |
- | rkhunter --propupd | + | |
- | + | ||
- | Modifier aussi ''/ | + | |
- | CRON_DAILY_RUN=" | + | |
- | CRON_DB_UPDATE=" | + | |
- | APT_AUTOGEN=" | + | |
- | + | ||
- | Quand à envoyer un mail quotidien... ça fait du bruit, qu'il se passe un truc ou non. On verra par la suite, d' | + | |
- | + | ||
- | Et on se fait un petit test en mettant à jour l' | + | |
- | < | + | |
- | rkhunter --list | + | |
- | rkhunter -c --rwo</ | + | |
- | + | ||
- | ==== Fail2ban ==== | + | |
- | Tout est noté dans un article à part, parce que ça commençait à être long : [[pratique: | + | |
- | + | ||
- | ==== Pare-feu (iptables, nftable, ipset, etc) ==== | + | |
- | Bon, là, ça devient compliqué. 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 '' | + | |
- | + | ||
- | Là, je ne vais pas trop m'y attarder, parce que ma box fait son taf... | + | |
- | + | ||
- | Il faut tout de même s' | + | |
* 25 : port smtp de base | * 25 : port smtp de base | ||
* 143 : imap avec STARTTLS | * 143 : imap avec STARTTLS | ||
Ligne 169: | Ligne 50: | ||
===== Systemd, ton univers impitoyable ===== | ===== Systemd, ton univers impitoyable ===== | ||
- | <WRAP center round help 60%> | + | Parait |
- | Cette partie se discute. Personnellement, | + | |
- | </ | + | |
- | + | ||
- | On va se modifier le système de log histoire de suivre ce qui peut se passer. | + | |
- | + | ||
- | sudo apt install rsyslog | + | |
- | sudo nano / | + | |
- | + | ||
- | Décommenter et vérifier les 3 lignes suivantes : | + | |
- | + | ||
- | < | + | |
- | SystemMaxFiles=100 | + | |
- | ForwardToSyslog=yes</ | + | |
- | + | ||
- | Sinon, parait | + | |
journalctl -ru postfix@-.service | journalctl -ru postfix@-.service | ||
Ligne 190: | Ligne 56: | ||
En gros postfix.service ça doit être les logs du démon postfix, et postfix@-.service ceux de son pool de mails. | En gros postfix.service ça doit être les logs du démon postfix, et postfix@-.service ceux de son pool de mails. | ||
- | |||
- | Relancer systemd : | ||
- | systemctl restart systemd-journald.service | ||
- | | ||
===== Logiciels à installer ===== | ===== Logiciels à installer ===== | ||
Ligne 493: | Ligne 355: | ||
mail_plugins = $mail_plugins imap_quota imap_sieve | 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@ ===== | ===== 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: | 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: | ||
Ligne 776: | Ligne 660: | ||
Redémarrer Postfix. | 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. | ||
- | ==== ISPMail pour gérer domaines et users ==== | + | 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' | C'est quand même plus pratique que de bidouiller la base de donnée, bien que la solution mérite d' | ||
Ligne 811: | Ligne 852: | ||
sudo apt remove adminer | sudo apt remove adminer | ||
- | ===== Rspamd ===== | + | ===== Rspamd |
À présent, la gestion des spams. | À 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 ===== | ===== Encore à faire ===== | ||
* Paramétrage de rspamd, juste pour gérer les spams. | * Paramétrage de rspamd, juste pour gérer les spams. | ||
* S'il gonfle on fera sans, il y a d' | * 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 ? | + | * 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. | * 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 | * Mettre en place le backup | ||
- | * Transférer mes vrais noms de domaines ? | + | * <del>Transférer mes vrais noms de domaines ?</ |
- | * Mettre en place un webmail, à la fois plus pratique en déplacement, | + | |
- | * Et paramétrer Sieve | + | |
Documenter : | Documenter : | ||
Ligne 832: | Ligne 942: | ||
* test imapsync ou autre. | * test imapsync ou autre. | ||
* reprendre ici et harmoniser les noms de domaine entre 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> | {{tag> | ||