Taille: 11086
Commentaire: Tu nous manqueras Mailman 2 (ou pas)
|
Taille: 16215
Commentaire: Signature des mails avec opendkim
|
Texte supprimé. | Texte ajouté. |
Ligne 6: | Ligne 6: |
Mailman 3 est encore en cours de déploiement, cette documentation risque d'évoluer dans les jours à venir. | Mailman 3 est encore en cours de déploiement, cette documentation risque d'évoluer dans les jours à venir. Le déploiement est prévu pour se faire dans la nuit du 11 au 12 avril 2021. |
Ligne 19: | Ligne 19: |
{{{#!wiki caution Le reste ci-dessous est obsolète et tiré de la page de Mailman 2. C'est en cours de réécriture. }}} == Convention de nommage == Avant de créer une liste, merci de vérifier que son nom vérifie la convention de nommage décrite sur [[CransTechnique/ConventionsUtiles/NomsML|cette page]]. == Administration == {i} Tous les scripts d'administration sont dans {{{/usr/lib/mailman/bin/}}}, certains de ces scripts ont des liens dans /usr/sbin afin de pouvoir les lancer directement. === Créer une nouvelle mailing liste === {{{#!wiki tip Il est d'usage que les mailing lists soient créées suite à une demande sur la ML nounou, histoire de garder une trace de qui a demandé quoi. }}} {{{ chove@redisdead% sudo newlist }}} et on répond aux questions : {{{ Donner le nom de la liste : ma-liste Entrez l'adresse courriel du gestionnaire de la liste : chove@crans.org Mot de passe initial de la liste ma-liste : Tapez sur Entrée pour aviser le propriétaire de ma-liste... }}} Mailman va créer tout seul les alias dont il a besoin dans {{{/etc/postfix/mailman-aliases}}}. {i} Pour générer un mot de passe, on peut utiliser {{{mkpasswd}}} === Supprimer une liste === {{{ chove@redisdead% sudo rmlist ma-liste }}} === Faire démourrir une liste === Récupérer sur zephyr {{{/var/lib/mailman/lists/${nomdeliste} }}}, {{{/var/lib/mailman/archives/private/${nomdeliste} }}} (si on veut récupérer les archives, mais non obligatoire), {{{/var/lib/mailman/data/aliases}}}, {{{/var/lib/mailman/data/virtual-mailman}}} via l'interface de backuppc (creds dans cranspasswords). Récupérer les entrées de la liste dans le backup d'aliases et virtual-mailman avec les stanzas et les remettre dans les fichiers qui vont bien (vous pouvez utiliser vimdiff). Extraire les archives en root pour conserver les bonnes permissions pour {{{/var/lib/mailman/lists/${nomdeliste} }}} et {{{/var/lib/mailman/archives/private/${nomdeliste} }}} puis copier les dossiers au bon endroit sur redisdead. Puis : {{{ sudo postmap /var/lib/mailman/data/aliases && sudo postmap /var/lib/mailman/data/virtual-mailman }}} === Quelques scripts d'administration utiles === * Changer le mot de passe d'une liste {{{ % sudo change_pw -l la_liste }}} Cette commande génère un mot de passe aléatoire et l'envoie aux propriétaires de la liste en question. * Lister les abonnés d'une liste {{{ % sudo list_members -o fichier_de_sortie la_liste }}} * Lister les abonnements d'une adresse mail {{{ % sudo find_member address@example.com }}} * Ajouter ou supprimer des membres d'une liste {{{ % sudo add_members -r fichier_contenant_les_adresses la_liste % sudo remove_members -f fichier_contenant_les_adresses la_liste }}} Les deux commandes suivantes sont cronnées et contenues dans {{{/usr/lib/mailman/cron/}}}. Elles ne sont en général que très peu exécutées manuellement. * Envoyer un rappel du mot de passe des abonnés d'une liste {{{ % sudo ./mailpasswds -l la_liste }}} * Envoyer les digests d'une liste (utile par exemple avant de relancer mailman) {{{ % sudo ./senddigests -l la_liste }}} Invoquer les deux scripts précédents sans options traite l'action demandée sur l'ensemble des listes. * Voir quelles sont les MLs plus utilisées (et donc potentiellement supprimables) {{{ % sudo /usr/scripts/utils/old_ml.py 01/01/2011 }}} === Paramétrer une liste === Pour paramétrer une liste, on peut soit utiliser l'interface web : http://lists.crans.org/admin/ma-liste ; soit utiliser les scripts sur {{{redisdead}}} (dans {{{/var/lib/mailman/bin/}}}). {i} Si on veut utiliser l'interface web, on peut utiliser le mot de passe général de mailman disponible sur vert. == Développement == On peut ajouter à mailman de nouvelles features spéciales crans assez aisément car les fonctions de mailman sont bien séparées dans des scripts différents. === Configuration Générale === La configuration se trouve dans {{{/etc/mailman/mm_cfg.py}}}. Un lien symbolique pointe vers ce fichier depuis {{{/usr/lib/mailman/Mailman/mm_cfg.py}}}. Les scripts importent ce dernier. {{{mm_cfg.py}}} commence par importer toutes les variables définies dans {{{Defaults}}}. Regarder ce fichier donne des idées de ce que l'on redéfinit dans {{{mm_cfg.py}}}. === Configuration Postfix === C'est le serveur mail postfix sur readisdead qui reçoit tous les mails des mailinglists et qui les transmet à mailman. La méthode utilisée pour transmettre les mails est d'utiliser un transport postfix pipe qui pipe les mails destinés aux ML dans le programme `/var/lib/mailman/bin/postfix-to-mailman.py`. Des commentaires au début dudit fichier détaillent l'installation. En voici une copie : {{{ # This script is meant to be called as a postfix transport pipe. # It catches all mail to a virtual domain, eg "lists.example.com". It # looks at the recipient for each mail message and decides if the mail # is addressed to a valid list or not, and optionally bounces the # message with a helpful suggestion if it's not addressed to a # list. It decides if it is a posting, a list command, or mail to the # list administrator, by checking for the -admin, -owner, -request, # -join, -leave, -subscribe and -unsubscribe addresses. It will # recognize a list as soon as the list is created, there is no need to # add _any_ aliases for any list. It recognizes mail to postmaster, # abuse and mailer-daemon, and routes those mails to DEB_LISTMASTER as # defined in mm_cfg.py # INSTALLATION: # # Install this file as /var/lib/mailman/bin/postfix-to-mailman.py # # To configure a virtual domain to connect to mailman, edit Postfix thusly: # # /etc/postfix/main.cf: # relay_domains = ... lists.example.com # relay_recipient_maps = ... hash:/var/lib/mailman/data/virtual-mailman # transport_maps = hash:/etc/postfix/transport # mailman_destination_recipient_limit = 1 # # /etc/postfix/master.cf # mailman unix - n n - - pipe # flags=FR user=list # argv=/var/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user} # # /etc/postfix/transport: # lists.example.com mailman: # # /etc/mailman/mm_cfg.py # MTA = None # So that mailman skips aliases generation # POSTFIX_STYLE_VIRTUAL_DOMAINS = ['lists.example.com'] # # alias for postmaster, abuse and mailer-daemon # DEB_LISTMASTER = 'postmaster@example.com' # # Replace lists.example.com above with the name of the domain to be # connected to Mailman. Note that _all_ mail to that domain will go to # Mailman, so you don't want to put the name of your main domain # here. Typically a virtual domain lists.domain.com is used for # Mailman, and domain.com for regular email. # # The recipient map allows Postfix to know which addresses exists. # Thus, if someone tries to send a (spam?) message to an undefined # address in the domain connected to Mailman, Postfix will just refuse # it instead of sending a (backscatter?) bounce. # # When you are done, restart Postfix, and run /usr/lib/mailman/bin/genaliases # to generate the initial recipient map for the existing mailing-lists. }}} == Configuration d'une mailing-list == Chaque mailing-list peut avoir ses propres variables locales. Elles ne redéfinissent pas automatiquement les variables de {{{mm_cfg.py}}}, mais dans certains des scripts, la configuration globale n'est utilisée que si la mailing-list ne définit pas aussi la variable. Ces variables sont stockées automatiquement par mailman. Le plus simple pour connaitre ou modifier ces dernières est de lancer un script personnel avec la commande "{{{sudo /usr/lib/mailman/bin/config_list -i $CHEMIN_VERS_LE_SCRIPT $NOM_DE_LA_LISTE}}}". {{{mlist}}} est alors la liste demandée. === Handler === Lorsque mailman reçoit un mail, il le fait passer dans un pipeline de Handler. Chacun a sa fonction, allant du nettoyage d'entêtes, à l'envoi à tous les abonnées, en passant par un filtre à spams. Le script gérant cela est {{{/usr/lib/mailman/Mailman/Queue/IncomingRunner.py}}}, les handlers se trouvent dans {{{/usr/lib/mailman/Mailman/Handler}}}. Pour faire son propre handler le plus simple est de partir d'un déjà existant et de s'aider de cette [[http://www.python.org/cgi-bin/faqw-mm.py?req=show&file=faq04.067.htp|faq]]. Le plus important est d'ajouter le handler soit dans {{{mm_cfg.py}}} dans la liste {{{GLOBAL_PIPELINE}}}, soit dans la variable pipeline d'une mailing list pour qu'elle soit la seul à utiliser ce handler. Si cette variable n'existe pas déjà, ne pas oublier de copier {{{GLOBAL_PIPELINE}}} dans pipeline (voir {{{/usr/scripts/mailman/config_list_spamassassin_crans}}}). === Gui === L'interface web est aussi gérée en python, par les scripts de {{{Mailman/Cgi}}}. L'interface administrative fait aussi appel aux scripts de {{{Mailman/Gui}}} qui correspondent chacun à un onglet. Attention, l'ajout d'un script dans ce dossier ne suffit pas à le faire apparaître dans l'interface. Il faut l'ajouter dans les imports de {{{Mailman/Gui/__init__.py}}} et dans le fichier {{{mm_cfg.py}}} dans la liste {{{ADMIN_CATEGORIES}}}. Un script de Gui consiste surtout à donner le titre de la catégorie {{{ def GetConfigCategory(self): return 'spamassassin', _('En test :SpamAssassin options...') }}} et à renvoyer une liste de 6-uplets : {{{ def GetConfigInfo(self, mlist, category, subcat=None): if category <> 'spamassassin': return None return [( , , , , , ),( , , , , , )] }}} * Le nom de la variable à modifier * Le type de variable (nombre : mm_cfg.Number, texte : , multiline : ,...) * La taille de la zone * 0 * _('''Ma définition qui apparait à coté de la zone''') * _('''Ma définition plus précise si la personne demande plus d'informations''') Mailman s'occupe de tout le reste. Voir les scripts pour plus d'informations. Normalement les textes sont tous en anglais et il y a un système de traduction que l'on peut utiliser pour traduire en français. Mais le plus simple semble d'écrire directement en français. |
=== Mailman === Mailman 3 est gentiment packagé sous Debian, on se contente donc d'installer le paquet depuis APT. Les données de Mailman seront stockées dans {{{/var/lib/mailman3}}}. On prévoie donc un disque dédié monté sur ce chemin. Sur un Debian Bullseye propre, il suffit de faire : {{{ $ sudo apt update $ sudo apt install --no-install-recommends mailman3-full }}} Mailman est désormais déjà prêt à être configuré et utilisé :) Il est bon de vérifier néanmoins que le dossier {{{/var/lib/mailman3}}} appartient bien à {{{list:list}}}. Pour des raisons de confort d'utilisation d'un terminal Django, installer iPython via le paquet {{{python3-ipython}}} peut se révéler très pratique. === Installation de la base de données === Mailman est essentiellement séparé en deux cœurs : {{{mailman}}} qui gère les listes et {{{mailman-web}}} qui gère l'affichage web avec Django. Les deux parties ont besoin de leur propre base de données. Sur le serveur qui héberge [[CransTechnique/Services/PostGreSQL|PostgreSQL]] ([[CransTechnique/LesServeurs/ServeurTealc|tealc]] au Crans), il faut donc créer les deux bases de données : {{{ $ sudo -u postgres createuser -P mailman3 $ sudo -u postgres createdb -O mailman3 mailman3 $ sudo -u postgres createuser -P mailman3web $ sudo -u postgres createdb -O mailman3web mailman3web }}} On n'oublie pas d'autoriser les connexions dans {{{/etc/postgresql/11/main/pg_hba.conf}}} : {{{ host mailman3 mailman3 172.16.10.0/24 md5 host mailman3 mailman3 fd00:0:0:10::/64 md5 host mailman3web mailman3web 172.16.10.0/24 md5 host mailman3web mailman3web fd00:0:0:10::/64 md5 }}} === Configuration de Mailman === Sa configuration se trouve dans {{{/etc/mailman/mailman.cfg}}}, qui doit appartenir à {{{root:list}}} et avoir pour permissions {{{0640}}}. On définit dans la partie {{{[database]}}} les paramètres de connexion à la base de données : {{{ [database] class: mailman.database.postgresql.PostgreSQLDatabase url: postgres://mailman3:PASSWORD@172.16.10.1:5432/mailman3 }}} Dans la partie {{{[webservice]}}}, on définit un mot de passe pour la connexion à l'API nommé {{{admin_pass}}}. On configure enfin la réception et l'envoi de mails : {{{ [mta] incoming: mailman.mta.postfix.LMTP outgoing: mailman.mta.deliver.deliver smtp_host: localhost # Postfix lical smtp_port: 25 smtp_user: smtp_pass: lmtp_host: 127.0.0.1 lmtp_port: 8024 configuration: python:mailman.config.postfix }}} Les mails sont reçus localement par LMTP et pour l'envoi mailman s'adresse à son propre serveur Postfix. === Configuration de Hyperkitty === Hyperkitty est le service d'archivage de Mailman. Pour l'activer, il faut ajouter dans le fichier de configuration de Mailman : {{{ [archiver.hyperkitty] class: mailman_hyperkitty.Archiver enable: yes configuration: /etc/mailman3/mailman-hyperkitty.cfg }}} Et renseigner le mot de passe dans {{{/etc/mailman3/mailman-hyperkitty.cfg}}} : {{{ [general] base_url: http://localhost/hyperkitty/ api_key: {{ mailman3.archiver_key }} }}} === Configuration de Mailman-web === Sa configuration se trouve dans {{{/etc/mailman/mailman-web.py}}}, qui doit appartenir à {{{root:www-data}}} et avoir pour permissions {{{0640}}}. {{{ SECRET_KEY = '{{ mailman3.web_secret_key }}' ADMINS = ( ('Mailman Suite Admin', 'root@crans.org'), ) ALLOWED_HOSTS = [ "localhost", # Archiving API from Mailman, keep it. "mailman.crans.org", "lists.crans.org", ] # Mailman API credentials MAILMAN_REST_API_URL = 'http://localhost:8001' MAILMAN_REST_API_USER = 'restadmin' MAILMAN_REST_API_PASS = '{{ mailman3.restadmin_pass }}' MAILMAN_ARCHIVER_KEY = '{{ mailman3.archiver_key }}' MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1') INSTALLED_APPS = ( 'mailman_crans_theme', # override templates 'hyperkitty', 'postorius', 'django_mailman3', 'django.contrib.admin', 'django.contrib.admindocs', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'django_gravatar', 'compressor', 'haystack', 'django_extensions', 'django_q', 'allauth', 'allauth.account', 'allauth.socialaccount', 'allauth_cas', 'allauth_cas_crans', ) # Database configuration DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mailman3web', 'USER': 'mailman3web', 'PASSWORD': 'PASSWORD', 'HOST': '172.16.10.1', 'PORT': 5432, 'OPTIONS': { }, } } # Reverse-proxy configuration USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https') LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True EMAILNAME = 'crans.org' DEFAULT_FROM_EMAIL = f'contact@crans.org' SERVER_EMAIL = f'root@crans.org' ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https" SOCIALACCOUNT_PROVIDERS = { 'crans': {}, } COMPRESS_PRECOMPILERS = ( ('text/less', 'lessc {infile} {outfile}'), ('text/x-scss', 'sassc -t compressed {infile} {outfile}'), ('text/x-sass', 'sassc -t compressed {infile} {outfile}'), ) COMPRESS_OFFLINE = True POSTORIUS_TEMPLATE_BASE_URL = 'http://localhost/mailman3/' }}} Certains paramètres concernent la connexion au CAS, voir ci-dessous. === Connexion via le CAS === On souhaite que les adhérents se connectent sur l'interface web via le CAS du Crans. On comment pour cela par installer l'exension nécessaire pour {{{django-allauth}}}, qui n'existe malheureusement pas dans les paquets Debian, avec son module spécial Crans : {{{ $ sudo apt install --no-install-recommends python3-pip python3-lxml $ sudo pip3 install django-allauth-cas git+https://gitlab.crans.org/nounous/allauth-cas-crans.git }}} On ajoute alors le module {{{allauth_cas}}} et {{{allauth_cas_crans}}} aux applications installées (voir ci-dessus). On n'oubliera pas d'autoriser https://mailman.crans.org/ et https://lists.crans.org/ d'accéder au CAS. === Thèmes Crans personnalisés === De la même manière, on installe le paquet PIP personnalisé : {{{ $ sudo pip install git+https://gitlab.crans.org/nounous/mailman-crans-theme.git }}} Il suffit ensuite d'ajouter en première application {{{mailman_theme_crans}}} pour remplacer les thèmes par défaut. === Migration de la base de données, collecte des fichiers statiques === Pour migrer la base de données et créer les différentes tables, une fois Mailman bien configuré, il suffit de lancer : {{{ $ sudo -u www-data mailman-web migrate }}} Pour importer les fichiers statiques : {{{ $ sudo -u www-data mailman-web collectstatic }}} Et enfin, pour compresser et mettre en cache certaines ressources (afin d'optimiser le délai de réponse) : {{{ $ sudo -u www-data mailman-web compress }}} Toutes ces opérations sont à faire après chaque mise à jour de mailman. === Redémarrer mailman === Les services sont gérés par systemd : {{{ $ sudo systemctl restart mailman $ sudo systemctl restart mailman-web }}} === Définition du site === Par défaut, le site s'appelle {{{example.com}}}. On peut le changer en ligne de commande : {{{ $ sudo mailman-web shell_plus [1]: site = Site.objects.first() [2]: site.name = "Listes Crans" [3]: site.domain = "mailman.crans.org" [4]: site.save() }}} === Ajout d'un super-utilisateur === Avant d'avoir un super-utilisateur capable d'accéder à l'interface d'administration, on peut déjà essayer d'ajouter des droits en ligne de commande. On commande par ouvrir un shell Django : {{{ $ sudo mailman-web shell_plus }}} On peut ensuite récupérer l'utilisateur voulu et lui donner les droits super-utilisateur et les droits staff (nécessaires pour accéder à l'interface d'administration) : {{{ [1]: user = User.objects.get(username="ynerant") [2]: user.is_superuser = True [3]: user.is_staff = True [4]: user.save() }}} L'utilisateur a désormais les pleins pouvoirs sur la plateforme. === Postfix === ==== Configuration standard ==== On installe un serveur Postfix qui servira uniquement à recevoir les mails (comme indiqué plus haut, l'envoi des mails se fait en contactant directement redisdead). On commence par installer {{{postfix}}} : {{{ $ sudo apt install --no-install-recommends postfix }}} Sa configuration se fait dans {{{/etc/postfix/main.cf}}}. Le début de la configration est assez standard : {{{ # See /usr/share/postfix/main.cf.dist for a commented, more complete version # This postfix configuration set up a MTA only to send and receive mailing list mails # When a mail is sent to @localhost, this domain will be used myorigin = crans.org smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # Uncomment the next line to generate "delayed mail" warnings delay_warning_time = 4h # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on # fresh installs. compatibility_level = 2 # TLS parameters smtpd_tls_cert_file=/etc/letsencrypt/live/crans.org/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/crans.org/privkey.pem smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache # OpenDKIM smtpd_milters = inet:localhost:12301 non_smtpd_milters = inet:localhost:12301 # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. # Limit to 200Mo by message message_size_limit = 209715200 # Default aliases alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases # Only localhost mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 # Listen on IPv4 and IPv6 inet_interfaces = all inet_protocols = all # Do not use gethostname myhostname = mailman.adm.crans.org mydomain = crans.org # Softbounce, ask remote mail server to send the mail again if error # Do not keep it active in production! soft_bounce = no }}} On veillera en particulier à bien générer un certificat TLS via certbot nommé {{{crans.org}}}. On ajoute la configuration spécifique à Mailman 3 : {{{ # Mailman3 integration recipient_delimiter = + unknown_local_recipient_reject_code = 550 owner_request_special = no transport_maps = hash:/var/lib/mailman3/data/postfix_lmtp local_recipient_maps = hash:/var/lib/mailman3/data/postfix_lmtp relay_domains = hash:/var/lib/mailman3/data/postfix_domains }}} Il suffit ensuite de recharger Postfix. ==== Configuration de Open DKIM ==== DKIM permet de signer les messages afin d'attester qu'ils ont bien été émis depuis les serveurs du Crans. Dans les en-têtes de chaque message, une signature du message générée par une clé privée est ajoutée. La signature peut-être contrôlée par la clé publique accessible dans la zone DNS ({{{dig -t TXT lists._domainkey.lists.crans.org}}}). La clé publique du serveur Mailman est : {{{ "v=DKIM1; h=sha256; k=rsa; " "p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7jkgGjxZvQDbgFIuqb59lt7O1Jg6DFTSBxFlTfBW+3MF+AFjBR3AZ/UXwDA1vH4UTZqq0fWN6y6wqE/F7+HDjpqZGGuygZWTGVbBxwiKSjc2kq2mz7kLisE3a/jP8kyQDdb7fWrtTw9fxYu+Ygs0744otjRsui/ZK6zbrO8XQfd5UYnj4IGALeIuVFVLmwTY+VL/xWR/Ujcfxg" "AprRfH0ec8PGlrxhpeLhUSJxw3Q6QfTnDsIpWLfJdgxILGa58TmhH6d+faxa1OIP37wswPjkDykmMFsCQJX9P7mXXR0+1FIRhhNpfCRXXj37udbIezDEMfA15rWSoYinPU+x7i6LhfJD7G40p1oDBiaOimZ8D/PUDAtoWRQeFiNOOQmNqDaVwlaOMvIZH2ZFD2I0eJIDb2FBYqhTb5GVyhKPePqT5FZE0s8SXqvYRNUWHuomS79kfo4TC7" "4UPlavIbyCVTFlLi5ujc5RANm/FuH2w3ns1+YAlCeoblzwVdgN+h4/DI5kI88+0Hf+HCfQg+rPQL7ak7Wszo0iWvYUZ8t+IPbNDcVm5YI6koqkWGgfMrC0bDI5r+ZQACK15Fi6x3tV0umhytgRQWG9MyK61diNIc1LFsyL2lD0oOAjlpDlVSpUnXKhjRPq4YdaIojlgGSsWsq8sBhQTCY5DNHUuJLL1iPqsCAwEAAQ==" }}} Le support de DKIM est géré le service {{{opendkim}}} : {{{ sudo apt install --no-install-recommends opendkim opendkim-tools }}} Pour générer une paire de clés : {{{ sudo opendkim-genkey -s lists -d lists.crans.org }}} Le fichier {{{lists.txt}}} contient directement l'enregistrement TXT à rentrer dans les champs DNS. Ces clés sont à placer dans le dossier {{{/etc/opendkim/keys/lists.crans.org/}}}. Le dossier {{{/etc/opendkim/}}} doit appartenir à {{{opendkim:opendkim}}}, {{{/etc/opendkim/keys/}}} doit avoir pour permissions {{{0750}}} et les clés {{{0600}}}. Dans {{{/etc/opendkim/KeyTable}}} : {{{ lists._domainkey.lists.crans.org lists.crans.org:lists:/etc/opendkim/keys/lists.crans.org/lists.private }}} Dans {{{/etc/opendkim/SigningTable}}} : {{{ *@lists.crans.org lists._domainkey.lists.crans.org }}} Dans {{{/etc/opendkim/TrustedHosts}}} : {{{ 127.0.0.1 localhost ::1 138.231.136.0/21 138.231.144.0/21 10.231.136.0/24 10.2.9.0/24 2a0c:700:0:1::/64 2a0c:700:0:2::/64 2a0c:700:0:21::/64 2a0c:700:0:22::/64 2a0c:700:0:23::/64 *.crans.org *.crans.fr *.crans.eu }}} Pour charger ces fichiers de configuration, on ajoute dans {{{/etc/opendkim.conf}}} : {{{ ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts KeyTable refile:/etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable }}} ===== Lien Postfix - Open DKIM ===== On souhaite désormais que Postfix signe et vérifie les signatures avec DKIM. On démarre alors un socket d'écoute du serveur DKIM, en ajoutant dans {{{/etc/opendkim.conf}}} : {{{ socket inet:12301@localhost }}} Et il suffit d'ajouter dans {{{/etc/postfix/main.cf}}}, comme indiqué ci-dessus : {{{ smtpd_milters = inet:localhost:12301 non_smtpd_milters = inet:localhost:12301 }}} En rechargeant {{{postfix}}} et {{{opendkim}}}, les messages seront désormais signés. ==== Configuration du serveur mail principal ==== On souhaite que les mails soient reçus par le serveur mail principal, à savoir redisdead, afin de faire un premier tri et de gérer lui-même la sécurité des mails. On ajoute alors {{{redisdead.crans.org}}}, {{{freebox.crans.org}}} et {{{sputnik.crans.org}}} en serveurs MX pour {{{lists.crans.org}}}. Dans le fichier {{{/etc/postfix/main.cf}}}, on pense bien à ajouter {{{lists.crans.org}}} dans le champ {{{$mydestination}}} (et non {{{relay_domains}}} uniquement). Dans {{{/etc/postfix/transport}}}, on indique à postfix de transporter les mails envoyer sur une adresse {{{@lists.crans.org}}} sur le serveur de Mailman : {{{ lists.crans.org smtp:[172.16.10.110] }}} Après un rechargement de postfix, les mails sont prêts à être distribués ! == Migration == Les données de Mailman 2 vers Mailman 3 seront migrées prochainement. Le plan de migration est accessible sur la page [[/Migration]]. |
Mailman 3
Mailman 3 est encore en cours de déploiement, cette documentation risque d'évoluer dans les jours à venir. Le déploiement est prévu pour se faire dans la nuit du 11 au 12 avril 2021.
Sommaire
-
Mailman 3
-
Installation
- Mailman
- Installation de la base de données
- Configuration de Mailman
- Configuration de Hyperkitty
- Configuration de Mailman-web
- Connexion via le CAS
- Thèmes Crans personnalisés
- Migration de la base de données, collecte des fichiers statiques
- Redémarrer mailman
- Définition du site
- Ajout d'un super-utilisateur
- Postfix
- Migration
-
Installation
Mailman 3 est le service de listes de diffusions utilisé au Crans. Il vient remplacer Mailman 2, après près de 20 ans de bons et loyaux services.
Mailman est déployé sur le serveur mailman. L'interface web de Mailman est disponible sur https://lists.crans.org/ (à venir) ou sur https://mailman.crans.org/.
Les listes de diffusion sont dans le domaine @lists.crans.org (certaines ont des alias @crans.org).
Installation
Mailman
Mailman 3 est gentiment packagé sous Debian, on se contente donc d'installer le paquet depuis APT.
Les données de Mailman seront stockées dans /var/lib/mailman3. On prévoie donc un disque dédié monté sur ce chemin.
Sur un Debian Bullseye propre, il suffit de faire :
$ sudo apt update $ sudo apt install --no-install-recommends mailman3-full
Mailman est désormais déjà prêt à être configuré et utilisé Il est bon de vérifier néanmoins que le dossier /var/lib/mailman3 appartient bien à list:list.
Pour des raisons de confort d'utilisation d'un terminal Django, installer iPython via le paquet python3-ipython peut se révéler très pratique.
Installation de la base de données
Mailman est essentiellement séparé en deux cœurs : mailman qui gère les listes et mailman-web qui gère l'affichage web avec Django. Les deux parties ont besoin de leur propre base de données.
Sur le serveur qui héberge PostgreSQL (tealc au Crans), il faut donc créer les deux bases de données :
$ sudo -u postgres createuser -P mailman3 $ sudo -u postgres createdb -O mailman3 mailman3 $ sudo -u postgres createuser -P mailman3web $ sudo -u postgres createdb -O mailman3web mailman3web
On n'oublie pas d'autoriser les connexions dans /etc/postgresql/11/main/pg_hba.conf :
host mailman3 mailman3 172.16.10.0/24 md5 host mailman3 mailman3 fd00:0:0:10::/64 md5 host mailman3web mailman3web 172.16.10.0/24 md5 host mailman3web mailman3web fd00:0:0:10::/64 md5
Configuration de Mailman
Sa configuration se trouve dans /etc/mailman/mailman.cfg, qui doit appartenir à root:list et avoir pour permissions 0640.
On définit dans la partie [database] les paramètres de connexion à la base de données :
[database] class: mailman.database.postgresql.PostgreSQLDatabase url: postgres://mailman3:PASSWORD@172.16.10.1:5432/mailman3
Dans la partie [webservice], on définit un mot de passe pour la connexion à l'API nommé admin_pass.
On configure enfin la réception et l'envoi de mails :
[mta] incoming: mailman.mta.postfix.LMTP outgoing: mailman.mta.deliver.deliver smtp_host: localhost # Postfix lical smtp_port: 25 smtp_user: smtp_pass: lmtp_host: 127.0.0.1 lmtp_port: 8024 configuration: python:mailman.config.postfix
Les mails sont reçus localement par LMTP et pour l'envoi mailman s'adresse à son propre serveur Postfix.
Configuration de Hyperkitty
Hyperkitty est le service d'archivage de Mailman. Pour l'activer, il faut ajouter dans le fichier de configuration de Mailman :
[archiver.hyperkitty] class: mailman_hyperkitty.Archiver enable: yes configuration: /etc/mailman3/mailman-hyperkitty.cfg
Et renseigner le mot de passe dans /etc/mailman3/mailman-hyperkitty.cfg :
[general] base_url: http://localhost/hyperkitty/ api_key: {{ mailman3.archiver_key }}
Configuration de Mailman-web
Sa configuration se trouve dans /etc/mailman/mailman-web.py, qui doit appartenir à root:www-data et avoir pour permissions 0640.
SECRET_KEY = '{{ mailman3.web_secret_key }}' ADMINS = ( ('Mailman Suite Admin', 'root@crans.org'), ) ALLOWED_HOSTS = [ "localhost", # Archiving API from Mailman, keep it. "mailman.crans.org", "lists.crans.org", ] # Mailman API credentials MAILMAN_REST_API_URL = 'http://localhost:8001' MAILMAN_REST_API_USER = 'restadmin' MAILMAN_REST_API_PASS = '{{ mailman3.restadmin_pass }}' MAILMAN_ARCHIVER_KEY = '{{ mailman3.archiver_key }}' MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1') INSTALLED_APPS = ( 'mailman_crans_theme', # override templates 'hyperkitty', 'postorius', 'django_mailman3', 'django.contrib.admin', 'django.contrib.admindocs', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'django_gravatar', 'compressor', 'haystack', 'django_extensions', 'django_q', 'allauth', 'allauth.account', 'allauth.socialaccount', 'allauth_cas', 'allauth_cas_crans', ) # Database configuration DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mailman3web', 'USER': 'mailman3web', 'PASSWORD': 'PASSWORD', 'HOST': '172.16.10.1', 'PORT': 5432, 'OPTIONS': { }, } } # Reverse-proxy configuration USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https') LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True EMAILNAME = 'crans.org' DEFAULT_FROM_EMAIL = f'contact@crans.org' SERVER_EMAIL = f'root@crans.org' ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https" SOCIALACCOUNT_PROVIDERS = { 'crans': {}, } COMPRESS_PRECOMPILERS = ( ('text/less', 'lessc {infile} {outfile}'), ('text/x-scss', 'sassc -t compressed {infile} {outfile}'), ('text/x-sass', 'sassc -t compressed {infile} {outfile}'), ) COMPRESS_OFFLINE = True POSTORIUS_TEMPLATE_BASE_URL = 'http://localhost/mailman3/'
Certains paramètres concernent la connexion au CAS, voir ci-dessous.
Connexion via le CAS
On souhaite que les adhérents se connectent sur l'interface web via le CAS du Crans. On comment pour cela par installer l'exension nécessaire pour django-allauth, qui n'existe malheureusement pas dans les paquets Debian, avec son module spécial Crans :
$ sudo apt install --no-install-recommends python3-pip python3-lxml $ sudo pip3 install django-allauth-cas git+https://gitlab.crans.org/nounous/allauth-cas-crans.git
On ajoute alors le module allauth_cas et allauth_cas_crans aux applications installées (voir ci-dessus). On n'oubliera pas d'autoriser https://mailman.crans.org/ et https://lists.crans.org/ d'accéder au CAS.
Thèmes Crans personnalisés
De la même manière, on installe le paquet PIP personnalisé :
$ sudo pip install git+https://gitlab.crans.org/nounous/mailman-crans-theme.git
Il suffit ensuite d'ajouter en première application mailman_theme_crans pour remplacer les thèmes par défaut.
Migration de la base de données, collecte des fichiers statiques
Pour migrer la base de données et créer les différentes tables, une fois Mailman bien configuré, il suffit de lancer :
$ sudo -u www-data mailman-web migrate
Pour importer les fichiers statiques :
$ sudo -u www-data mailman-web collectstatic
Et enfin, pour compresser et mettre en cache certaines ressources (afin d'optimiser le délai de réponse) :
$ sudo -u www-data mailman-web compress
Toutes ces opérations sont à faire après chaque mise à jour de mailman.
Redémarrer mailman
Les services sont gérés par systemd :
$ sudo systemctl restart mailman $ sudo systemctl restart mailman-web
Définition du site
Par défaut, le site s'appelle example.com. On peut le changer en ligne de commande :
$ sudo mailman-web shell_plus [1]: site = Site.objects.first() [2]: site.name = "Listes Crans" [3]: site.domain = "mailman.crans.org" [4]: site.save()
Ajout d'un super-utilisateur
Avant d'avoir un super-utilisateur capable d'accéder à l'interface d'administration, on peut déjà essayer d'ajouter des droits en ligne de commande. On commande par ouvrir un shell Django :
$ sudo mailman-web shell_plus
On peut ensuite récupérer l'utilisateur voulu et lui donner les droits super-utilisateur et les droits staff (nécessaires pour accéder à l'interface d'administration) :
[1]: user = User.objects.get(username="ynerant") [2]: user.is_superuser = True [3]: user.is_staff = True [4]: user.save()
L'utilisateur a désormais les pleins pouvoirs sur la plateforme.
Postfix
Configuration standard
On installe un serveur Postfix qui servira uniquement à recevoir les mails (comme indiqué plus haut, l'envoi des mails se fait en contactant directement redisdead). On commence par installer postfix :
$ sudo apt install --no-install-recommends postfix
Sa configuration se fait dans /etc/postfix/main.cf. Le début de la configration est assez standard :
# See /usr/share/postfix/main.cf.dist for a commented, more complete version # This postfix configuration set up a MTA only to send and receive mailing list mails # When a mail is sent to @localhost, this domain will be used myorigin = crans.org smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # Uncomment the next line to generate "delayed mail" warnings delay_warning_time = 4h # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on # fresh installs. compatibility_level = 2 # TLS parameters smtpd_tls_cert_file=/etc/letsencrypt/live/crans.org/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/crans.org/privkey.pem smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache # OpenDKIM smtpd_milters = inet:localhost:12301 non_smtpd_milters = inet:localhost:12301 # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. # Limit to 200Mo by message message_size_limit = 209715200 # Default aliases alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases # Only localhost mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 # Listen on IPv4 and IPv6 inet_interfaces = all inet_protocols = all # Do not use gethostname myhostname = mailman.adm.crans.org mydomain = crans.org # Softbounce, ask remote mail server to send the mail again if error # Do not keep it active in production! soft_bounce = no
On veillera en particulier à bien générer un certificat TLS via certbot nommé crans.org.
On ajoute la configuration spécifique à Mailman 3 :
# Mailman3 integration recipient_delimiter = + unknown_local_recipient_reject_code = 550 owner_request_special = no transport_maps = hash:/var/lib/mailman3/data/postfix_lmtp local_recipient_maps = hash:/var/lib/mailman3/data/postfix_lmtp relay_domains = hash:/var/lib/mailman3/data/postfix_domains
Il suffit ensuite de recharger Postfix.
Configuration de Open DKIM
DKIM permet de signer les messages afin d'attester qu'ils ont bien été émis depuis les serveurs du Crans. Dans les en-têtes de chaque message, une signature du message générée par une clé privée est ajoutée. La signature peut-être contrôlée par la clé publique accessible dans la zone DNS (dig -t TXT lists._domainkey.lists.crans.org). La clé publique du serveur Mailman est :
"v=DKIM1; h=sha256; k=rsa; " "p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7jkgGjxZvQDbgFIuqb59lt7O1Jg6DFTSBxFlTfBW+3MF+AFjBR3AZ/UXwDA1vH4UTZqq0fWN6y6wqE/F7+HDjpqZGGuygZWTGVbBxwiKSjc2kq2mz7kLisE3a/jP8kyQDdb7fWrtTw9fxYu+Ygs0744otjRsui/ZK6zbrO8XQfd5UYnj4IGALeIuVFVLmwTY+VL/xWR/Ujcfxg" "AprRfH0ec8PGlrxhpeLhUSJxw3Q6QfTnDsIpWLfJdgxILGa58TmhH6d+faxa1OIP37wswPjkDykmMFsCQJX9P7mXXR0+1FIRhhNpfCRXXj37udbIezDEMfA15rWSoYinPU+x7i6LhfJD7G40p1oDBiaOimZ8D/PUDAtoWRQeFiNOOQmNqDaVwlaOMvIZH2ZFD2I0eJIDb2FBYqhTb5GVyhKPePqT5FZE0s8SXqvYRNUWHuomS79kfo4TC7" "4UPlavIbyCVTFlLi5ujc5RANm/FuH2w3ns1+YAlCeoblzwVdgN+h4/DI5kI88+0Hf+HCfQg+rPQL7ak7Wszo0iWvYUZ8t+IPbNDcVm5YI6koqkWGgfMrC0bDI5r+ZQACK15Fi6x3tV0umhytgRQWG9MyK61diNIc1LFsyL2lD0oOAjlpDlVSpUnXKhjRPq4YdaIojlgGSsWsq8sBhQTCY5DNHUuJLL1iPqsCAwEAAQ=="
Le support de DKIM est géré le service opendkim :
sudo apt install --no-install-recommends opendkim opendkim-tools
Pour générer une paire de clés :
sudo opendkim-genkey -s lists -d lists.crans.org
Le fichier lists.txt contient directement l'enregistrement TXT à rentrer dans les champs DNS.
Ces clés sont à placer dans le dossier /etc/opendkim/keys/lists.crans.org/. Le dossier /etc/opendkim/ doit appartenir à opendkim:opendkim, /etc/opendkim/keys/ doit avoir pour permissions 0750 et les clés 0600.
Dans /etc/opendkim/KeyTable :
lists._domainkey.lists.crans.org lists.crans.org:lists:/etc/opendkim/keys/lists.crans.org/lists.private
Dans /etc/opendkim/SigningTable :
*@lists.crans.org lists._domainkey.lists.crans.org
Dans /etc/opendkim/TrustedHosts :
127.0.0.1 localhost ::1 138.231.136.0/21 138.231.144.0/21 10.231.136.0/24 10.2.9.0/24 2a0c:700:0:1::/64 2a0c:700:0:2::/64 2a0c:700:0:21::/64 2a0c:700:0:22::/64 2a0c:700:0:23::/64 *.crans.org *.crans.fr *.crans.eu
Pour charger ces fichiers de configuration, on ajoute dans /etc/opendkim.conf :
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts KeyTable refile:/etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable
Lien Postfix - Open DKIM
On souhaite désormais que Postfix signe et vérifie les signatures avec DKIM. On démarre alors un socket d'écoute du serveur DKIM, en ajoutant dans /etc/opendkim.conf :
socket inet:12301@localhost
Et il suffit d'ajouter dans /etc/postfix/main.cf, comme indiqué ci-dessus :
smtpd_milters = inet:localhost:12301 non_smtpd_milters = inet:localhost:12301
En rechargeant postfix et opendkim, les messages seront désormais signés.
Configuration du serveur mail principal
On souhaite que les mails soient reçus par le serveur mail principal, à savoir redisdead, afin de faire un premier tri et de gérer lui-même la sécurité des mails.
On ajoute alors redisdead.crans.org, freebox.crans.org et sputnik.crans.org en serveurs MX pour lists.crans.org.
Dans le fichier /etc/postfix/main.cf, on pense bien à ajouter lists.crans.org dans le champ $mydestination (et non relay_domains uniquement).
Dans /etc/postfix/transport, on indique à postfix de transporter les mails envoyer sur une adresse @lists.crans.org sur le serveur de Mailman :
lists.crans.org smtp:[172.16.10.110]
Après un rechargement de postfix, les mails sont prêts à être distribués !
Migration
Les données de Mailman 2 vers Mailman 3 seront migrées prochainement. Le plan de migration est accessible sur la page /Migration.