C’est fait !
Functional architecture · Wiki · CHATONS / sm2tp · GitLab
Framagit
C’est fait !
Super, jolie boulot effectué
Je me permet de compléter des notions entant que newbie.
En effet, perso, je suis une bille en email.
C’est bien pour cela que j’ai utilisé une solution « clef en main » (Modoboa) pour mon serveur EMail.
Du coup, @sekil et @bohwaz, vous m’avez un peu perdu dans vos jargons.
Pourquoi ne pas faire une petite page genre « le SMTP pour les nul(le)s » ?
Pour commencer, je propose 2 termes (assez basic) donc j’ai recherché la définition pour être sur de ne pas faire un contre sens:
Appel aux newbies comme moi: si vous avez découvert d’autres termes jargons, n’hésitez pas à en partager la définition, ne soyez pas timide
Si tu as des questions sur des trucs que tu n’as pas compris, n’hésite pas
Ça m’a l’air de ressembler à ce que j’ai en tête, c’est super, merci bien !
Merci.
J’ai créé un nouveau projet SM2TP dans le groupe CHATONS et j’y ai recréé le wiki:
https://framagit.org/chatons/sm2tp/-/wikis/Functional-architecture
Le projet est publiquement accessible.
Je viens de créer une page :
https://framagit.org/chatons/sm2tp/-/wikis/Glossaire
N’hésitez pas à nous demander de documenter les termes lorsque nécessaire.
Tant mieux !
C’est un des éléments qui m’a fait me poser des questions pour l’architecture fonctionnelle :
Sur ce point ça me parait clair, c’est à dire qu’on peut différencier les données à usage de logs des données à usage de filtrage :
Je pense que sur ce point c’est aligné avec ce que j’ai décris, c’est à dire que le relai ne fait que relai. S’il est sur le même système qu’un serveur mail existant, il doit effectivement être mis sur un port différent.
Je ne comprend pas l’usage de cette adresse.
Le relai reçoit le code SMTP du destinataire oui, mais il peut être nécessaire de parser les logs pour extraire le code de rejet si le MTA utilisé comme relai ne fournit pas d’API pour remonter les stats et bounces. Et à vrai dire je ne serais personnellement pas à l’aise à placer un MTA non éprouvé en coupure sur le chemin du traffic mail.
Si j’ai bien compris, oMailGW ne se met pas en coupure mais extrait les logs et fournit les transport_map & cie, et je pense que ce principe nous permettra d’être plus robuste.
Enfin bon, on pourra discuter de tout ça en temps utile.
On est d’accord, si on intègre une fédération multi-niveaux, cela exige une signature des informations afin de pouvoir garantir la validité le relai qui les a générées.
Cela peut aussi permettre à une organisation fédérée de refuser les données de bounce en provenance d’une autre organisation fédérée à laquelle il ne fait pas confiance.
Par contre, et c’est très bien parce que je ne vois pas ça dans ton message, il ne faut pas limiter la propagation des données de bounce, il faut les propager tant que la chaine se poursuit (e.g. CHATONS 1 → CHATON 2 → CHATONS 3-4-5-6 → CHATONS 7 → …). Dans le cas contraire, on pourrait se trouver à voir des déséquilibres dans la production des bounces :
Sur ce point, je pense que c’est dangereux et non souhaitable :
Par conséquent, pour moi :
Un serveur SMTP en PHP codé par nos soins, je vais avoir de sérieuses objections (cf ci-dessus ;)). On peut faire pas mal de choses avec un serveur postfix et un transport_maps dynamique pour chaque requête (si j’ai bien compris c’est déjà le principe de oMailGW).
Sur ce point je ne vois aucune limitation qui interdirait de faire ça. Le service outbound.protection.outlook.com est intégralement basé sur ce principe.
J’ai repassé en revue l’expression de besoin listée sur : https://pad.hadoly.fr/p/SM2TP
Voici ce que je n’ai pas pris en compte :
hard/soft: normalement oui, MAIS…
C’est un statut à la con : le mail est refusé définitivement, mais l’adresse mail destinataire est valide.
C’est ce que j’appelle « rejet permanent du message ».
Feedback loops : non c’est toi qui choisi l’adresse en général, bien que ça dépende des fournisseurs, il n’y a rien de standardisé à ce sujet. Ça n’a absolument rien à voir avec DMARC.
En général voici comment ça se passe pour être inscrit à une feedback loop :
Exemple chez Microsoft :
Donc l’action est faite une fois pour chaque IP expéditrice (ou pour chaque réseau, si tu as plusieurs IP).
Normalement pour un hébergeur français il faut s’inscrire à ces FBL :
Il y en a quelques autres documentées ici : https://www.validity.com/blog/what-is-a-feedback-loop/
GMail propose un truc moins pratique donc je l’ai jamais essayé jusque là.
C’est plutôt chiant à mettre en place du coup si on n’a pas de compte Outlook/Yahoo…
Ensuite une fois le mail de reporting reçu au format ARF, il faut le parser pour retrouver l’adresse mail de la personne qui nous a mis dans les spams, l’adresse de l’expéditeur, et le Message-ID.
Ok, merci pour les précisions.
En plus tu l’avais déjà expliqué lors de la réunion, mais j’avais oublié. Au moins maintenant c’est écrit !
Donc effectivement je comprend pourquoi la feedback loop est dans le scope et qu’il va falloir la traiter également. Je vais mettre à jour.
Les trucs de niveaux de liste de blocage c’est pas encore très clair pour moi, mais l’idée je pense c’est que si tu as un expéditeur en local qui envoie plein de mails vers des adresses invalides qui sont déjà dans la blocklist (donc sans faire d’envoi réel), alors tu va bloquer ces envois (forcément), mais tu dois prendre en compte ça pour indiquer que peut-être cet expéditeur est en train d’envoyer du spam.
Pour le score par CHATONS j’ai pas trop réfléchi à l’idée… S’il ne relaye ses mails vers personne d’autre ça ne sert pas à grand chose, mais ça peut avoir une utilité pour quand tu veux justement relayer, en mode transparence : « nous on a un score de <0,4% de bounces réels (donc sans compter ceux bloqués par la blocklist fédérée) sur nos envois, donc on n’a rien qui fait du spam chez nous ». Ça peut aussi avoir une valeur indicative pour toi en tant que CHATONS, que tu puisse monitorer ce score et donc détecter par exemple un formulaire de contact wordpress qui serait abusé.
Oui je crois qu’on est d’accord
C’est pour les feedback loops
Je suis un dév, pas un « vrai » sysadmin donc moi je vois les solutions en terme de code Surtout dans une idée d’avoir un truc intégré sans avoir à configurer plein de trucs. Notamment car nous on n’utilise pas postfix, mais Exim, et que d’autres utilisent peut-être d’autres solutions encore.
Mais l’idée c’est que si on se met d’accord sur une API de communication entre nœuds et une logique d’échange des clés / fonctionnement du réseau, peu importe ensuite l’implémentation, donc il est possible ensuite d’avoir plusieurs implémentations interopérables, mais bon dans un premier temps ce qui serait cool c’est de concentrer les efforts
L’idée de faire un prototype de serveur SMTP en PHP (qui peut très bien gérer jusqu’à plusieurs centaines de mails par seconde à mon avis, donc d’ici à ce qu’on bloque on aura une meilleure idée), c’est de voir si l’idée fonctionne en pratique et partager le code entre l’applicatif web, la fédération et le relais SMTP.
Après ça peut être un truc dans un autre langage compilé, tant qu’on me file un paquet debian à la fin et qu’il faut pas faire du docker, ni du npm, tout me va
Oui exactement, à mon avis ça me semble important de pouvoir choisir de limiter la confiance accordée à des nœuds externes à ton réseau de confiance « explicite ».
Oui oui bien sûr la transmission doit se faire en intégralité.
En fait dans mon idée, chaque nœud possède une copie de toute la base de données fédérées, mais sait exactement d’où vient chaque événement (par exemple via un UUID, ou directement la clé publique du nœud, avec libsodium ces clés sont relativement courtes).
Je suis complètement d’accord, on s’est mal compris.
Pour moi la fédération d’envoi, c’est juste relayer depuis le relais local vers un des relais avec qui on fédère « explicitement », et donc en toute confiance. Donc comme un relais SMTP actuel en fait
Il n’est absolument pas question que les mails de C1 se retrouvent relayés chez C3 via C2, alors que la relation de confiance n’existe qu’entre C1 et C2. Il n’y a qu’un seul niveau de relais : le noeud local transmet directement au noeud de sortie final, avec qui il a une relation de confiance. Le noeud de sortie « ami » doit évidemment refuser le mail et ne pas le re-transmettre ailleurs.
En espérant être clair ce coup-ci
Ça serait pas forcément comme truc final, mais comme prototype. L’avantage c’est que ça fait une seule base de code, un seul langage. Niveau perfs ça devrait tenir très largement les besoins jusqu’à plusieurs centaines de mails par seconde, donc de quoi voir venir.
Oui je sais, je pensais aux mécanismes de vérification d’expéditeur : https://en.wikipedia.org/wiki/Callback_verification
Mais normalement l’adresse expéditeur existe dans le SMTP entrant de la structure… On pourrait peut-être rajouter ça comme vérification (avec cache) : que l’adresse expéditrice est bien valide dans le SMTP entrant de la structure.
Désolé je continue la discussion à rallonge
Ok, à réfléchir.
De toute façon il va falloir comptabiliser aussi les blocages d’expéditeurs pour éviter de mettre en danger la réputation de nos IPs, donc il faut effectivement :
Et effectivement, à titre informatif, construire une stat globale de pourcentage de bounce/rejet par CHATONS pour pouvoir détecter et promouvoir les bonnes pratiques.
Ok, c’est clair maintenant.
Je suis un dev aussi.
Et un « vrai » sysadmin, je sais pas
Mais avoir un soft tout intégré n’est pas un leitmotiv pour moi, et lorsque des choses existent déjà et font le job, j’ai plutôt tendance à les réutiliser plutôt que les réimplémenter.
En l’occurrence, outre le fait que PHP soit très mal adapté pour implémenter un serveur ou un démon de manière générale (les dev Nextcloud se débattent avec memcache, redis &cie pour pallier leur erreur initiale), il ne s’agit pas juste d’implémenter SMTP, il y a de nombreuses fonctions déjà implémentés dans les MTA existants (authentification, rate limiting, etc) qui prendront beaucoup de temps à réimplémenter. Et s’il faut le faire proprement il faudra les tester voire les CI/CDiser. Je ne sais pas pour toi mais personnellement je n’ai pas envie d’implémenter une suite de tests SMTP. Maintenant si tu as envie de le faire, fais-toi plaisir.
Je ne vois pas le code qu’il y aurait à partager entre l’API et le serveur SMTP, on est sur deux services assez disjoints qui font des opérations qui n’ont pas grand chose à voir (c’est une intuition pour le moment, on verra lorsque l’architecture sera plus claire). Et mon avis est que disjoindre les fonctions facilite leur vérification, leur maintenance, et l’interopérabilité.
Maintenant on n’est pas obligé d’utiliser le même MTA pour le relai et pour le MX, même sur le même OS. Le MTA sélectionné aurait sa configuration de référence fournie pour ce cas d’usage, avec le minimum d’adaptations locales. Alors il est vrai que Debian met en conflit les mail-transport-agent entre eux (je viens de vérifier), dans ce cas on pourrait repackager le MTA pour supprimer le conflit, donc rien de bloquant.
Je ne le vois pas forcément comme un avantage.
Oui OK
Oui. Et d’après wikipedia la vérification se fait bien auprès du MX du domaine de l’émetteur et non du serveur émetteur donc dans ce cas c’est safe d’avoir un relai qui n’est pas le MX du domaine.
Je ne suis même pas sûr qu’il soit nécessaire d’avoir un serveur qui parle SMTP sur le port 25 sur la même IP, mais par sécurité on peut le prévoir.
Non je ne pense pas que ça soit nécessaire, tant que le domaine du « MAIL FROM » a un MX correctement configuré avec SMTP derrière, tout devrait bien aller
Je vois pas…Moi c’est ce que je fais avec mon service oMailgw : que du sortant. J’ai pas constaté d’effet indésirable.
Si si, oMailgw coupe si trop de bounce : https://forum.chatons.org/t/sm2tp-gt-mutualisation-smtp/6321/12
+12 000 ! Je suis pas certain que coder un serveur SMTP soit une bonne route, ça va être un boulot énorme pour que ça fonctionne bien. On a plus de chance de générer des problèmes (un problème c’est potentiellement des mails non distribué) en développant un serveur SMTP qu’utilisez un postfix ou autre qui est éprouvé depuis des lustres, qui bénéficie d’une grosse communauté, et qui possèdes de nombreuses portes pour interagir avec lui.
Et pour le coup je vois pas le « gain » de fonctionnalité possible entre lire le log et constater un retour SMTP en direct sinon l’instantanéité (mais est-ce que c’est un pré-requis ? et encore avec un surveillance « ionotify » sur un log on peut approcher ça… )
Pour oMailgw de mon côté je suis partie à « lire les logs » parce que je voulais surtout pas impacter le fonctionnement d’un truc qui marche bien (postfix dans mon cas), juste interagir avec lui, lui envoyer dynamiquement des conf (blacklist, trnasport…) mais y’a peut être un intermédiaire à trouver…
Sur le côté dev / sysadmin, c’est cool qu’il y est les 2 profiles c’est très complémentaire ici pour le coup. Pour le coup c’est un outil qui va servir à des sysadmin, du coup garde à ne pas partir sur une usine que seul les dev comprennent entre eux (je trouve que Crowdsec c’est typiquement ça…) et pour moi ton côté dev @bohwaz explique pour moi ta direction vers le dev d’un service SMTP complet.
Sauf si j’ai vite lu, j’ai l’impression que ça focalise beaucoup autour des bounces type user unknown, du partage de ceux-ci. A mon avis c’est vraiment pas le cœur du problème (dans l’optique ou on souhait faciliter le déploiement de service mail chez les CHATONS). Si on veux partager une liste d’utilisateur qui n’existe pas, on a pas vraiment besoin d’une tel usine à gaz, on partage une base/un fichier qu’on peut « brancher » sur nos services SMTP (avant même le relai)
Et ça part dans la technique alors qu’il y a des potentielles problèmes humain / financier qui serait bien plus difficile à surmonter pour nous je penses.
David
Quand je dis se mettre en coupure, je veux dire se placer en intermédiaire sur le traffic SMTP.
Quand je dis se mettre en coupure, je veux dire se placer en intermédiaire sur le traffic SMTP.
Ha pardon j’avais mal compris. Alors effectivement non. oMailgw il « regard » (surveille les logs) il envoi à l’API et l’API lui retourne des fichiers de conf à jour en fonction…
Et pour le coup je vois pas le « gain » de fonctionnalité possible entre lire le log et constater un retour SMTP en direct sinon l’instantanéité (mais est-ce que c’est un pré-requis ? et encore avec un surveillance « ionotify » sur un log on peut approcher ça… )
J’ai pas l’impression que les serveurs SMTP existants te permettent de bloquer une adresse avec des règles dynamiques.
Imagine : pour les gens qui ont des boîtes mail, je veux bien qu’ils envoient des mails à des boîtes en soft bounce, si le soft bounce a plus de 24h. Mais pour les envois de masse, je veux qu’une boîte avec 5 soft bounces soit définitivement bloquée tant qu’elle ne valide pas sa validité via l’envoi d’un mail + lien à cliquer.
À moins que ton serveur SMTP ne spawne un script à chaque mail envoyé, mais pour le coup ça risque de vite devenir lourd ?
Enfin si c’est possible c’est cool, je connais pas trop postfix car je suis parti sur Exim dont la config est plus simple et standard sur Debian.
Sauf si j’ai vite lu, j’ai l’impression que ça focalise beaucoup autour des bounces type user unknown, du partage de ceux-ci. A mon avis c’est vraiment pas le cœur du problème (dans l’optique ou on souhait faciliter le déploiement de service mail chez les CHATONS). Si on veux partager une liste d’utilisateur qui n’existe pas, on a pas vraiment besoin d’une tel usine à gaz, on partage une base/un fichier qu’on peut « brancher » sur nos services SMTP (avant même le relai)
Pour moi le partage des bounces c’est une bonne première étape pour améliorer notre délivrabilité, et donc réduire notre charge mentale sur les mails qui n’arrivent pas à destination.
Pour moi le cœur du problème c’est justement que ça sert à rien de partager les envois entre nos infrastructures, si on ne peut pas faire confiance aux envois venant des autres, en sachant qu’on a autre chose à faire de nos vies que de vérifier les logs venant des autres.
Donc étape 1 : améliorer la délivrabilité en améliorant nos pratiques et en étant plus zens en sachant qu’un de nos utilisateurs⋅trices ne puisse pas d’un coup démolir notre réputation et nous faire bloquer partout parce qu’on n’a pas réagi super vite.
Actuellement ça n’existe pas.
Je ne sais pas si c’est le cœur du problème, mais j’ai l’impression que ça serait déjà un bon pas en avant. Quel serait le cœur du problème du coup ?
J’ai pas l’impression que les serveurs SMTP existants te permettent de bloquer une adresse avec des règles dynamiques.
(…)
Enfin si c’est possible c’est cool, je connais pas trop postfix car je suis parti sur Exim dont la config est plus simple et standard sur Debian.
Si, ils te le permettent complètement.
Précisément, s’agissant de postfix, toutes les maps (structures de données utilisées par Postfix pour à peu près toutes ses fonctionnalités, depuis la liste des mailbox à la sélection d’un relai en passant par les blacklists), peuvent utiliser les types suivants : Postfix Lookup Table Overview
Maintenant, effectivement ici la liste des services auxquels tu peux faire des appels en mode requête-réponse est limitée. Donc tu as aussi, dans postfix toujours, la possibilité d’implémenter un script de policy service dans lequel tu vas passer tous tes mails pour vérification : Postfix Configuration Parameters
Maintenant, si tu n’aimes pas postfix, tu peux encore implémenter un programme utilisant le protocole milter (comme le font la plupart des modules DKIM, DMARC, ou antispams), ce qui te permet d’avoir un filtre compatible avec la grande majorité des serveurs SMTP.
Dans le cas de oMailGW, de ce que je lis dans le code, les blacklists postfix sont générées lors d’un appel régulier à omailgw-cli (par cron), qui vient écrire un fichier postfix maps (et appeler la commande qui va bien pour compiler le fichier). Sachant qu’il se trouve que postfix recharge ses maps lorsqu’elles sont modifiées. Donc il s’agit d’une semi-dynamicité.
Pour l’utiliser depuis 15 ans, je peux dire que Postfix permet clairement des choses qu’aucun autre serveur SMTP ne permet, et je suis convaincu que ça peut être une boite à outils très utile pour ce qu’on a à faire. Mais je ne l’ai pas poussé parce que pour moi ce n’est pas le sujet des discussions actuellement.
Voilà pourquoi pour le moment, à mon avis, il est bien trop tôt pour se demander comment on va faire les choses et se précipiter à se dire qu’on va réutiliser tel ou tel composant, ou qu’au contraire on va réimplémenter un serveur SMTP. Je pense qu’on doit se concentrer sur qu’est ce qu’on veut et comment on veut que la solution fonctionne.
Désolé du délai, je rentre juste de vacance-vélo…
Pour moi le partage des bounces c’est une bonne première étape pour améliorer notre délivrabilité
Je suis d’accord pour que la première étape soit d’améliorer gentillement notre délivrabilité mais la question que je pose c’est de savoir si oui, et dans quel mesure partager les bounces (et donc ne plus envoyer vers des adresses qui n’existe pas) ça améliore la délivrabilité. Sur quoi on se base pour dire ça ? Il y a des études sur le sujet ? Juste un sentiment ?
Je ne sais pas si c’est le cœur du problème, mais j’ai l’impression que ça serait déjà un bon pas en avant. Quel serait le cœur du problème du coup ?
Pour moi la difficulté c’est de réagir automatiquement, vite à un problème complexe que même un humain n’a pas parfois pas toutes les clés de compréhension (parce qu’en face, les règles sont mouvantes…) :
Sans paraître pessimiste je vois bien que vous avancer vers un truc full automatique avec le moins d’humain possible mais j’ai l’impression que même les gros opérateurs on beaucoup d’humain pour gérer des e-mails… Alors qu’est-ce qui fait qu’on est plus malin qu’eux ? En ajoutant en plus une couche de complexité / de collaboration entre structure (humaine et technique)
Note : je veux quand même bien essayer !
Je suis d’accord pour que la première étape soit d’améliorer gentillement notre délivrabilité mais la question que je pose c’est de savoir si oui, et dans quel mesure partager les bounces (et donc ne plus envoyer vers des adresses qui n’existe pas) ça améliore la délivrabilité. Sur quoi on se base pour dire ça ? Il y a des études sur le sujet ? Juste un sentiment ?
C’est un truc super important chez SES et autres solutions commerciales d’envoi de mails, c’est donc que c’est pas juste un sentiment mais que c’est important pour de vrai je pense
Une boîte est piratée (envoi vers des e-mail qui existe) et PAF on se fait blacklister en face peu de temps… action à mener : bloquer l’expéditeur ? Bloquer l’IP émettrice ? Router le reste du trafic légitime (des autres IP) vers une autre passerelle pour les destinataires qui bloque maintenant pour ce d
Difficile de détecter que c’est la boîte X qui a été piratée tant que le volume d’envoi ne semble pas inhabituel, ni que le volume de rejets n’augmente pas. Bien sûr les complaints aident bien dans ce genre de cas !
Moi je dirais : si c’est inhabituel comme volume pour l’expéditeur X on ralentit automatiquement les envois dans un premier temps (file d’attente avec sortie des mails en mode lent : 1 mail / minute par exemple), en attendant de voir, si ça continue à augmenter après X heures / Y volume, alors blocage en attendant une inspection manuelle du cas.
Quelqu’un transfère un e-mail à une mailing liste (quasi systématiquement bloqué chez certain opérateur) : On bloque avant ? Comment le détecter ? Et pi mince, c’est du trafic légitime…
Là c’est plus de la gestion de la mailing list elle-même, qui peut détecter/bloquer les forwards, mais bon je pense que le cas est assez rare pour ne pas s’en soucier perso.
Le but est d’automatiser le max. de choses, mais pas de remplacer les humains, plutôt de leur faciliter la tâche
Suite à la mise à jour du CDC, j’ai également mis à jour la page d’architecture fonctionnelle :
Framagit
A la réflexion, cela me fait considérer qu’on peut diviser en plusieurs projets :
Le service de bounces et le service de relais sont fonctionnellement relativement indépendants : On peut imaginer déployer le service de bounces seul pour partager les données de bounce entre plusieurs émetteurs qui assurent eux-mêmes leurs propres envois, comme on peut imaginer déployer le service de relais seul, sans collecte et partage des bounces. En définissant correctement les interfaces entre les deux, on peut les développer indépendamment.
Concernant le relai, comme je l’ai déjà indiqué, je pense qu’il est préférable de le mettre en oeuvre sur la base d’un MTA existant (ma préférence se portant sur Postfix), OpenDKIM pour la signature, et le développement d’un module milter ou d’un service policy pour les fonctionnalités spécifiques au projet. Et en tout cas c’est ce qui permettra d’arriver le plus rapidement à un MVP.
Concernant le service de bounces, même si on pourrait modifier un logiciel existant de collecte de logs (tel que Lightmeter (Lightmeter / ControlCenter · GitLab), ça ne me parait pas aberrant de partir sur un développement de 0 vu les fonctionnalités spécifiques qu’on doit implémenter.
Dans ce cas de figure, pour permettre l’interaction du relai avec le service de bounces, il faudra que le service de bounces fournisse une librairie (dans un langage à convenir) et/ou une CLI, de manière à permettre au relai : d’une part de notifier des entrées de log au service bounces, d’autre part de requêter les listes de blocage.