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
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
Associated revisions
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
History
#1 Updated by Joël Cuissinat almost 8 years ago
- Tracker changed from Anomalie to Tâche
- Estimated time set to 4.00 h
- Parent task set to #12725
- Remaining (hours) set to 4.0
- Distribution changed from EOLE 2.5 to EOLE 2.4
#2 Updated by Daniel Dehennin over 7 years ago
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 :
!hosts = +relay_from_hosts
est vrai puisque l’IP est extérieur- la requète LDAP
LDAP_LOOKING_FOR_EMAIL
est exécutée et renvoiefail
, puisque l’adresse expéditeur n’existe pas dans l’annuaire - le
${if eq{}}
teste si le résultat de la requête LDAP estfail
, 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
- présentation de ma station
EHLO daniel.eole.lan
- adresse d’enveloppe de l’expéditeur
mail from: equipe.eole@ac-dijon.fr
- adresse d’enveloppe du destinataire
rcpt to: prenom.prof1@ac-test.fr
- demande d’envoi du contenu du mail
DATA
- 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 .
- présentation de ma station
Voici la sortie pertinente sur la console du daemon exim4:
- 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)
- 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
- 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 Updated by Daniel Dehennin over 7 years ago
À 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 Updated by Daniel Dehennin over 7 years ago
- Remaining (hours) changed from 4.0 to 2.0
#5 Updated by Scrum Master over 7 years ago
- Status changed from Nouveau to En cours
#6 Updated by Scrum Master over 7 years ago
- Assigned To set to Daniel Dehennin
#7 Updated by Daniel Dehennin over 7 years ago
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 Updated by Daniel Dehennin over 7 years ago
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 Updated by Daniel Dehennin over 7 years ago
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 Updated by Daniel Dehennin over 7 years ago
- % Done changed from 0 to 100
- Remaining (hours) changed from 2.0 to 0.15
#11 Updated by Daniel Dehennin over 7 years ago
- Remaining (hours) changed from 0.15 to 0.25
#12 Updated by Scrum Master over 7 years ago
- Status changed from En cours to Résolu
#13 Updated by Fabrice Barconnière over 7 years ago
- Status changed from Résolu to Fermé
- Remaining (hours) changed from 0.25 to 0.0