Mise en place de Sympa

Nous allons utiliser Sympa, qui sait gérer les domaines virtuels. Entendons par là qu'il est assez simple de disposer d'une interface de gestion des listes pour chaque domaine virtuel, permettant ainsi de déléguer la gestion des listes à un « listmaster » différent pour chaque domaine virtuel hébergé.

Sympa est un robot éprouvé, qui est fourni dans la distribution Debian. Il dispose d'une documentation abondante et relativement compréhensible. Il sait gérer un grand nombre de listes, avec un grand nombre d'abonnés, propose une gestion fine des autorisations de diffusion comme des modes d'abonnement (à chaque message, à un résumé périodique, de périodicité paramétrable…)

Note : Sympa n'est pas un gadget, c'est un robot de diffusion très complexe et son installation peut présenter quelques difficultés.

Installation « deBase »

Dans cette installation, il n'y aura pas de domaines virtuels. La machine hôte s'appelle cyrus.nain-t.net, elle gère les messages pour le domaine nain-t.net et nos listes seront @lists.nain-t.net. Il faut bien commencer par le début.

Nous allons utiliser l'interface web de Sympa. Le module fastcgi d'apache est fortement recommandé (il est dans le dépôt non-free, la licence présentant quelques restrictions) :

aptitude install libapache2-mod-fastcgi

De plus, MySQL est nécessaire, mais nous l'avons déjà.

Puis nous installons Sympa, qui a beaucoup de dépendances :

aptitude install sympa

Nous utiliserons wwsympa, mais pas SOAP. Nous choisissons comme nom de domaine principal lists.nain-t.net. Il est donc nécessaire, si la machine s'appelle autrement (cyrus.nain-t.net dans notre cas), d'avoir un CNAME dans notre (nos) DNS.

# host lists.nain-t.net
lists.nain-t.net is an alias for cyrus.nain-t.net.
cyrus.nain-t.net has address 82.243.85.42

Le script d'installation pose un certain nombre de questions auxquelles il vaut mieux répondre correctement, mais il n'y a rien de définitif puisque la configuration sera par la suite modifiable dans /etc/sympa/sympa.conf. De plus, ce script doit pouvoir créer pour vous la base MySQL nécessaire.

Vérifications

A l'issue de l'installation, nous devons retrouver quelques éléments remarquables :

  • /etc/sympa est le répertoire de configuration. Il y a dedans un certain nombre de choses dont :
    • sympa.conf qui est le fichier de configuration principal du robot ;
    • wwsympa.conf pour la configuration de l'interface CGI ;
    • topics.conf qui contient la liste de classement par thème 1) des listes que nous pourrons créer. Son contenu est à modifier en fonction des besoins ;
  • /etc/mail/sympa.aliases est un fichier pour le moment vide, mais qui va se peupler avec la création de listes. Il est nécessaire que l'utilisateur sympa puisse y pénétrer et y écrire. Vérifiez donc que sympa est bien propriétaire du répertoire /etc/mail

Ce fichier d'alias, si l'on décide de l'utiliser, va nous imposer un mode de configuration de Postfix qui n'est pas optimal, mais qui nous évitera de devoir intervenir sur main.cf à chaque création ou suppression de liste de diffusion.

Voici un exemple de fichier sympa.conf :

## Configuration file for Sympa
## many parameters are optional (defined in src/Conf.pm)
## refer to the documentation for a detailed list of parameters

###\\\\ Directories and file location ////###

## Directory containing mailing lists subdirectories
home	/var/lib/sympa/expl

## Directory for configuration files ; it also contains scenari/ and templates/ directories
etc	/etc/sympa

## File containing Sympa PID while running.
## Sympa also locks this file to ensure that it is not running more than once. Caution : user sympa need to write access without special privilegee.
pidfile	/var/run/sympa/sympa.pid

## Umask used for file creation by Sympa
umask	027

## The main spool containing various specialized spools
## All spool are created at runtime by sympa.pl
spool	/var/spool/sympa

## Incoming spool
queue	/var/spool/sympa/msg

## Bounce incoming spool
queuebounce	/var/spool/sympa/bounce

###\\\\ Syslog ////###

## The syslog facility for sympa
## Do not forget to edit syslog.conf
syslog `/bin/cat /etc/sympa/facility`

## Communication mode with syslogd is either unix (via Unix sockets) or inet (use of UDP)
log_socket_type	unix

## Log intensity
## 0 : normal, 2,3,4 for debug
log_level	0

###\\\\ General definition ////###

## Main robot hostname
domain		lists.nain-t.net

## Listmasters email list comma separated
## Sympa will associate listmaster privileges to these email addresses (mail and web interfaces). Some error reports may also be sent to these addresses.
listmaster		sysop@nain-t.net

## Local part of sympa email adresse
## Effective address will be [EMAIL]@[HOST]
email	sympa

## Default lang (cs | de | el | en_US | fr | hu | it | ja_JP | nl | oc | pt_BR | tr)
lang		fr

## Who is able to create lists
## This parameter is a scenario, check sympa documentation about scenarios if you want to define one
create_list	public_listmaster

## Secret used by Sympa to make MD5 fingerprint in web cookies secure
## Should not be changed ! May invalid all user password
cookie `/bin/cat /etc/sympa/cookie`

###\\\\ Errors management ////###

## Bouncing email rate for warn list owner
#bounce_warn_rate	20

## Bouncing email rate for halt the list (not implemented)
## Not yet used in current version, Default is 50
#bounce_halt_rate	50

## Task name for expiration of old bounces
#expire_bounce_task	daily

## Welcome message return-path
## If set to unique, new subcriber is removed if welcome message bounce
#welcome_return_path	unique

###\\\\ MTA related ////###

## Path to the MTA (sendmail, postfix, exim or qmail)
## should point to a sendmail-compatible binary (eg: a binary named 'sendmail' is distributed with Postfix)
sendmail	/usr/sbin/sendmail

## Maximum number of recipients per call to Sendmail. The nrcpt_by_domain.conf file allows a different tuning per destination domain.
nrcpt	25

## Max. number of different domains per call to Sendmail
avg	10

## Max. number of Sendmail processes (launched by Sympa) running simultaneously
## Proposed value is quite low, you can rise it up to 100, 200 or even 300 with powerfull systems.
maxsmtp	40

###\\\\ Pluggin ////###

## Path to the antivirus scanner engine
## supported antivirus : McAfee/uvscan, Fsecure/fsav, Sophos, AVP and Trend Micro/VirusWall
#antivirus_path	/usr/local/uvscan/uvscan

## Antivirus pluggin command argument
#antivirus_args	--secure --summary --dat /usr/local/uvscan

###\\\\ S/MIME pluggin ////###

## Path to OpenSSL
## Sympa knowns S/MIME if openssl is installed
#openssl	/usr/local/bin/openssl

## The directory path use by OpenSSL for trusted CA certificates
#capath	/etc/sympa/ssl.crt

##  This parameter sets the all-in-one file where you can assemble the Certificates of Certification Authorities (CA)
#cafile	/usr/local/apache/conf/ssl.crt/ca-bundle.crt

## User CERTs directory
ssl_cert_dir	/var/lib/sympa/x509-user-certs

## Password used to crypt lists private keys
#key_passwd	your_password

###\\\\ Web interface ////###

## Sympa's main page URL
wwsympa_url http://lists.nain-t.net/wws

## Supported languages for the user interface
supported_lang	en_US,fr,

#-- Database configuration begin
# DO NOT REMOVE SURROUNDING COMMENTS

# DO NOT EDIT BY HAND
# USE dpkg-reconfigure -plow sympa TO RECONFIGURE

## Database driver (DBD)
db_type		mysql

## Name of your database
db_name		sympa

## Your database hostname
db_host		localhost

## Username to connect to the DB
db_user		sympa

## Password for the user
db_passwd		epikoi

#-- Database configuration end

Les passages surlignés représentent les paramètres indiqués lors du déroulement du script d'installation.

Vous désirerez sans doute aussi modifier le titre de l'interface cgi de sympa. Il faut dans ce cas modifier dans le fichier wwsimpa.conf :

## Title of main web page
title	Les listes de nain-t.net

Après toute modification de la configuration de sympa, il faut relancer sympa et apache.

Apache

Autant prévoir l'avenir et préparer un serveur virtuel, qui répondra dans un premier temps au doux nom de lists.nain-t.net et qui sera configuré pour faire fonctionner proprement wwsympa.fcgi

Dans /etc/apache2/sites-avalable/, nous créons par exemple un fichier nommé sympa qui contient quelque chose comme ceci :

<VirtualHost *>
      ServerAdmin webmaster@nain-t.net
      DocumentRoot /var/www/lists.net
      ServerName lists.nain-t.net
      <Directory /usr/lib/cgi-bin/sympa>
          SetHandler fastcgi-script
      </Directory>
      Alias /static-sympa /var/lib/sympa/static_content
      Alias /icons /usr/share/sympa/icons
      <Directory /var/lib/sympa/static_content>
          Order allow,deny
          Allow from all
      </directory>
      ScriptAlias /wws /usr/lib/cgi-bin/sympa/wwsympa.fcgi
</VirtualHost>

Puis :

# a2ensite sympa

pour créer le lien dans le répertoire /etc/apache2/sites-enabled (Nous somme toujours sous Debian n'est-ce pas), et enfin :

# apache2 graceful

pour actualiser Apache. Une connexion sur http://lists.nain-t.net/wws devrait nous montrer l'interface de notre gestionnaire de liste.

Attention ! Il pourra se faire que www-data n'ait pas le droit de lecture sur les feuilles de style qui se trouvent dans /var/lib/sympa/static_content/css.

Enfin, pour que ce soit encore plus propre, nous pouvons prévoir une page d'accueil index.html que nous mettrons dans la racine de notre domaine virtuel, qui redirigera automatiquement sur le script cgi :

<html>
  <head>
    <meta http-equiv="refresh" content="0; url=wws/">
  </head>
  <body>
  </body>
</html>

C'est parti 2) : Page d'accueil de Sympa

Présentation rapide

Nous n'allons pas entrer dans les détails du fonctionnement de sympa. Cependant il y a quelques choses à savoir pour pouvoir démarrer :

  • l'interface « anonyme » que nous voyons ici ne permet pas de faire grand chose, ce n'est rien d'autre qu'un portail qui permet aux visiteurs de consulter la liste des listes de diffusions déclarées comme publiques, et éventuellement de demander à s'abonner à certaines d'entre elles ;
  • dans notre sympa.conf, nous avons déclaré sysop@nain-t.net comme étant le listmaster, mais nous ne l'avons pas pour autant enregistré dans la base de données. La procédure à suivre est donc celle-ci :
    • s'inscrire sur le site avec l'adresse sysop@nain-t.net, ce qui provoquera l'envoi d'un message sur cette adresse, contenant un mot de passe ;
    • s'identifier sur le portail avec l'adresse sysop@nain-t.net et le mot de passe reçu.

L'identification fera alors apparaitre plus de fonctionnalités sur le portail, principalement dans ce cas, les outils d'administration des listes : Le portail de l'administrateur

D'une manière générale, tout abonné à une liste et qui se sera enregistré sur le site disposera d'un « login » lui permettant d'accéder au portail avec des droits adaptés à sa fonction :

  • simple abonné ;
  • propriétaire d'une liste ;
  • modérateur ;
  • administrateur des listes.

Sympa est hautement configurable à tous les niveaux. En passant un peu( voire beaucoup) de temps à consulter la documentation, il doit être possible d'arriver à maitriser ce robot.

Et ça marche ?

Non, bien sûr. Pour l'instant, il est possible de :

  • s'inscrire sur le site ;
  • créer une liste (ou demander sa création si l'on n'est pas « listmaster ») ;
  • recevoir les notifications de Sympa associées à ces actions.

Sympa est fait pour fonctionner avec la plupart des MTA connus Sendmail, Postfix, Exim et même Qmail. A ce titre, son installation ne prend guère d'initiative concernant la configuration du MTA. Même si une liste est créée, elle ne pourra pas fonctionner, Postfix n'étant pas au courant de son existence.

La seule chose qui est faite lors de la création d'une liste (test0 dans notre exemple), c'est l'ajout de quelques alias dans /etc/mail/sympa.aliases :

# cat /etc/mail/sympa.aliases
## List aliases used for the sympa mailing-list manager
#------------------------------ test0: list alias created 04 Jul 2008
test0: "| /usr/lib/sympa/bin/queue test0@lists.nain-t.net"
test0-request: "| /usr/lib/sympa/bin/queue test0-request@lists.nain-t.net"
test0-editor: "| /usr/lib/sympa/bin/queue test0-editor@lists.nain-t.net"
#test0-subscribe: "| /usr/lib/sympa/bin/queue test0-subscribe@lists.nain-t.net"
test0-unsubscribe: "| /usr/lib/sympa/bin/queue test0-unsubscribe@lists.nain-t.net"
test0-owner: "| /usr/lib/sympa/bin/bouncequeue test0@lists.nain-t.net"

Ah tiens, pourquoi l'alias concernant le traditionnel « subscribe » est-il mis en commentaire ? Sans doute pour amener les gens à utiliser plutôt l'interface cgi. Mais comment revenir sur ce paramétrage si nous le souhaitons ? C'est un secret, qui vous sera révélé plus tard…

/usr/lib/sympa/bin/queue, c'est, l'équivalent du MDA, mais pour les messages à destination de la liste de diffusion. Autrement dit, nous devons, avec ce qui est écrit dans ce fichier, arriver à ce que Postfix comprenne que les messages adressés à :

  • test0@lists.nain-t.net
  • test0-request@lists.nain-t.net
  • test0-editor@lists.nain-t.net
  • test0-unsubscribe@lists.nain-t.net

Soient non pas transmis à Cyrus, mais au programme /usr/lib/sympa/bin/queue de Sympa. De même, les messages à test0-owner@lists.nain-t.net devront être transmis au programme /usr/lib/sympa/bin/bouncequeue

Ce fichier est donc un fichier d'alias classique, qu'il faut transmettre à Postfix par la directive alias_maps, en plus des alias déjà indiqués :

alias_maps = hash:/etc/aliases, hash:/etc/mail/sympa.aliases

Oui mais voilà, le fichier indexé /etc/mail/sympa.aliases.db n'a sans doute pas été créé et dans les logs de sympa, après création de la liste, un message d'erreur doit l'indiquer.

Pourquoi tant de haine ?

Lorsque nous créons une nouvelle liste avec l'interface cgi, /etc/mail/sympa.aliases est mis à jour, puis un petit utilitaire, aliaswrapper est invoqué pour lancer la commande newaliases, chargée de synchroniser sympa.aliases.db avec sympa.aliases.db.

Il y a (au moins) deux raisons pour lesquelles ce dispositif peut ne pas fonctionner :

  • newaliases prend l'identité du propriétaire du fichier source à traiter qui est ici sympa. Sympa doit donc pouvoir écrire dans /etc/mail. Ceci a déjà été dit plus haut ;
  • newaliases traite le fichier spécifié par le paramètre de configuration alias_database dans main.cf de Postfix. Hors, qu'avons nous dans le main.cf ?
alias_database = hash:/etc/aliases

Qu'il nous faut donc remplacer par :

alias_database = hash:/etc/mail/sympa.aliases

Si ces deux points sont vérifiés, le wwsympa.fcgi devrait dans l'avenir gérer correctement les alias qu'il crée. En attendant, un :

postalias /etc/mail/sympa.aliases

devrait permettre de rendre notre liste0 (presque) opérationnelle. Car sommes nous certains que Postfix va reconnaitre la destination @lists.nain-t.net comme locale ?

Pour anticiper un peu sur l'avenir (peuplé de domaines virtuels), plutôt que de l'indiquer « en dur » dans le paramètre mydestination, voyons si ce ne serait pas possible de piquer l'information dans la base de données MySQL nécessaire à Sympa, elle y est certainement. Une investigation rapide dans la base montre que :

mysql> select robot_admin from admin_table;
+------------------+
| robot_admin      |
+------------------+
| lists.nain-t.net | 
+------------------+
1 row in set (0.01 sec)

Donc, un fichier que nous appellerons par exemple /etc/postfix/db/lists_destinations.cf qui contiendrait ceci :

hosts = 127.0.0.1
user = sympa
password = epikoi
dbname = sympa
query = SELECT robot_admin FROM admin_table WHERE robot_admin = '%s' limit 1

Le limit 1 est nécessaire car sans cette limite, si nous créons n listes dans le domaine nain-t.net, la requête sortira n occurrences. Il ne reste plus qu'à ajouter l'appel à ce fichier dans notre main.cf :

mydestination = $myhostname,
  localhost, localhost.localdomain,
  mysql:/etc/postfix/db/mydestination.cf,
  mysql:/etc/postfix/db/lists_destinations.cf

Et de demander à Postfix de relire sa configuration.

(Le fichier /etc/postfix/db/mydestination.cf a été vu dans « Postfix avec Cyrus »).

Résumé d'intervention

Nous nous sommes assurés que sympa sait lire et écrire dans /etc/mail et nous avons modifié /etc/mostfix/main.cf comme suit :

alias_maps = hash:/etc/aliases, hash:/etc/mail/sympa.aliases
alias_database = hash:/etc/mail/sympa.aliases

Puis nous avons synchrinisé le hash des alias générés par sympa avec la commande :

postalias /etc/mail/sympa.aliases

Ceci ne devrait plus être nécessaire par la suite.

Enfin, nous avons agi sur le mydestination de Postfix en créant un fichier de requête /etc/postfix/db/lists_destinations.cf sur la base MySQL de Sympa :

hosts = 127.0.0.1
user = sympa
password = epikoi
dbname = sympa
query = SELECT robot_admin FROM admin_table WHERE robot_admin = '%s' limit 1

et avons modifié le paramètre mydestination dans notre main.cf comme ceci :

mydestination = $myhostname,
  localhost, localhost.localdomain,
  mysql:/etc/postfix/db/mydestination.cf,
  mysql:/etc/postfix/db/lists_destinations.cf

C'est tout ?

Si nous n'avons pas de listes à gérer dans d'autres domaines oui, mais ce n'est pas le cas. Il nous reste à voir comment réaliser une configuration fonctionnelle pour plusieurs domaines.

1)
Sympa permet de classer les listes de diffusion par thèmes. Une liste de thèmes est fournie par défaut dans le fichier topics.conf mais ne conviendra sans doute pas à nos attentes. Il convient donc de le modifier selon nos besoins, en respectant sa syntaxe qui est d'une grande simplicité
2)
Le lecteur attentif et qui chercherait à réaliser l'installation constatera que le Sympa illustré ici est en version 5.3.4 alors que Debian Etch fournit la version 5.2.3. Nous verrons plus loin comment réaliser ceci. L'opération permet de disposer d'une version de Sympa qui gère correctement UTF-8, ce qui n'est pas le cas de la 5.2.3.