Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
pratique:informatique:serveur_mail [28/07/2023 09:31] – [Recevoir les alias avec joker round 2 (guère mieux mais simple)] Zatalyzpratique:informatique:serveur_mail [13/10/2023 12:43] (Version actuelle) – [Postscreen, pour filtrer plus de bandits] Zatalyz
Ligne 151: Ligne 151:
  
 ==== Fail2ban ==== ==== Fail2ban ====
-Fail2ban va limiter les attaques d'entrée par bruteforce. En théorieévidement, la configuration du système ne devrait pas permettre le moindre brut force, maiiiis bon, dans le doute...+Tout est noté dans un article à partparce que ça commençait à être long : [[pratique:informatique:fail2ban]]
  
-  apt-get install fail2ban whois python3-systemd +==== Pare-feu (iptables, nftableipset, etc) ==== 
-Les deux derniers sont des "recommands" qui semblent réellement utiles.  +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 ''nmap ip'' permet de vérifier les ports ouverts. Sur Numenaute, de la même façon, le proxy protège les containers et vm derrière ; mais là c'est sur lui qu'il faut vérifier que tout est propre. 
- +
-On crée un fichier dans /etc/fail2ban/jail.d/custom.conf +
-<code>[DEFAULT] +
-ignoreip 127.0.0.1 +
-# ajouter votre propre ip si vous n'êtes pas en dynamique, ça évite de se faire mettre à la porte pour une bêtise +
- +
-[sshd] +
-enabled true +
-port 223 +
-# Mettre son port "custom" si ce n'est pas celui par défaut (22) +
-backend systemd +
-#vital pour que ça marche sauf si les logs etc ne sont pas gérés via systemd... +
-</code> +
- +
-Relancez fail2ban et vérifier ce qu'il raconte : +
-  sudo service fail2ban restart +
-  sudo fail2ban-client status +
- +
-Il faudra ajouter les "jails" des services utilisés ici à mesure qu'on active des trucs. +
- +
-À terme, voici à quoi ressemble mon fichier : +
-<code> +
-[DEFAULT] +
-ignoreip = 127.0.0.1 +
- +
-[sshd] +
-enabled = true +
-port = ssh, sftp, 22, 225 +
-backend = systemd +
- +
-[apache-auth] +
-enabled = true +
-[apache-badbots] +
-enabled = true +
-[apache-noscript] +
-enabled = true +
-[apache-overflows] +
-enabled = true +
-[apache-nohome] +
-enabled = true +
-[apache-botsearch] +
-enabled = true +
-[apache-fakegooglebot] +
-enabled = true +
-[apache-modsecurity] +
-enabled = true +
-[apache-shellshock] +
-enabled = true +
- +
-[dovecot] +
-enabled = true +
-port    = pop3,pop3s,imap2,imaps,submission,465,sieve +
-filter    = dovecot +
- +
-[postfix] +
-enabled = true +
-port    = pop3,pop3s,imap2,imaps,submission,465,sieve +
-filter = postfix +
- +
-[sieve] +
-enabled = true +
- +
-</code> +
- +
-=== Bidouilles avec iptable, etc === +
-<WRAP center round todo 100%> +
-Par la suite... j'ai eu des trucs dans les logs qui me faisait dire que fail2ban n'était pas assez méchant. J'ai un peu tâtonné, et on ne peux pas dire que je sois arrivé à grand chose puisque j'ai fini par bannir à la main.  +
- +
-Je suis un peu trop crevée pour faire la doc proprement, là, mais mon bash_history en rapport : +
-<code> +
-nano /etc/fail2ban/action.d/iptables-multiport.conf +
-apt install iptables iptables-persistent +
-nano /etc/iptables/rules.v4 +
-iptables-apply /etc/iptables/rules.v4 +
-nano /etc/fail2ban/jail.d/defaults-debian.conf +
-nano /etc/fail2ban/action.d/iptables.conf +
-ipset list f2b-blacklis +
-nano /etc/fail2ban/filter.d/postfix.conf +
-fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/postfix.conf +
-nano /etc/fail2ban/filter.d/dovecot.conf +
-service fail2ban restart +
-fail2ban-client set postfix banip 189.187.42.119 +
-iptables -A INPUT -s 189.187.42.119 -j REJECT +
-</code> +
- +
-Un de ces jours, on fera mieux : +
-  * détecter certains motifs (avec ''fail2ban-regex''). Du genre ceux qui me pinguent sur le mail avec une commande qui n'est pas du mail. C'est pas du tout louche... +
-  * bannir ce genre d'ip au moins un an,donc avec une rétention plus longue, et surtout de façon générale et non par service. +
- +
-Voici à quoi ressemble ''/etc/iptables/rules.v4'' actuellement. Je ne saurais dire si c'est réellement pertinentje ne me sens aucune expertise sur le sujet ; j'espère seulement que cela n'aura pas ouvert de failles... +
-<code> +
- +
-*filter +
-:INPUT DROP [0:0] +
-:FORWARD DROP [0:0] +
-:OUTPUT ACCEPT [0:0] +
- +
-# Allow internal traffic on the loopback device +
--A INPUT -i lo -j ACCEPT +
- +
-# Continue connections that are already established or related to an established connection +
--A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +
- +
-# Drop non-conforming packets, such as malformed headers, etc+
--A INPUT -m conntrack --ctstate INVALID -j DROP +
- +
-# SSH +
--A INPUT -p tcp --dport 225 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT +
- +
-# DHCP used by OVH +
--A INPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT +
- +
-# DNS (bind) +
-#-A OUTPUT -p tcp --dport 53 -j ACCEPT +
-#-A OUTPUT -p udp --dport 53 -j ACCEPT +
- +
-# HTTP + HTTPS +
--A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT +
- +
- +
-# Email (postfix + devecot) +
-# 25 = smtp, 587 = submission and 993 = IMAPS, 143 imap, 110 pop +
--A INPUT -p tcp -m multiport --dports 25,587,993,110,143 -j ACCEPT +
- +
-# NTP +
--A INPUT -p udp --dport 123 -j ACCEPT +
- +
-# Chain for preventing ping flooding - up to 6 pings per second from a single +
-# source, again with log limiting. Also prevents us from ICMP REPLY flooding +
-# some victim when replying to ICMP ECHO from a spoofed source. +
--N ICMPFLOOD +
--A ICMPFLOOD -m recent --name ICMP --set --rsource +
--A ICMPFLOOD -m recent --name ICMP --update --seconds 1 --hitcount 6 --rsource --rttl -m limit --limit 1/sec --limit-burst 1 -j LOG --log-prefix "iptables[ICMP-flood]> +
--A ICMPFLOOD -m recent --name ICMP --update --seconds 1 --hitcount 6 --rsource --rttl -j DROP +
--A ICMPFLOOD -j ACCEPT +
- +
-# Permit useful IMCP packet types. +
-# Note: RFC 792 states that all hosts MUST respond to ICMP ECHO requests. +
-# Blocking these can make diagnosing of even simple faults much more tricky. +
-# Real security lies in locking down and hardening all services, not by hiding. +
--A INPUT -p icmp --icmp-type 0  -m conntrack --ctstate NEW -j ACCEPT +
--A INPUT -p icmp --icmp-type 3  -m conntrack --ctstate NEW -j ACCEPT +
--A INPUT -p icmp --icmp-type 8  -m conntrack --ctstate NEW -j ICMPFLOOD +
--A INPUT -p icmp --icmp-type 11 -m conntrack --ctstate NEW -j ACCEPT +
- +
-# Drop all incoming malformed NULL packets +
--A INPUT -p tcp --tcp-flags ALL NONE -j DROP +
- +
-# Drop syn-flood attack packets +
--A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP +
- +
-# Drop incoming malformed XMAS packets +
--A INPUT -p tcp --tcp-flags ALL ALL -j DROP +
-COMMIT +
- +
- +
-</code> +
- +
-La ligne que j'aimerais détecter pour bannir (j'en ai encore aujourd'hui) :  +
-<code>2023-07-28T09:19:04.783707+02:00 poste postfix/smtpd[608140]: warning: non-SMTP command from scan-15n.shadowserver.org[184.105.247.252]: GET / HTTP/1.1</code> +
-C'est tellement louche. +
- +
-</WRAP> +
- +
- +
-==== Pare-feu ==== +
-Bon, là, ça devient compliqué. Dans la majorité des cas, le serveur est déjà derrière un pare-feu, les ports autorisés le sont explicitement. Chez moi, derrière la box. Un coup de ''nmap ip'' permet de vérifier les ports ouverts. Sur Numenaute, de la même façon, le proxy protège les containers et vm derrière ; mais là c'est sur lui qu'il faut vérifier que tout est propre. +
  
 Là, je ne vais pas trop m'y attarder, parce que ma box fait son taf... Là, je ne vais pas trop m'y attarder, parce que ma box fait son taf...
Ligne 329: Ligne 162:
   * 143 : imap avec STARTTLS   * 143 : imap avec STARTTLS
   * 587 : smtp avec STARTTLS   * 587 : smtp avec STARTTLS
 +
 +Pour le reste, c'est le paramétrage d'iptable et consort, et c'est détaillé avec la config de fail2ban.
  
 ===== Vérifier l'host ===== ===== Vérifier l'host =====
Ligne 411: Ligne 246:
  
 On se crée une entrée DNS pour un sous-domaine qui permettra de gérer la partie "web" du serveur (A et AAAA). Je l'ai appelé "lapin". Ensuite, on crée un dossier et un index (avec un simple hello dedans à ce stade) et on paramètre apache en mode hyper basique (on y reviendra). On fait aussi une page pour la partie "mail", cela permettra à let's encrypt d'avoir une réponse et à qui cherche le domaine de savoir "c'est quoi". Le détail de tout ça ci-dessous. On se crée une entrée DNS pour un sous-domaine qui permettra de gérer la partie "web" du serveur (A et AAAA). Je l'ai appelé "lapin". Ensuite, on crée un dossier et un index (avec un simple hello dedans à ce stade) et on paramètre apache en mode hyper basique (on y reviendra). On fait aussi une page pour la partie "mail", cela permettra à let's encrypt d'avoir une réponse et à qui cherche le domaine de savoir "c'est quoi". Le détail de tout ça ci-dessous.
- 
-==== Fail2ban ==== 
-Puisqu'on a Apache, autant ajouter les lignes suivantes dans notre fail2ban. Ainsi que ce qui concerne les autres logiciels installés : 
-<code txt /etc/fail2ban/jail.d/custom.conf> 
-[apache-auth] 
-enabled = true 
-[apache-badbots] 
-enabled = true 
-[apache-noscript] 
-enabled = true 
-[apache-overflows] 
-enabled = true 
-[apache-nohome] 
-enabled = true 
-[apache-botsearch] 
-enabled = true 
-[apache-fakegooglebot] 
-enabled = true 
-[apache-modsecurity] 
-enabled = true 
-[apache-shellshock] 
-enabled = true 
- 
-[dovecot] 
-enabled = true 
-port    = pop3,pop3s,imap2,imaps,submission,465,sieve 
- 
-[postfix] 
-enabled = true 
- 
-[sieve] 
-enabled = true 
-</code> 
- 
-Ne pas oublier de redémarrer fail2ban ensuite. 
-  fail2ban-server -t 
-  systemctl restart fail2ban 
  
  
Ligne 695: Ligne 493:
   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 ''/etc/dovecot/conf.d/90-quota.conf'' pour avoir ce contenu :
 +
 +<code>
 +plugin {
 +  quota = maildir:User quota
 +  # Mettre 5G de quota par défaut
 +  quota_rule = *:storage=5G
 +  # Ajouter 100M pour ce qui est dans la corbeille, ça permet de faire du tri sans "ranger" dans la corbeille.
 +  quota_rule2 = Trash:storage=+100M
 +  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 = /usr/lib/dovecot/quota-status -p postfix
 +  unix_listener /var/spool/postfix/private/quota-status {
 +    user = postfix
 +  }
 +}
 +
 +</code>
 ===== 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:informatique:mail_relai|Msmtp]] : le relai, ça sera "nous". Mais, la logique n'est pas très différente. 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:informatique:mail_relai|Msmtp]] : le relai, ça sera "nous". Mais, la logique n'est pas très différente.
Ligne 781: Ligne 601:
 Voir la page dédiée : [[pratique:informatique:mail_dns]] Voir la page dédiée : [[pratique:informatique:mail_dns]]
  
- +===== Alias avec joker =====
- +
-===== Alias avec joker, premier round =====+
 On en arrive au point vital. Et on va voir que ce n'est pas si simple. On en arrive au point vital. Et on va voir que ce n'est pas si simple.
  
Ligne 813: Ligne 631:
   * Ensuite, on utilisera un service du type [[https://anonaddy.com/|anonaddy]]. Mais c'est pour plus tard, on a pas mal de choses à vérifier avant.   * Ensuite, on utilisera un service du type [[https://anonaddy.com/|anonaddy]]. Mais c'est pour plus tard, on a pas mal de choses à vérifier avant.
  
-==== Recevoir les alias avec joker round 1 (compliqué et pas extra) ====+==== Recevoir les alias avec joker de type "point" ==== 
 +<WRAP center round important 100%> 
 +Dans ces manipulations, n'importe quelle adresse gagne son "joker" en fin... donc john@domain.org va recevoir aussi tout les possibles john.*@domain.org sans rien avoir à déclarer de plus. Ce qui est un peu gênant, ouvrant la porte à du potentiel flood de spam... 
  
-Dans ''/etc/postfix/main.cf''modifier ''virtual_alias_maps'' pour ajouter ''regexp:/etc/postfix/point_addressing''Ça devrait ressembler à ça : +Cela se réglera, chez nous, par l'usage d'AnonaddyMaisen attendant, il faut s'assurer de pouvoir tout recevoir
-  virtual_alias_maps = regexp:/etc/postfix/point_addressing, mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf+</WRAP>
  
-Modifier ''/etc/postfix/point_addressing'' en mettant les regexp suivantes (à adapter aux noms de domaines servis) : +C'est Dovecot qui débloque la solution.
-<code> +
-/^(.*)\.(.*)@(mondomaine\.org|autredomaine\.fr)$/ $1+$2@$3 +
-/^(.*)\+(.*)@(mondomaine\.org|autredomaine\.fr)$/ $1@$3 +
-</code>+
  
-Recharger postfix.+  sudo nano /etc/dovecot/conf.d/15-lda.conf
  
-<WRAP center round important 100%> +Il y a là la ligne ''recipient_delimiter = .'' (à décommenter et à mettre avec un point, donc).  
-À partir de ce momentil semblerait que n'importe quelle adresse gagne son "joker" en fin... donc john@domain.org va recevoir aussi tout les possibles john.*@domain.org sans rien avoir à déclarer de plus. Ce qui est un peu gênant... + 
 +<WRAP center round todo 60%> 
 +Lors de mes premiers testsça ne permettait pas de répondre. 
 + 
 +Mais... Au fil des bidouilles "là ça marcheet je ne suis pas sûre de ce que j'ai changé. J'ai tout de même ''</WRAP>recipient_delimiter = .'' dans ''/etc/postfix/main.cf'' en plusPas sûr que ça serve à grand chose car postfix ne reconnait pas le point comme caractère valide, dans mes précédents tests, mais c'est là... 
 + 
 +J'ai aussi mes alias déclarésPar exemple "spam@mondomaine.orgest un alias du vrai mail ; si je tente d'envoyer avec "spam.moi@mondomaine.org" (sans avoir déclarer cet alias par ailleurs), ça envoie.
  
-Par ailleurs, un mail existant du type nom.prenom@mondomain.org ne marchera pas (il cherche un alias "nom@" à qui ajouter le joker)+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" officiellement et il n'est renseigné nul part. Mais il peut envoyer
  
-Bref c'est foireux.+Tout cela demandera plus d'investigation quand je referais un autre serveur mail.
 </WRAP> </WRAP>
  
-L'autre possibilité est d'utiliser le delimiter : ''recipient_delimiter = .'' ; sauf que là... non en fait, ça ne marche pas non plus. Pire Postfix n'accepte pas le point seul+Recharger dovecot et postfix.
  
-  * Source (entre autre) : https://wiki.fiat-tux.fr/books/administration-syst%C3%A8mes/page/postfix 
  
-==== Recevoir les alias avec joker round 2 (guère mieux mais simple) ==== +==== Recevoir les alias avec plusieurs jokers ==== 
-Alors, sinon, on oublie postfixOui, on enlève la regexp, le point_delimiter, et on passe à Dovecot.+En plus de la manipulation précédentesi on veut utiliser le ''+'' en plus du ''.''.
  
-  sudo nano /etc/dovecot/conf.d/15-lda.conf+Dans ''/etc/postfix/main.cf'', modifier ''virtual_alias_maps'' pour ajouter ''regexp:/etc/postfix/point_addressing''. Ça devrait ressembler à ça : 
 +  virtual_alias_maps = regexp:/etc/postfix/point_addressing, mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
  
-Il y a là aussi la ligne ''recipient_delimiter = .'' (à décommenter et à mettre avec un pointdonc)+Modifier ''/etc/postfix/point_addressing'' en mettant les regexp suivantes (à adapter aux noms de domaines servis) : 
 +<code> 
 +/^(.*)\.(.*)@(mondomaine\.org|autredomaine\.fr)$/ $1+$2@$3 
 +/^(.*)\+(.*)@(mondomaine\.org|autredomaine\.fr)$/ $1@$3 
 +</code> 
 +Le fait de déclarer des noms de domaine évitera qu'on permette n'importe quel alias à tous les domainescela offre un peu plus de contrôle.
  
-Par contre... ça ne permet pas de répondre.+Recharger postfix.
  
-<WRAP center round todo 60%> +  * Source (entre autre) : https://wiki.fiat-tux.fr/books/administration-syst%C3%A8mes/page/postfix
-Mais... Au fil des bidouilles "là ça marche". J'ai tout de même ''</WRAP>recipient_delimiter = .'' dans /etc/postfix/main.cf en plus, ainsi que les alias déclarés via ISPmail. Par exemple "spam@mondomaine.org" est un alias du vrai mail ; si je tente d'envoyer avec "spam.moi@mondomaine.org" (sans avoir déclarer cet alias par ailleurs), ça envoie.+
  
-Par contre tous les alias déclarés sont sans point ; c'est peut-être ça qui bloquait dans mes précédents tests... + 
-</WRAP> +==== Permettre aux alias d'envoyer ====
-==== Permettre aux alias d'envoyer ====+
 À la fin de [[https://workaround.org/ispmail/bullseye/relay-outoing-email-through-postfix/]], il y a une note assez sibylline sur le sujet : À la fin de [[https://workaround.org/ispmail/bullseye/relay-outoing-email-through-postfix/]], il y a une note assez sibylline sur le sujet :
 <WRAP center round box 60%> <WRAP center round box 60%>
Ligne 882: Ligne 707:
  
 Ouf ! Ça, ça marche ! 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:informatique:anonaddy|page dédiée]]. 
 +
 +Anonaddy va permettre d'anonymiser complètement l'adresse mail réelle, d'avoir uniquement les adresses jokers sur certains alias, et même de bloquer l'envoi vers certains alias avec joker. C'est encore mieux que Gandi.
 +
 +
 ===== Améliorer des détails de sécurité ===== ===== Améliorer des détails de sécurité =====
 L'outil https://nstools.fr/ liste divers points qui peuvent être améliorés.  L'outil https://nstools.fr/ liste divers points qui peuvent être améliorés. 
Ligne 966: Ligne 798:
 Redémarrer Postfix.  Redémarrer Postfix. 
  
 +==== Limiter l'envoi de mail dans un temps donné ====
  
 +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 ''/etc/postfix/main.cf'', ajouter quelque chose comme : 
 +<code> 
 +smtpd_client_message_rate_limit = 10 
 +anvil_rate_time_unit = 60s 
 +smtpd_recipient_limit = 40 
 +</code> 
 + 
 +Ce qui ici, veut dire qu'on a le droit d'envoyer 10 mails à la minute, chacun à 40 destinataires au maximum. Faut arriver à les écrire, quand même.   
 +    * ''anvil_rate_time_unit'' : par défaut c'est de toute façon 60 secondes donc on pourrait aussi bien ne pas le déclarer. Cela sert à diverses choses, pas juste à la limite d'envoi de mail.  
 +    * ''smtpd_client_message_rate_limit'' : le nombre de messages autorisé dans cette limite. 2 est évidement mauvais pour la prod, mais cela permet de tester que tout marche : envoyez 3 mails différents depuis la même adresse, en moins d'une minute, et admirez le résultat. Postfix ne met pas vraiment de limite par défaut... 
 +    * ''smtpd_recipient_limit'' : Nombre maximum de destinataires qu'un serveur SMTP de Postfix accepte par requête de livraison de message (défaut : 1000). Il me semble que 40 est déjà énorme, mais ça arrive qu'on envoie un mail collectif à une grosse partie de notre carnet d'adresse. 
 + 
 +Il y a d'autres options similaires (cf http://www.postfix.org/TUNING_README.html#conn_limit ) mais cela me semble inutile.  
 + 
 +==== 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 ''/etc/postfix/main.cf''
 +<code>smtpd_error_sleep_time = 5s 
 +smtpd_soft_error_limit = 3 
 +smtpd_hard_error_limit = 10</code> 
 +  * ''smtpd_error_sleep_time'' :  la réponse du serveur SMTP n'est envoyée qu'après un délai lorsque le client a fait plus de $smtpd_soft_error_limit et moins de $smtpd_hard_error_limit erreurs, sans livrer de courrier (1s par défaut). 
 +  * ''smtpd_soft_error_limit'' :  Nombre d'erreurs qu'un client SMTP distant est autorisé à faire sans livrer de messages avant d'être ralenti par le serveur SMTP de Postfix (10 par défaut). 
 +  * ''smtpd_hard_error_limit'' : Nombre maximum d'erreurs qu'un client SMTP distant est autorisé à commettre sans livrer de message. Le serveur SMTP de Postfix coupe la connexion au delà de cette limite (20 par défaut). 
 + 
 +Là je me fais plaisir à bien baisser la limite... parce que les serveurs sérieux ne font pas d'erreurs. On verra si cela complexifie ma réception de mails. 
 + 
 +Attention cependant car cela peut aussi ralentir tout postfix et donc appliquer des délais à des clients légitimes.  
 + 
 +==== Avertir l'admin si y'a des abus/problèmes ==== 
 +Dans ''/etc/postfix/main.cf''
 +<code>error_notice_recipient = postmaster@mondomain.org 
 +notify_classes = resource, software,policy,bounce,delay</code> 
 +  * ''error_notice_recipient'' : par défaut les notifications sont délivrées à "postmaster" (en local), donc ça devrait arriver, mais on peut aussi indiquer une autre adresse mail, vu que de toute façon... ben on a un serveur d'envoi de mail... 
 +  * ''notify_classes'' : qu'est-ce qui va être notifié. Par défaut, ''resource'' (problème de ressources) et ''software'' (problème de logiciel). On peut ajouter ce qui suit :  
 +    * ''bounce'' : détails des en-têtes pour les messages rejetés à la livraison. Inclut le paramètre ''2bounce'' donc pas besoin de le mettre aussi.  
 +    * ''2bounce'' : avis de rejets non-livrables 
 +    * ''delay'' : à propos des messages retardés 
 +    * ''policy'' : à propos des messages rejetés pour cause de restriction. Genre trop d'envoi à la minute. 
 +    * ''protocol'' : erreur de protocole du client ou du serveur. Et là je crains que ça floode à mort sur les gens qui tentent de se connecter de façon non autorisée, alors je ne l'ai pas mis dans ma configuration. 
 + 
 +Cela peut faire pas mal de flood sur postmaster, mais permet aussi de voir rapidement si le serveur a un souci.  
 + 
 +Cf https://postfix.traduc.org/index.php/postconf.5.html#notify_classes pour la doc officielle traduite. 
 + 
 +==== Postscreen, pour filtrer plus de bandits ==== 
 +Doc de référence : [[https://www.postfix.org/postconf.5.html]]. 
 + 
 +<WRAP center round important 60%> 
 +Attention, c'est pas au point parce que je n'ai pas encore mis en place "subcleanin" comme proposé dans https://blog.debugo.fr/serveur-messagerie-optimisation-postfix/ et donc ben... c'est le bordel ! 
 +</WRAP> 
 + 
 + 
 +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'autres comme de confiance, et en mettre certains en liste grise. Pour chaque contrôle, on peut au choix : 
 +  * ''ignore'' : on ne fait rien 
 +  * ''enforcer'' : on bloque et on enverra un retour ''RCPT TO: 550 5.3.2 Service currently unavailable'' 
 +  * ''drop'' : on répondra ''521 5.3.2 Service currently unavailable'' 
 + 
 +Dans le fichier ''/etc/postfix/master.cf'', **commentez** la ligne : 
 +  smtp  inet             smtpd 
 + 
 +et décommenter 
 + 
 +<code> 
 +smtp  inet             postscreen 
 +smtpd pass             smtpd 
 + -o cleanup_service_name=subcleanin 
 +dnsblog  unix             dnsblog 
 +tlsproxy unix             tlsproxy 
 +</code> 
 + 
 +<WRAP center round info 100%> 
 +Qu'est-ce qu'on est en train de faire ?  
 + 
 +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.  
 +    * ''inet'' passe par TCP/IP et est accessible depuis le réseau 
 +    * ''unix'' et ''pass'' sont des processus locaux. ''pass'' ne reçoit qu'une connexion par requête. 
 +  * Private : si le service est interne à postfix ou public. ''inet'' est forcément public. Par défaut sur "y" et par déduction je dirais que "y" veut dire "privé"
 +  * Unprivileged : si le service tourne avec les privilèges root ou avec l'utilisateur postfix. Par défaut "y" et aucune idée de si c'est root ou pas, mais on va faire confiance aux tutos. 
 +  * Chroot : si le service tourne en version chrooté. Pour certains, il ne faut pas (cf manpage), sinon par défaut ça semble "y"
 +  * Wake up time (default: 0) : réveille le service après ce nombre de secondes. Si on ajoute ''?'' ça indique qu'il ne faut pas le réveiller tant qu'il n'a pas été appelé par ailleurs. 0 indique qu'on ne fait pas de réveil automatique. 
 +  * 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.  
 +    * ''-o name=value'' (forme raccourcie, sinon il y a une façon longue de le raconter) : surcharge le paramètre en question de ''main.cf''. La doc conseille de ne pas en abuser. 
 + 
 +Source : le [[http://www.postfix.org/master.5.html|manpage]] et [[https://blog.debugo.fr/serveur-messagerie-policyd-spf-postscreen/|configuration de postcreen par Debugo]].  
 + 
 +Ici, donc, on va activer l'usage de postscreen (utile pour bloquer pas mal de spam), dnsblog pour filtrer les dns bloqués, et tls proxy pour le support de STARTTLS dans postscreen. 
 + 
 +</WRAP> 
 + 
 + 
 +On ajoute les lignes suivantes dans ''/etc/postfix/main.cf''
 +<code>postscreen_access_list = permit_mynetworks, cidr:/etc/postfix/mycfg/postscreen_access.cidr 
 +postscreen_blacklist_action = drop</code> 
 + 
 +''/etc/postfix/mycfg/postscreen_access.cidr'' permet de bloquer des ip, selon cette forme : 
 +<code>xxx.xxx.xxx.xxx reject</code> 
 + 
 +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 "zombies". La "greet_banner" est le message envoyé lors de l'attente. Le temps d'attente (ici 3 secondes) permet aussi d'interroger si l'ip est blacklistée. 
 +<code>postscreen_greet_wait = 3s 
 +postscreen_greet_banner = Cool, we have time... 
 +postscreen_greet_action = drop</code> 
 + 
 +=== 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 
 +<code>postscreen_dnsbl_sites = 
 + zen.spamhaus.org*2, 
 + bl.spamcop.net, 
 + b.barracudacentral.org*2 
 +postscreen_dnsbl_threshold = 3 
 +postscreen_dnsbl_action = drop 
 +</code> 
 +Ici, quelques subtilités (si j'ai compris, ce qui n'est pas certain !) : 
 +  * Si on rejette le mail, l'expéditeur aura l'information du nom de domaine ayant servi à la blocklist. Cela peut se cacher (via postscreen_dnsbl_sites) , mais personnellement je juge plutôt correct de dire "je ne te veux pas car tu est bloqué ici" ; si l'expéditeur est légitime et que c'est une erreur, il peut se faire débloquer.  
 +  * 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'intérêt de l'information reste limité, surtout si peu à peu j'ai plus d'utilisateurs. 
 +  * ''postscreen_dnsbl_threshold'' indique la limite inférieure inclusive du score du domaine testé qu'on peut accepter. Et là ça demande un peu de détails. 
 + 
 +Si une ip est trouvée dans une des listes, ça va compter pour "1". Sauf si on ajoute un chiffre après le nom du domaine et l'astérisque ; dans ce cas ça sera pondéré d'autant. Dans l'exemple ici, si une ip est trouvée sur zen.spamhaus.org, ça va compter pour "2". Là, avec nos trois listes dont 2 pondérées à "2", si l'ip est listée partout, elle obtiendra un score de 5. C'est plus haut que 3 => c'est probablement une adresse louche.  
 + 
 +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 
 +</WRAP> 
 + 
 +Mais, attention. Ces listes ne sont pas toutes gratuites, elles ont des conditions d'utilisation, bref pour ne pas se faire ban soi-même... il faut aller voir tout ça.  
 + 
 +=== Greylisting === 
 + 
 + 
 +Enfin, quelques manip qui passent les ip en "greylisting" en attente d'en savoir plus. Attention, cela peut éjecter des serveurs légitimes mais configurés de façon un peu légère (d'ailleurs, moi-même, je donnerais quoi ?). Enfin, bon, comme cela risque surtout de concerner des copains et qu'ils savent comment me contacter autrement... perso ça ne me stresse pas. <WRAP center round important 60%> 
 +Ajout : ça risque aussi de foutre le boxon dans d'autres cas, car le serveur en face reçoit un message comme quoi "on peut pas recevoir" en premier. Et il doit retenter un envoi, ensuite, qui lui passera... si l'ip du serveur est ok. Or avec les gros, c'est bien possible que les ips tournent histoire d'arriver à envoyer. Bref, à tester mais c'est pas forcément une idée parfaite. 
 +</WRAP> 
 +  
 +<code>postscreen_pipelining_enable = yes 
 +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 
 +</code> 
 +Toutes ces actions demandent que le client en face agisse proprement : il passe le test, se déconnecte, et cause ensuite au vrai postfix. Cela ralentit les échanges et peut être coûteux en ressources (et en temps). Cependant une fois le test passé, l'ip est enregistrée comme "bonne" pendant un certain temps (paramètre ''postscreen_*_ttl'', 30 jours par défaut donc je ne change rien).  
 +  * **pipelining** : pour les clients qui envoient plusieurs commandes en même temps, au lieu d'attendre la réponse à chacune avant d'envoyer la suivante. Le mail n'est pas fait pour se presser ; ceux qui sont pressés sont souvent mal intentionnés. 
 +  * **non_smtp_command** : si le client envoie une commande qui n'est pas SMTP (voir [[https://www.postfix.org/postconf.5.html#postscreen_forbidden_commands)]]. Et ça, quand on regarde les logs, on sait qu'ils testent et que ce n'est **jamais** légitime.  
 +  * **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 <CR><LF> ; s'il n'y a que <LF> c'est sale ! 
 + 
 +Un petit ''postfix reload'' et... On espère que tout va bien ! 
 +===== 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'être un peu améliorée. Mais, c'est du php : je peux y faire des choses. Et en attendant "ça marche" C'est quand même plus pratique que de bidouiller la base de donnée, bien que la solution mérite d'être un peu améliorée. Mais, c'est du php : je peux y faire des choses. Et en attendant "ça marche"
  
Ligne 997: Ligne 986:
  
 Se rendre sur index.php (chemin vers isp) et admirer une interface plus commode pour ajouter users, domaines, etc.  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, donc on l'enlève :
 +  sudo apt remove adminer
 +
 +===== Rspamd (à faire) =====
 +À présent, la gestion des spams. 
 +
 +Vu que j'étais un peu fâchée avec rspamd, s'assurer qu'il a tout ce qu'il lui faut :
 +  apt --install-recommends install rspamd 
 +  
 +Et... je vais avoir un souci parce que opendkim a besoin de ceci dans postfix :
 +<code>
 +
 +smtpd_milters = inet:localhost:8891
 +non_smtpd_milters = $smtpd_milters
 +
 +
 +</code>
 +
 +Et rspamd de cela...
 +<code>smtpd_milters=inet:127.0.0.1:11332
 +non_smtpd_milters=inet:127.0.0.1:11332
 +
 +
 +</code>
 +la grande question... peut-on déclarer plusieurs milters ? ça sent les ennuis ça.
 +
 +Tant qu'on a opendkim, y'a ça à faire 
 +  nano /etc/rspamd/local.d/dkim_signing.conf
 +
 +  enabled = false;
 +
 +Je pense que rspamd donne les infos : https://www.rspamd.com/doc/modules/dkim_signing.html
 +
 +Et donc on envoie à rspamd qui délègue à opendkim... bon... pas certain que ça soit au top tout ça. Pause, hélas.
 +
 +https://workaround.org/bullseye/filtering-out-spam-with-rspamd/
 +
 +===== 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'extension ne marche plus). 
 +
 +Il faut modifier ''/etc/dovecot/conf.d/20-managesieve.conf'' et décommenter les lignes suivantes :
 +<code>
 +protocols = $protocols sieve
 +
 +service managesieve-login {
 +  inet_listener sieve {
 +    port = 4190
 +  }
 +
 +  service_count = 1
 +}
 +</code>
 +
 +Décommenter aussi cette ligne dans ''/etc/dovecot/conf.d/10-auth.conf'' :
 +<code>disable_plaintext_auth = yes
 +</code>
 +
 +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
 +<code>
 +COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
 +dovecot 371602 root   15u  IPv4 487495      0t0  TCP *:4190 (LISTEN)
 +dovecot 371602 root   16u  IPv6 487496      0t0  TCP *:4190 (LISTEN)
 +</code>
 +Il faut qu'iptable laisse passer ça **aussi** :
 +
 +  iptables -A INPUT -p tcp --dport 4190 -j ACCEPT
 +  netfilter-persistent save
 +
 +Il faut aussi permettre à ce port d'être accessible à travers le firewall/proxy/box (mais là, ça dépend de la box etc, donc pas de tuto ici...).
 +
 +Et voilà, plus qu'à configurer le port et la possibilité d'utiliser SIEVE sur notre client mail favori, ça marche !
 ===== 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'autres méthodes pour gérer (cf Evolix)     * S'il gonfle on fera sans, il y a d'autres méthodes pour gérer (cf Evolix)
-  * 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 ce 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 
 +  * <del>Transférer mes vrais noms de domaines ?</del>  
 + 
 +Documenter : 
 +  * S'assurer que l'adresse mail pour les infos systèmes est bien configurée..
   * Mettre en place anonaddy et voir si ça permet de gérer les users   * Mettre en place anonaddy et voir si ça permet de gérer les users
     * Sinon ajouter de quoi gérer les users aussi...     * Sinon ajouter de quoi gérer les users aussi...
     * Vérifier que ça fait ce qu'on veut sur les alias     * Vérifier que ça fait ce qu'on veut sur les alias
     * Notes sur [[pratique:informatique:anonaddy|cette page]], ça commence à faire long ici et c'est un truc particulier.     * Notes sur [[pratique:informatique:anonaddy|cette page]], ça commence à faire long ici et c'est un truc particulier.
-  * teste imapsync ou autre.  +  * test imapsync ou autre.  
-  * Mettre en place le backup +  * reprendre ici et harmoniser les noms de domaine entre autre 
-  * S'assurer que l'adresse mail pour les infos systèmes est bien configurée... +  * Mise en place du webmail, à la fois plus pratique en déplacement 
-  * Transférer mes vrais noms de domaines ?  +  * 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.
-  * Mettre en place un webmail, à la fois plus pratique en déplacement, et puis pour pouvoir configurer les filtres SIEVE. +
-  * Documenter les bidouilles sur ipv4 et iptable... +
 {{tag>Mail}} {{tag>Mail}}
  
CC Attribution-Noncommercial-Share Alike 4.0 International Driven by DokuWiki
pratique/informatique/serveur_mail.1690529489.txt.gz · Dernière modification : 28/07/2023 09:31 de Zatalyz