[Résolu] Postfix + restreindre domaine d'expédition depuis mon serveur

Postfix + restreindre domaine d'expédition depuis mon serveur [Résolu] - réseaux et sécurité - Linux et OS Alternatifs

Marsh Posté le 24-09-2015 à 12:16:57    

Bonjour,
 
Je voudrais que les envois autorisés depuis mon serveur postfix soient autorisés qu'à la condition que l'adresse de l'expéditeur soit bien une adresse de mon domaine.
Plus simplement, que personne ne puisse utiliser mon serveur pour envoyer des mails avec comme expéditeur un autre domaine que le mien.
 
 
En effet, lorsqu'un compte utilisateur se fait piraté les pirates s'authentifient avec le compte compromis pour diffuser du spam bien souvent l'adresse expéditrice et autre que celle de mon domaine. Donc je voudrais bloquer cela en imposant que l'envoi depuis mon serveur se fasse par une adresse du domaine.
 
 
Voici une partie de main.cf
------------------------------------------------------------------------------------------------------------------------
# Regles sur les adresses de destination
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifie
# reject_non_fqdn_recipient : Refuser les adresses de destinations invalides (non FQDN)
smtpd_recipient_restrictions =
     permit_mynetworks,
     permit_sasl_authenticated,
     reject_non_fqdn_recipient,
     reject_unauth_destination,
     reject_unknown_recipient_domain,
     check_recipient_access hash:/configuration/postfix/recipient_access,
     reject_rbl_client zen.spamhaus.org,
     reject_rbl_client dnsbl.njabl.net,
     reject_rbl_client dnsbl.sorbs.net,
     reject_rbl_client bl.spamcop.net
 
 
# Regles sur l'echange HELO qui survient avant la connexion
# reject_invalid_helo_hostname : Refuser les echanges HELO invalides
# reject_non_fqdn_helo_hostname : Refuser les noms d'hote invalides (non FQDN)
# reject_unknown_helo_hostname : Refuser les noms d'hote qui n'ont pas de champ DNS A ou MX dans leurs DNS.
smtpd_helo_restrictions =
     permit_mynetworks,
     permit_sasl_authenticated,
     reject_invalid_helo_hostname,
     reject_non_fqdn_helo_hostname,
     # reject_unknown_helo_hostname  
 
 
# Regles de connexion des clients
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifie
# reject_plaintext_session : Refuser les connexions non securisees
# reject_unauth_pipelining : Refuser les defauts lors de la connexion
# reject_unkown_client : Refuser les machines sans DNS inverse
smtpd_client_restrictions =
     permit_mynetworks,
     permit_inet_interfaces,
     permit_sasl_authenticated,
     reject_unkown_client,
     # reject_plaintext_session,
     # reject_unauth_pipelining
 
 
# Regles sur les expediteurs
# reject_non_fqdn_sender : Refuser les expediteurs invalides (non FQDN)
# reject_unknown_sender_domain : Refuser les expediteurs qui n'ont pas de champ DNS A ou MX dans leurs DNS.
smtpd_sender_restrictions =
     reject_non_fqdn_sender,
     reject_unknown_sender_domain,
     check_sender_access regexp:/configuration/postfix/sender_access
 
 
------------------------------------------------------------------------------------------------------------------------
   
 
Merci d'avance pour votre aide.


Message édité par K-ny13 le 14-10-2015 à 11:54:08
Reply

Marsh Posté le 24-09-2015 à 12:16:57   

Reply

Marsh Posté le 25-09-2015 à 11:17:04    

Il faut que tu règles smtpd_sender_login_maps (et rajoute au début de smtpd_recipient_restrictions: reject_authenticated_sender_login_mismatch).

 

Pour ce que u veux faire, une regexp fera l'affaire, mais tu peux aller beaucoup plus loin. Par exemple chez moi le login map utilise LDAP pour vérifier si un utilisateur a le droit d'utiliser une adresse (dans le cas ou le nom d'utilisateur ne correspond pas forcément à son adresse, ou qu'un utilisateur peut utiliser plusieurs adresses).


Message édité par h3bus le 25-09-2015 à 12:01:33

---------------
sheep++
Reply

Marsh Posté le 25-09-2015 à 15:45:43    

Bonjour,
 
Merci beaucoup pour ta réponse.
 
C'est une très bonne idée de faire une vérification par le LDAP.
Mais j'ai une erreur...
NOQUEUE: reject: RCPT from unknown[xx.xx.xx.xx]: 553 5.7.1 <julien.roux@entreprise.fr>: Sender address rejected: not owned by user jroux@entreprise.fr; from=<julien.roux@entreprise.fr> to=<julien.roux@entreprise.fr> proto=ESMTP helo=<xx.xx.xx.xx>
 
 
J'ai modifié main.cf :
----------------------------------------------------------------------
smtpd_sender_login_maps = ldap:/configuration/postfix/ldap-loginsasl.cf
 
smtpd_recipient_restrictions =
     reject_authenticated_sender_login_mismatch,
     permit_mynetworks,
     permit_sasl_authenticated,
     reject_non_fqdn_recipient,
     reject_unauth_destination,
     reject_unknown_recipient_domain,
     check_recipient_access hash:/configuration/postfix/recipient_access,
     reject_rbl_client zen.spamhaus.org,
     reject_rbl_client dnsbl.njabl.net,
     reject_rbl_client dnsbl.sorbs.net,
     reject_rbl_client bl.spamcop.net
 
----------------------------------------------------------------------
 
 
Contenu de ldap-loginsasl.cf :
----------------------------------------------------------------------
server_host = ldap://MONSERVEURLDAP
server_port = 389
bind = no
search_base = ou=MONDOMAINE,ou=XXX,o=XXX,c=fr
query_filter = (&(objectclass=inetMailUser)(|(mail=%s)(mailAlternateAddress=%s)(mailEquivalentAddress=%s)))
result_attribute = uid, mail, mailAlternateAddress, mailEquivalentAddress
version = 3
----------------------------------------------------------------------


Message édité par K-ny13 le 25-09-2015 à 15:52:34
Reply

Marsh Posté le 25-09-2015 à 16:25:21    

Dans ldap-loginsasl.cf : result_attribute devrait être le cn ou uid je pense


---------------
sheep++
Reply

Marsh Posté le 25-09-2015 à 17:28:52    

Je crois que la vérification compare login@domaine et adresse mail, donc il attend une adresse mail correspondant au login (format première lettre du prénom suivi du nom) dans les champs mail, mailAlternateAddress et mailEquivalentAddress.
 
Quand je renseigne un des deux derniers champs (mailAlternateAddress et mailEquivalentAddress) avec une adresse du style login@domaine, ça fonctionne.
 
Or mon adresse mail est de la forme prenom.nom@domaine et les deux autres champs ne sont pas toujours renseigné dans les fiches LDAP.
 
Y a t-il un autre moyen pour que ça fonctionne sans avoir à renseigner la fiche LDAP d'une adresse format login@domaine ?
 
Merci pour ton aide.

Reply

Marsh Posté le 25-09-2015 à 17:44:39    

En fait ça fait l'inverse, %s correspond à l'adresse email utilisée, et le result_attribute doit être la listes des login autorisés utiliser cette adresse.
 
Dans ton exemple le login_map envoie julien.roux@entreprise.fr et s'attend à ce que tu lui répondes jroux@entreprise.fr (jroux est valable aussi si entreprise.fr est dans $myorigin, $mydestination, $inet_interfaces ou $proxy_interfaces)
Pour résumer result_attribute doit récupérer le champ LDAP qui contient le login.


---------------
sheep++
Reply

Marsh Posté le 26-09-2015 à 14:34:25    

Merci beaucoup pour ton aide tout fonctionne très bien ! :D
 
J'ai ajouté la ligne "result_format = %u@mon_domaine.fr" dans le fichier ldap-loginsasl.cf est ça a l'air d'être bon.
 
Contenu de ldap-loginsasl.cf :
----------------------------------------------------------------------
server_host = ldap://MONSERVEURLDAP
server_port = 389
bind = no
search_base = ou=MONDOMAINE,ou=XXX,o=XXX,c=fr
query_filter = (&(objectclass=inetMailUser)(|(mail=%s)(mailAlternateAddress=%s)(mailEquivalentAddress=%s)))
result_attribute = uid, mail, mailAlternateAddress, mailEquivalentAddress
result_filter = %u@mon_domaine.fr
version = 3
----------------------------------------------------------------------
 
 
Encore merci.


Message édité par K-ny13 le 28-09-2015 à 14:35:57
Reply

Marsh Posté le 28-09-2015 à 14:34:53    

Bonjour h3bus,
 
Dans le cas où je ne passerais pas par une vérification LDAP, comment faire pour vérifier le domaine de l'expéditeur seulement dans le cas où il y a une authentification ?
 
Merci.

Reply

Marsh Posté le 28-09-2015 à 14:52:54    

Je mettrai dans le main.cf

Code :
  1. smtpd_sender_login_maps = pcre:/etc/postfix/login_maps.pcre


 
et dans login_maps.pcre:

Code :
  1. /^([\w-.]+@domaine.com)$/ ${1}


 
Si tu as plusieurs domaines tu peux au mettre une ligne par domaine ou mettre un choix multiple dans la regexp.


---------------
sheep++
Reply

Marsh Posté le 28-09-2015 à 15:19:51    

ou une requête sql si gestion en bdd

Reply

Marsh Posté le 28-09-2015 à 15:19:51   

Reply

Marsh Posté le 29-09-2015 à 10:36:00    

Merci h3bus c'est parfait !
Et merci gizmo15 pour l'info :)

Reply

Marsh Posté le 01-10-2015 à 15:53:24    

J'ai à nouveau des soucis... Les mails sont rejetés, il me dit que je ne suis pas propriétaire de l'adresse utilisé en expéditeur :
Sender address rejected: not owned by user uid@domaine.fr

 

Si je me trompe pas la ligne suivante : /^([\w-.]+@domaine.fr)$/ ${1}
dit que n'importe quelle adresse @domaine.fr correspond à l'adresse expéditrice (envoyé en paramètre "${1}" ??), c'est bien ça ?

 

Je vois pas trop où est le problème surtout qu'il me semblait que cela avait fonctionné.. faux positif :??: ?


Message édité par K-ny13 le 01-10-2015 à 15:54:13
Reply

Marsh Posté le 01-10-2015 à 16:35:30    

C'est quoi ton uid/mail qui foire? Peut-être qu'il ne passe pas la regexp.
As-tu plusieurs domaines servis par postfix?


---------------
sheep++
Reply

Marsh Posté le 01-10-2015 à 16:40:30    

Nom : Roux
Prénon : Julien
uid : jroux
mail : julien.roux@mon-domaine.fr
 
Un seul domaine de la forme mon-domaine.fr

Reply

Marsh Posté le 01-10-2015 à 16:46:30    

Ah bah c'est normal, seul l'uid julien.roux fonctionne avec cette regexp.
 
Jroux peut envoyer de jroux@mon-domaine.fr uniquement


---------------
sheep++
Reply

Marsh Posté le 01-10-2015 à 16:49:57    

Si tu veux juste vérifier le domaine,  login_maps.pcre:

Code :
  1. /^[\w-.]+@domaine.com$/ @domaine.com



---------------
sheep++
Reply

Marsh Posté le 01-10-2015 à 16:58:17    

Ça ne fonctionne pas. Il faut mettre le "@" dans la deuxième partie ?
J'ai essayé avec et sans, mais toujours pas.


Message édité par K-ny13 le 01-10-2015 à 17:05:01
Reply

Marsh Posté le 01-10-2015 à 17:07:30    

En théorie ça devrait marcher selon http://www.postfix.org/postconf.5. [...] login_maps (mais j'ai jamais essayé).
T'a bien fait un reload?
 
En tous les cas ça reste dangereux comme conf, car n'importe quel utilisateur authentifié peut utilisé n'importe quelle adresse @mon-domaine.fr
 
Sinon tu peux utiliser un hashtable, ça marche bien aussi si tu as un nombre limité d'adresses (tu dois en avoir une pour les alias maps non?).


---------------
sheep++
Reply

Marsh Posté le 01-10-2015 à 17:49:23    

Oui j'ai redémarré le service postfix.

 

On gère environ 250000 boîtes avec pour la plupart 2 adresses mails.
A chaque campagne de phishing quelques personnes se font avoir et les pirates utilisent leur compte pour diffuser beaucoup de spam.
Dans 95% des cas l'adresse expéditrice de ces spams était autre qu'une adresse de notre domaine.

 

Contrôler ainsi le domaine de l'adresse expéditrice pour les utilisateurs authentifiés était une façon de bloquer en grande partie ce genre diffusion.

 

Passer par un contrôle via LDAP avait l'air de fonctionner correctement mais le problème étant donné la forme de nos adresses mail, prénom.nom, c'est que la vérification se faisait par l'uid (format "pnom" ).

 

J'ai fais à nouveau quelques tests pour une vérification par le LDAP et je pense avoir contourner ça avec la configuration suivant (en particulier avec la ligne 7) :

 
Code :
  1. server_host = ldap://ldap.in.domaine.fr
  2. server_port = 389
  3. bind = no
  4. search_base = ou=domaine,c=fr
  5. query_filter = (&(objectclass=inetMailUser)(|(mail=%s)(mailAlternateAddress=%s)(mailEquivalentAddress=%s)))
  6. result_attribute = uid, mail, mailAlternateAddress, mailEquivalentAddress
  7. result_filter = %u@domaine.fr
  8. version = 3
 

Mais j'ai un doute sur cette configuration, je ne suis pas sûr quelle fasse réellement ce que je veux et que ce soit une "coïncidence" que ça ai l'air de fonctionner.
Je vais tester différents cas de figure pour être sûr que ça fonctionne.


Message édité par K-ny13 le 01-10-2015 à 17:53:24
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed