Postfix et Archiveopteryx (SMTP & IMAP) avec encryption SASL et authentification TLS

Ce document est en cours de rédaction.

Alors, on fait quoi aujourd'hui ?

Cette documentation a pour objectif de faire la lumière sur les services mails, en comprendre les rouages et de les mettre en œuvre en utilisant postfix comme MTA et Archiveopteryx en MDA. Ces deux services proposerons aux clients dont le MUA le supporte l'encrytion TLS pour la confidentialité ainsi que l'authentification SASL pour la sécurité.

Ces choix logiciels ont été décidé unilatéralement par le rédacteur de cet article pour les raisons suivantes (ASPA) :

  1. Postfix
    • performant
    • suffisamment documenté
    • trés répandu, bon support, bonne communauté
    • trés souple et configurable
  2. Archiveopteryx
    • utilisation d'une base de donnée pour le stockage des mails
    • utilisation de PostgreSQL
    • aucune limites de stockage, extension, utilisation
    • dossier virtuels
    • support SIEVE
    • bonne documentation

Comment faire du mail avec des briques de Légo©

Mettre en place un service mail, c'est un peu comme de jouer avec une boite de Légo©, il faut plusieurs briques pour construire le tout : MTA, MDA, antivirus, anti-spam, etc. Et comme nous sommes tous les deux pieds dans le libre, nous avons bien entendu un certain choix logiciel pour chacune de ces briques…Nous allons donc tenter détailler un peu la voie que va prendre ce document.

D'emblée, on exclus les anti-spam / antivirus. Je préfère nous concentrer sur une mise en place d'un service efficace, souple, sécure, évolutif et simple à comprendre. Une fois tout bien assimilé, nous aurons alors plus de facilité à y insérer ces nouvelles pièces de Légo©.

Comme indiqué en introduction, Archiveopteryx (aka Aox dans le reste de ce document) sera utilisé en tant que LTMP, IMAP et pour le stockage des emails. Ici, pas de maildir ou mbox en vue.

Postfix quand à lui occupera son rôle de SMTP. Aox propose aussi ce service, mais celui-ci est bien moins souple et évolué.

Ceci étant dit, jetons nous dans la description précise des rôles de chacune des briques et comment elles vont s'insérer les unes dans les autres.

Principe

Aox

La fondation de l'ensemble de notre service mail.

base utilsateur/pass, base des mails, imap en sasl, lmtp

TODO

Postfix

smtpd en tls + sasl pour délivrer vers le monde, smtpd pour réception des mails du monde aux utilisateurs, utilisation de la base utilisateur/pass de Aox.

TODO

« Déssine moi un Mout^WSchéma »

T'as pas tout compris ? Moi non plus…Alors essayons de déssiner quelque chose de clair…

Voici donc un schéma que nous allons éclaircir dans les prochaines lignes :

Le schéma ci-dessous détail la configuration de notre serveur s'occupant du domaine “corpo.com”.

Réception de courier depuis un domaine distant (World -> MTA -> Users)

Nous observons Jacques-henry, du domaine luser.com, désirant envoyer un mail à une personne du domaine corpo.com. Pour celà, il se connecte au serveur SMTP de luser.com et lui confie son précieux mail à acheminer (flèche 1 ).

Obéissant, le serveur SMTP de luser.com recherche et se connecte à son collègue de corpo.com pour lui transmettre le mail de Jacques-henry (flèche 1').

Dans ce cas détaillé, notre courageux Postfix sait bien que cet inconnu distant n'est ni authentifié, ni sécurisé. Aussi, ce dernier devra alors obligatoirement lui transmettre un mail à destination de son protégé domaine corpo.com sous peine de voir son mail détruit sans sommation (mais en informant luser.com tout de même). Nous reviendrons dessus plus tard.

Émission d'un mail (Users -> MTA -> World)

Notre trés éfficace Marie-chantale a décidé d'envoyer un mail aujourd'hui. Son MUA est bien entendu configuré pour acheminer ses mails via notre SMTP corpo.com, avec chiffrement ET authentification (flèche 2).

Dans cette situation, Postfix ayant reconnu un de ses fidèle utilisateurs (authentification) et comme personne n'écoute aux porte, il accèptera tout de Marie-chantale (le chanceux) : Délivrer un mail pour un collègue de corpo.com et même vers n'importe quel autre domaine (flèche 4 sous condition qu'il existe).

Consultation des mails (Users <-> MDA)

Nous avons décidé de n'activer que l'IMAP sur notre serveur. Ainsi, en 3, nous pouvons assister à un connexion de Marie-Chantale qui désire consulter ses mails. Cette fois, c'est bien Aox qui va lui répondre. Et en sa qualité de cerbère des mails de ses utilisateurs il imposera les formalités de négociation d'encrytion (TSL) et d'authentification (SASL).

Schema a fignoler/completer + TODO

« Il est moche ton schéma »

Oui, il est tout à fait possible de faire autrement, mais moi, j'ai fais comme ça ! Autre possibilités de construction avec votre boite de Légo© : TODO

Archiveopteryx (MDA)

Installation

Archiveopteryx, en plus d'être un ovni dans le monde des MTP/MDA, se paie le luxe du hors norme en n'utilisant pas le classique Makefile si cher à notre fidèle compagnon make pour la construction de projet… Aox utilise jam et comme les développeurs s'en expliquent sur son site, je ne ferais pas cet effort de répetition ici.

Notez que les développeurs, plein de compassion, fournissent tout de même un Makefile pour les refractaires qui fera aussi son affaire. Cependant, ayant fait le choix de jam, la suite de cette documentation détaillera la configuration des options de constructions de jam seulement.

Voici donc les quelques outils nécessaires à une construction sans histoire de aox :

# aptitude install jam g++ zlib1g-dev

Téléchagez les dernières sources de aox (ici), décompressez les où bon vous semble et placez vous dans ce répertoire fraichement décompressé (nommons le aox).

Par défaut, Aox va aller s'installer dans /usr/local/archiveopteryx, ec qui pourrait trés bien vous satisfaire, mais pas moi. Je suis un peu chargé de reflexes débianneux et je me sens frustré d'aller trop régulièrement dans /usr/local. Éditons donc Jamsettings pour avoir une installation un peu plus Debian compliant (je me suis efforcé de laisser commentées les valeurs par défaut que j'ai modifié) :

# This file contains compile-time configuration variables. Most of
# these are compiled into the binaries. A few may be overridden at
# runtime using archiveopteryx.conf.
#
# Remember the spaces around '=' and before ';'.
## Files and directories. The directory names MUST NOT end with /.
# Prepended to directory names during installation, but not during use.
#
INSTALLROOT ?= "" ;
# A convenient prefix used by most directory and file names,.
#
#PREFIX ?= /usr/local/archiveopteryx ;
PREFIX ?= /usr ;
# The directory for user and sysadmin tools
#
BINDIR = $(PREFIX)/bin ;
# The directory where the servers are installed
#
SBINDIR = $(PREFIX)/sbin ;
# The directory where the man pages are installed
#
#MANDIR = $(PREFIX)/man ;
MANDIR = $(PREFIX)/share/man ;
# Supporting files
#
#LIBDIR = $(PREFIX)/lib ;
LIBDIR = $(PREFIX)/lib/aox ;
# The startup/shutdown script's directory
#
#INITDIR = $(LIBDIR) ;
INITDIR = /etc/init.d ;
# Where to write pid files for the servers
#
#PIDFILEDIR ?= /var/run/oryx ;
PIDFILEDIR ?= /var/run/aox 
# The servers chroot to an empty, unreadable jail directory at
# startup.
#
JAILDIR = /srv/jail/aox ;
# This is the default message-copy-directory.
#
MESSAGEDIR = $(PREFIX)/messages ;
# The directory where the configuration file is located.
#
#CONFIGDIR = $(PREFIX) ;
CONFIGDIR = /etc/aox ;
# The directory where the README and other files are installed.
#
#READMEDIR = $(PREFIX) ;
READMEDIR = /usr/share/doc/aox ;
# The log file's default name. (This is the only configurable file
# name, all the others are directory names.)
#
#LOGFILE = $(PREFIX)/logfile ;
LOGFILE = /var/log/aox/logfile ;
# The default mode for the log file.
#
#LOGFILEMODE ?= 400 ;
LOGFILEMODE ?= 440 ;
# The user and group needed.
AOXUSER ?= aox ;
#AOXGROUP ?= aox ;
AOXGROUP ?= adm ;
# How to compile
C++FLAGS = -g -Werror -funsigned-char ;
LINKFLAGS = -g ;
# Mode for installed binaries
EXEMODE ?= 555 ;
# Uncomment the next line to use a cryptlib from the system. The
# default is to use the one bundled with the archiveopteryx source.
# USE_SYSTEM_CRYPTLIB = yes ;
# You may also need to add/change something in tlsproxy/Jamfile.
## Database settings.
# The Unix username of the PostgreSQL superuser.
#
#PGUSER ?= postgres ;
# The path to the psql(1) client. The default value assumes that it is
# somewhere in the PATH.
#
PSQL ?= psql ;
# The address of the Postgres server. This is the default value of
# the db-address variable in archiveopteryx.conf, and may be the
# fully-qualified Unix socket path, or an IPv4/6 address.
#
DBADDRESS ?= 127.0.0.1 ;
# By default, LIBDIR/installer will create a Postgres user and database,
# and an unprivileged database user for the servers to use. If you want
# to use an existing user or database, set the variables below.
#
# Notes:
#
# - DBOWNER must own the DBNAME database.
# - Because Postgres likes to use ident authentication, we use AOXUSER
#   as both Unix user and unprivileged database user.
# - The installer will generate a password for both users, so you don't
#   have to set one here unless you want to use an existing user.
#
# These settings correspond to the db-name, db-owner, db-owner-password,
# and db-password variables in archiveopteryx.conf. The value of db-user
# is derived from AOXUSER (but you can specify a different username when
# you run the installer).
#
#DBNAME ?= archiveopteryx ;
DBNAME ?= aox ;
DBOWNER ?= aoxsuper ;
DBOWNERPASS ?= "" ;
DBPASS ?= "" ;
# this file is included from Jamrules.

Et voilà, construisons tout le toutim :

/aox # jam
...patience...
[...]

Il est temps d'installer le fruit de cette construction (je me suis permis de laisser la sortie complète afin de bien constater que tout va aux bon endroits) :

/aox # jam install
...patience...
...found 1984 target(s)...
...updating 53 target(s)...
Install /usr/bin/deliver
Chmod1 /usr/bin/deliver
MkDir1 /usr/share/doc/aox
EngraveConfig build/gcc-O3/README
Install /usr/share/doc/aox/README
Chmod1 /usr/share/doc/aox/README
EngraveConfig build/gcc-O3/COPYING
Install /usr/share/doc/aox/COPYING
Chmod1 /usr/share/doc/aox/COPYING
EngraveConfig build/gcc-O3/osl-3.0.txt
Install /usr/share/doc/aox/osl-3.0.txt
Chmod1 /usr/share/doc/aox/osl-3.0.txt
Install /usr/share/man/man5/archiveopteryx.conf.5
Chmod1 /usr/share/man/man5/archiveopteryx.conf.5
Install /usr/share/man/man5/aoxsuper.conf.5
Chmod1 /usr/share/man/man5/aoxsuper.conf.5
Install /usr/share/man/man7/oryx.7
Chmod1 /usr/share/man/man7/oryx.7
Install /usr/share/man/man8/aoximport.8
Chmod1 /usr/share/man/man8/aoximport.8
Install /usr/share/man/man8/aox.8
Chmod1 /usr/share/man/man8/aox.8
Install /usr/share/man/man8/archiveopteryx.8
Chmod1 /usr/share/man/man8/archiveopteryx.8
Install /usr/share/man/man8/deliver.8
Chmod1 /usr/share/man/man8/deliver.8
Install /usr/share/man/man8/installer.8
Chmod1 /usr/share/man/man8/installer.8
Install /usr/share/man/man8/logd.8
Chmod1 /usr/share/man/man8/logd.8
Install /usr/share/man/man8/ocd.8
Chmod1 /usr/share/man/man8/ocd.8
Install /usr/share/man/man8/recorder.8
Chmod1 /usr/share/man/man8/recorder.8
Install /usr/share/man/man8/tlsproxy.8
Chmod1 /usr/share/man/man8/tlsproxy.8
Install /usr/sbin/ocd
Chmod1 /usr/sbin/ocd
Install /usr/sbin/logd
Chmod1 /usr/sbin/logd
Install /usr/bin/aox
Chmod1 /usr/bin/aox
Install /usr/sbin/recorder
Chmod1 /usr/sbin/recorder
MkDir1 /usr/lib/aox
EngraveConfig build/gcc-O3/schema.pg
Install /usr/lib/aox/schema.pg
Chmod1 /usr/lib/aox/schema.pg
EngraveConfig build/gcc-O3/flag-names
Install /usr/lib/aox/flag-names
Chmod1 /usr/lib/aox/flag-names
EngraveConfig build/gcc-O3/field-names
Install /usr/lib/aox/field-names
Chmod1 /usr/lib/aox/field-names
EngraveConfig build/gcc-O3/grant-privileges
Install /usr/lib/aox/grant-privileges
Chmod1 /usr/lib/aox/grant-privileges
EngraveConfig build/gcc-O3/fts.pg
Install /usr/lib/aox/fts.pg
Chmod1 /usr/lib/aox/fts.pg
EngraveConfig /etc/init.d/archiveopteryx
Chmod1 /etc/init.d/archiveopteryx
MkDir1 /usr/lib/aox
MkDir1 /usr/lib/aox/contrib
EngraveConfig /usr/lib/aox/contrib/rrdglue
Chmod1 /usr/lib/aox/contrib/rrdglue
Install /usr/sbin/tlsproxy
Chmod1 /usr/sbin/tlsproxy 
Install /usr/lib/aox/installer
Chmod1 /usr/lib/aox/installer 
Install /usr/sbin/archiveopteryx
Chmod1 /usr/sbin/archiveopteryx
Install /usr/bin/aoximport
Chmod1 /usr/bin/aoximport
MkDir1 /srv/jail 
MkDir1 /srv/jail/aox
Chmod1 /srv/jail/aox
MkDir1 /usr/messages
Chmod1 /usr/messages
MkDir1 /etc/aox 
MkDir1 /var/log/aox 
MkDir1 /var/run/oryx 
MkDir1 /usr/lib/aox/tlsproxy 
MkDir1 /usr/lib/aox/tlsproxy/var 
MkDir1 /usr/lib/aox/tlsproxy/var/run
Message install 
  To set up the database and generate a configuration file, run
  /usr/lib/aox/installer as root. The new configuration file will be in
  /etc/aox/archiveopteryx.conf.
  /usr/lib/aox/installer -n shows what it would do, without making any
  changes. (If you are just upgrading from an older version, /usr/bin/aox
  upgrade schema may be enough.  /usr/bin/aox upgrade schema -n shows what
  it would do, without making any changes.)
  The logfile is /var/log/aox/logfile by default and man pages are in
  /usr/share/man.
  If you have any problems, the FAQ is at http://www.archiveopteryx.org/faq/
  and you can always ask [email protected] for help.
...updated 53 target(s)...

Voilà.

A ce moment là, on va être obéissant et confiant en laçant /usr/lib/aox/installer qui s'occupera de créer l'utilisateur système d'Aox, sa base et ses utilisateurs, et les fichiers de configurations par défaut.

L'utilisateur méfiant pourra tout de même lancer en premier lieu un /usr/lib/aox/installer -n pour avoir un peu plus d'info sur ce qui va se passer.

A ce moment là, votre cluster PostgreSQL qui accueillera la base aox doit bien entendu être accessible !

Attention !

Aox crée sa base de donnée avec l'encodage UNICODE. Si tout comme moi vous utilisez PostgreSQL 8.3, alors votre cluster DOIT être initialisé en UTF8. Je vous laisse vous reporter à la documentation sur PostreSQL sur ce même site en cas de problème.

# /usr/lib/aox/installer -s /var/run/postgresql/.s.PGSQL.5432
Connecting to Postgres server /var/run/postgresql/.s.PGSQL.5432 as Unix user postgres.
Creating the 'aox' PostgreSQL user.
Creating the 'aoxsuper' PostgreSQL user.
Creating the 'aox' database.
Adding PL/PgSQL to the 'aox' database.
Loading the database schema:
SET
SET
CREATE TABLE
INSERT 0 1
CREATE TABLE
[...]
GRANT
GRANT
Generating default /etc/aox/archiveopteryx.conf
Generating default /etc/aox/aoxsuper.conf
Setting ownership and permissions on /etc/aox/archiveopteryx.conf
Setting ownership and permissions on /usr/messages
Done.

Configuration

cf. /etc/aox/archiveopteryx.conf

TODO

Administration

Un peu d'aide :

# aox help

Lancer le serveur :

# aox start

État du serveur :

# aox show status
Servers: logd, ocd, tlsproxy, archiveopteryx.

Ajouter un utilisateur :

# aox add user ioguix SuperPass [email protected]

Tests

TODO

Postfix (MTA)

Installation

# aptitude install postfix libsasl2-modules-sql postfix-pgsql

Une fois le paquet installé, vous aurez à répondre à la question suivante :

aptitude install postfix
Nom du paquet Question Réponse à choisir
postfix Type de configuration Pas de configuration

Et c'est là que je vous gâte, comme je vous propose de détailler un peu la configuration, autant se la cogner à la mimine nous même pour bien tout comprendre ! Donc, plutôt que de laisser Debian nous configurer un truc par défaut, soyons carrément fou et répondons lui “Pas de configuration” !

TODO

Configuration

TODO, traduire conf, la stabiliser, la commenter.

Postfix

Éditer /etc/mailname pour y placer le nom de domaine géré par le serveur. Ici, corpo.com.

La configuration de notre Postfix se situe donc dans /etc/postfix/main.cf, fichier que nous aurons donc à créer.

Attention !

Ce fichier est trés tatillons sur la mise en forme ! Vous ne pourrez donc pas vous amuser à le décorer comme un sapin de noël (ou trés peu)

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
myorigin = /etc/mailname
# why would we need that ?
readme_directory = no
#----- network stuffs
myhostname = mail1.corpo.com
inet_interfaces = all
inet_protocols = ipv4
#----- smtpd server 
# accept smtp client
mynetworks = localhost
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
#do not specify new mails to users
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# restrict use of smtpd to authenticated/SASL users
## reject listed in black lists from ...
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated
 reject_rbl_client bl.spamcop.net,
 reject_rbl_client dnsbl.njabl.org,
 reject_rbl_client cbl.abuseat.org,
 reject_rbl_client sbl-xbl.spamhaus.org,
 reject_rbl_client list.dsbl.org,
 permit
## authenticated clients, then allow for domains that match $relay_domains, $mydestination, $inet_interfaces, $proxy_interfaces, $virtual_alias_domains or $virtual_mailbox_domains
smtpd_recipient_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 permit_auth_destination,
 reject
## reject_unknown_sender_domain ?
smtpd_sender_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_sender,
 reject_unknown_sender_domain,
 permit
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
#----- local domain param
mydestination = corpo.com, mail1, localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mailbox_size_limit = 0
recipient_delimiter = +
#---- TLS parameters
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
##--- authentication
smtpd_sasl_auth_enable = yes
#----- local delivery to aox
## see http://www.archiveopteryx.org/postfix
# should be bigger than the largest user's map
lmtp_destination_recipient_limit = 3
mailbox_transport = lmtp:inet:127.0.0.1:2026
local_destination_recipient_limit = $lmtp_destination_recipient_limit
#----- other domains delivery
# postfix as smtp client to forward mails
# our postfix needs noone to relay its mails !
relayhost =
#------ tuning
# restrict the number of connection one client can do at a time
smtpd_client_connection_count_limit = 5
# number of mail a client can send per anvil time (60s by default)
smtpd_client_message_rate_limit = 6

Postfix & SASL

Il nous faut maintenant indiquer à Postfix où trouver ses gens et leur mot de passe pour authentifier tout ce petit monde en SASL. Comme expliqué plus haut, nous souhaitons bien entendu utiliser les comptes utilisateurs présent dans la base d'Aox ! Ainsi, un utilisateur pourra utiliser IMAP et SMTP avec les mêmes crédentiels et l'administraeur d'administrer qu'une seule et unique base utilisateur.

La configuration de SASL s'éffectuera dans /etc/postfix/sasl/smtpd.conf où nous devrons trouver :

#SASL auth using the aox users' table
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5
sql_engine: pgsql
sql_hostnames: localhost
sql_database: aox
sql_user: aox
sql_passwd: <mot de passe d'aox>
sql_select: SELECT secret FROM users WHERE login='%u'

Pour sql_passwd, le lecteur aura compris que <mot de passe d'aox> correspond au mot de passe de l'utilisateur aox dans le cluster PgSQL. Oui, celui-là même que vous avez indiqué dans le fichier de configuration /etc/aox/archiveopteryx.conf.

Utiliser un socket unix pour la connexion à la base :

Pour ceux-ce qui désirent utiliser un socket unix, il vous faut savoir que le daemon tlsmgr est chrooté par défaut sous debian (cf. /etc/postfix/master.cf) et ne pourra donc pas accéder au socket sans un minimum d'effort de votre part (mount –bind, ln ou ne pas le chrooter par exemple).

TODO

Administration

# postqueue
# postsuper
# ...

Tests

Créer ou modifier le mx du domaine pour qu'il pointe effectivmeent sur ce rutillant serveur.

TODO

Vous n'êtes pas un spammeur n'est-ce pas ?

De la réputation de votre SMTPD sur le net

Votre serveur devrait rapidement rester inconnu dans la jungle d'internet…Sauf s'il ne respecte pas les règles de bienséance qui se pratiquent entre SMTPD de bon goûts, auquel cas, il se rapidement honteusement fiché comme serveur à spammeur ! (oui, n'ayont pas peur des mots)

Voici donc une liste, certainement pas exhaustive mais suffisante, de règles de bienséances :

  • Reverse DNS retourne le bon nom de machine
  • le fqdn de la machine possède bien une entrée DNS
  • pas de 127.0.0.1 comme adresse présentée par le SMTPD (ie, dans les entête de mail : “Received: from xxx.xxx.xxx.xxx (HELO trala.com) (xxx.xxx.xxx.xxx)”)

VOUS n'êtes pas un spammer

…Mais votre FAI (ou d'autre) vous empêche d'utiliser le port 25 vers tout autre SMTPD que le leur ? Voici la solution pour vous :

# iptables -A PREROUTING -t nat -p tcp --dport //<port>// -j REDIRECT --to-port 25

Où bien entendu, vous remplacerez <port> par votre port favori, non filtré par votre FAI.

Il ne vous restera plus qu'a reconfigurer votre client mail favori pour que celui-ci utilise ce port au détriment du port 25.

Utilisation (MUA)

…ou comment configurer son client mail préféré TODO

Et demain, on fait quoi ?

Supervision, SIEVE, répertoire virtuels, Import/Export, multi-dmoaine, anti-spam, anti-virus, anti-mouton et anti-PEBKAC… TODO

Remerciements

FisherDrinker pour son soutient, ses conseils et ses tests avec mon serveur Postfix

 
mail/postifx-aox-en-smtp-imap.txt · Dernière modification: 11/12/2010 17:33 par orgrim