Projet

Général

Profil

Tâche #12675

Scénario #12725: Étudier et corriger le problème de réception des mails remonté sur 2.4.2

Il n'est pas possible d'écrire à un utilisateur scribe depuis l'extérieur

Ajouté par Emmanuel GARETTE il y a plus de 8 ans. Mis à jour il y a plus de 8 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Début:
27/08/2015
Echéance:
% réalisé:

100%

Temps estimé:
4.00 h
Temps passé:
Restant à faire (heures):
0.0

Description

Même si l'utilisateur est dans le domaine de messagerie internet, il n'est pas possible de lui écrire avec une adresse extérieur à l'établissement :

    SMTP error from remote mail server after end of data:
    host colyse.org [80.14.213.203]: 550 You can not send message with this address

Révisions associées

Révision 93b3ed50 (diff)
Ajouté par Daniel Dehennin il y a plus de 8 ans

Suppression de la vérification des mails LDAP

Un test non finalisé est passé dans la branche master afin de vérifier
les adresses expéditeurs dans le LDAP.

Le problème est que ce test s’applique aux mails venant de l’extérieur.

  • exim4/eole.d/acl.conf (acl_check_data): Suppression de la vérifaction
    du mail expéditeur.

Ref: #12675

Historique

#1 Mis à jour par Joël Cuissinat il y a plus de 8 ans

  • Tracker changé de Anomalie à Tâche
  • Temps estimé mis à 4.00 h
  • Tâche parente mis à #12725
  • Restant à faire (heures) mis à 4.0
  • Distribution changé de EOLE 2.5 à EOLE 2.4

#2 Mis à jour par Daniel Dehennin il y a plus de 8 ans

Le soucis vient du commit 5508bc14a3ddc1b7a7cbda5afc8c328f6fa98da4 qui vérifie que l’adresse source est bien dans le LDAP pour les IP qui ne sont pas des IPs relayées:

modified   exim4/eole.d/acl.conf
@@ -154,8 +154,8 @@ acl_check_data:
 #    require verify  = sender
     deny
         message     = You can not send message with this address
-        log_message = Sending email with non managed addresses is forbiden
-        #!hosts      = +relay_from_hosts
+        log_message = Sending email with non managed addresses is forbidden
+        !hosts      = +relay_from_hosts
         condition   = ${if eq {LDAP_LOOKING_FOR_EMAIL}{fail}}

     .ifdef INTERNET

Cette règle de rejet est activée pour les mails entrants car :

  1. !hosts = +relay_from_hosts est vrai puisque l’IP est extérieur
  2. la requète LDAP LDAP_LOOKING_FOR_EMAIL est exécutée et renvoie fail, puisque l’adresse expéditeur n’existe pas dans l’annuaire
  3. le ${if eq{}} teste si le résultat de la requête LDAP est fail, ce qui est vrai

L’ensemble des conditions étant vraies, la règle deny est activée.

Pour information, voici le protocole de debug utilisé:

  • machine aca.scribe-2.4.2-instance-AvecImport
  • arrêt du daemon exim4
    root@scribe:~# service exim4 stop
    
  • démarrage du daemon exim4 en mode debug avec sortie sur la console
    root@scribe:~# exim4 -bd -d+acl
    
  • connexion telnet depuis mon poste de travail
    moi@work:~$ telnet scribe.ac-test.fr smtp
    
  • commandes SMTP
    1. présentation de ma station
      EHLO daniel.eole.lan
      
    2. adresse d’enveloppe de l’expéditeur
      mail from: equipe.eole@ac-dijon.fr
      
    3. adresse d’enveloppe du destinataire
      rcpt to: prenom.prof1@ac-test.fr
      
    4. demande d’envoi du contenu du mail
      DATA
      
    5. contenu du mail terminé par un unique point en début de ligne
      From: equipe.eole@ac-dijon.fr
      To: prenom.prof1@ac-test.fr
      Date: Wed, 09 Sep 2015 14:28:17 +0200
      Message-id: <55f025e1.Fe3lOFpmm5o6/WLX%@machin.truc.ac-dijon.fr>
      Subject: test
      
      test bidule
      .
      

Voici la sortie pertinente sur la console du daemon exim4:

  1. Vérification de la condition !hosts = +relay_from_hosts
     4470 processing "deny" 
     4470 check !hosts = +relay_from_hosts
     4470 cached no match for +ipv6_local
     4470 cached lookup data = NULL
     4470 host in "127.0.0.1 :  :"? no (end of list)
     4470 host in "+ipv6_local : +ipv4_local"? no (end of list)
     4470 host in "+relay_from_hosts"? no (end of list)
    
  2. Requète LDAP sur l’adresse mail de l’expéditeur
     4470 search_open: ldapm "NULL" 
     4470 search_find: file="NULL" 
     4470   key="ldap:///o=gouv,c=fr?uid?sub?(| (mail=equipe.eole%40ac-dijon.fr)(mailAlternateAddress=equipe.eole%40ac-dijon.fr))" partial=-1 affix=NULL starflags=0
     4470 LRU list:
     4470 internal_search_find: file="NULL" 
     4470   type=ldapm key="ldap:///o=gouv,c=fr?uid?sub?(| (mail=equipe.eole%40ac-dijon.fr)(mailAlternateAddress=equipe.eole%40ac-dijon.fr))" 
     4470 database lookup required for ldap:///o=gouv,c=fr?uid?sub?(| (mail=equipe.eole%40ac-dijon.fr)(mailAlternateAddress=equipe.eole%40ac-dijon.fr))
     4470 LDAP parameters: user=NULL pass=NULL size=0 time=0 connect=0 dereference=0 referrals=on
     4470 perform_ldap_search: ldapm URL = "ldap:///o=gouv,c=fr?uid?sub?(| (mail=equipe.eole%40ac-dijon.fr)(mailAlternateAddress=equipe.eole%40ac-dijon.fr))" server=127.0.0.1 port=0 sizelimit=0 timelimit=0 tcplimit=0
     4470 after ldap_url_parse: host=127.0.0.1 port=0
     4470 ldap_initialize with URL ldap://127.0.0.1:389/
     4470 initialized for LDAP (v3) server 127.0.0.1:389
     4470 LDAP_OPT_X_TLS_TRY set
     4470 binding with user=NULL password=NULL
     4470 Start search
     4470 search ended by ldap_result yielding 101
     4470 ldap_parse_result: 0
     4470 ldap_parse_result yielded 0: Success
     4470 LDAP search: no results
     4470 lookup failed
    
  3. résultat des tests pour la règle deny
     4470 deny: condition test succeeded
     4470 SMTP>> 550 You can not send message with this address
     4470 LOG: MAIN REJECT
     4470   H=daniel.eole.lan [192.168.230.30] F=<equipe.eole@ac-dijon.fr> rejected after DATA: Sending email with non managed addresses is forbidden
    

L’idée de départ était de rejeter les messages en partance de notre serveur si l’adresse expéditeur n’était pas dans le LDAP, la restriction sur les IPs devient impraticable suivant si nous considérons que les postes derrière le scribe peuvent envoyer des messages avec des adresses externes à l’établissement ou non.

Il pourrait être plus avantageux de vérifier le domaine de l’expéditeur et de ne vérifier la partie utilisateur que pour les domaines que nous gérons, par exemple:

@@ -155,7 +155,7 @@ acl_check_data:
     deny
         message     = You can not send message with this address
         log_message = Sending email with non managed addresses is forbidden
-        !hosts      = +relay_from_hosts
+        sender_domains = LOCAL_DOMAINS
         condition   = ${if eq {LDAP_LOOKING_FOR_EMAIL}{fail}}

     .ifdef INTERNET

#3 Mis à jour par Daniel Dehennin il y a plus de 8 ans

À noter que le commit en question est diffusé dans toutes les versions depuis 2.4.0:

git br --contains 5508bc14a3ddc1b7a7cbda5afc8c328f6fa98da4
  2.4.0/master
  2.4.1/master
* 2.4.2/master
  2.4.3/master
  2.5.0/master
  dist/eole/2.4.0/master
  dist/eole/2.4.1/master
  dist/eole/2.4.2/master
  dist/eole/2.4.3/master
  dist/eole/2.5.0/master
  dist/eole/2.5/master
  master

#4 Mis à jour par Daniel Dehennin il y a plus de 8 ans

  • Restant à faire (heures) changé de 4.0 à 2.0

#5 Mis à jour par Scrum Master il y a plus de 8 ans

  • Statut changé de Nouveau à En cours

#6 Mis à jour par Scrum Master il y a plus de 8 ans

  • Assigné à mis à Daniel Dehennin

#7 Mis à jour par Daniel Dehennin il y a plus de 8 ans

Le patch proposé ne prend pas en compte les adresses systèmes et sympa, en fait tout ce qui est hors LDAP.

Dans exim la condition verify sender permet de faire un test de vérification de l’adresse expéditeur en initiant une communication SMTP, jusqu’au RCPT TO afin de voir si le SMTP accepte l’adresse en question.

@@ -151,12 +151,12 @@ acl_check_data:
                                {!def:h_Date:}\
                                {!def:h_Subject:}} {true}{false}}

-#    require verify  = sender
+    # Deny the message if the sender is in a local domain but can not be verified
     deny
         message     = You can not send message with this address
         log_message = Sending email with non managed addresses is forbidden
-        !hosts      = +relay_from_hosts
-        condition   = ${if eq {LDAP_LOOKING_FOR_EMAIL}{fail}}
+        sender_domains = LOCAL_DOMAINS
+        !verify = sender

Par contre il devient IMPOSSIBLE d’envoyer un mail avec une adresse d’expéditeur inconnue (ex: inexistant@$(CreoleGet domaine_messagerie_etab).

À voter.

#8 Mis à jour par Daniel Dehennin il y a plus de 8 ans

Daniel Dehennin a écrit :

Par contre il devient IMPOSSIBLE d’envoyer un mail avec une adresse d’expéditeur inconnue (ex: inexistant@$(CreoleGet domaine_messagerie_etab).

Au pire on peut ajouter une variable afin de désactiver cette vérification ?

Et comme ce fichier n’est pas un template on peut le backporter comme bon nous semble.

#9 Mis à jour par Daniel Dehennin il y a plus de 8 ans

Il va être difficile de n’autoriser que les mails contenus dans le LDAP, car cela bloquerait les mails systèmes.

Il reste aussi à déterminer depuis où nous souhaitons vérifier l’adresse expéditeur.

Par défaut, exim n’autorise que les machines listées dans la liste +relay_from_hosts à utiliser un MAIL FROM en domaine local, sinon c’est une configuration open relay.

Du coup :

  • On ne peut utiliser la condition actuelle qui ne fait qu’une requête LDAP, mais verify = sender qui fait un échange SMTP ;
  • On peut ne vérifier l’expéditeur que si le MAIL FROM est un domaine local afin d’éviter les mails inexistant@$(CreoleGet domaine_messagerie_etab) ;
  • Les autres machines du réseau, comme Amon, qui utilisent le scribe comme passerelle SMTP risquent d’avoir des mails systèmes avec des comptes inconnu au scribe, par exemple une crontab squid sur l’amon. Dans ce cas, ces adresses supplémentaires doivent être déclarées sur le scribe pour passer la vérification.

Le dernier point nécessite un mécanisme de déclaration d’adresses systèmes (la partie avant le @).

#10 Mis à jour par Daniel Dehennin il y a plus de 8 ans

  • % réalisé changé de 0 à 100
  • Restant à faire (heures) changé de 2.0 à 0.15

#11 Mis à jour par Daniel Dehennin il y a plus de 8 ans

  • Restant à faire (heures) changé de 0.15 à 0.25

#12 Mis à jour par Scrum Master il y a plus de 8 ans

  • Statut changé de En cours à Résolu

#13 Mis à jour par Fabrice Barconnière il y a plus de 8 ans

  • Statut changé de Résolu à Fermé
  • Restant à faire (heures) changé de 0.25 à 0.0

Formats disponibles : Atom PDF