Serveur relais SMTP avec authentification

But de l’article

Cet article décrit comment permettre à des utilisateurs passant par diverses connexions Internet d’envoyer des messages sans avoir à modifier le serveur sortant dans leur client de messagerie.

Bien entendu, il ne faut pas que ce serveur devienne relais ouvert, car il sera blacklisté et utilisé par les spammeurs en moins de deux.

Je vais utiliser pour cela une authentification smtp, un paramètre que l’on trouve sur tous les clients messagerie courants.

J’ai testé deux méthodes pour la gestion des comptes pour le courrier sortant. Via les comptes système standards et via des comptes créés dans une base de données MySQL.

Je vais détailler ici la seconde méthode que j’ai gardé car plus pratique dans mon cas particulier.

Préparation du système

Mon installation se fait sur une distribution CentOS avec les outils de développement installés.

Cette distribution installe sendmail par défaut, il faudra passer sous postfix, mais avant cela on doit compiler des rpms permettant l’authentification sasl + diverses options que je risque d’être amené à utiliser, même si cela sort de cet article.

Installation des pré requis à la compilation

Un certain nombre de librairies sont nécessaires pour la compilation des RPMS de Postfix, installons les comme ceci :

yum -y install pcre-devel mysql-server mysql-devel expect

Installons aussi le sélecteur de serveur SMTP, nous l’utiliserons une fois Postfix installé.

yum -y install system-switch-mail

Enfin, pour le cas que j’ai choisi, il faut que SASL puisse se connecter à une base MySQL. Il faut donc installer le module nécessaire ainsi que le serveur MySQL:

yum install cyrus-sasl-sql mysql-server
chkconfig saslauthd on
chkconfig mysqld on
service saslauthd start
service mysqld start

Il faut maintenant télécharger le fichier des sources de Postfix depuis le site du projet.

Pour cela, il faut se rendre sur le site suivant : http://postfix.wl0.org/ftp/official/2.2/SRPMS/ et télécharger le dernier fichier src.rpm en cours.

Dans mon cas postfix-2.2.10-4.src.rpm.

wget http://postfix.wl0.org/ftp/official/2.2/SRPMS/postfix-2.2.10-4.src.rpm

On installe le source avec la commande rpm -ivh postfix-2.2.10-4.src.rpm.

On va dans le dossier des sources et on configure Postfix pour la compilation choisie.

cd /usr/src/redhat/SOURCES

export POSTFIX_ALT_PRIO=1
export POSTFIX_MYSQL_REDHAT=1
export POSTFIX_PCRE=1
export POSTFIX_SASL=2
export POSTFIX_SMTPD_MULTILINE_GREETING=1
export POSTFIX_TLS=1
export POSTFIX_VDA=1

sh make-postfix.spec

Cette dernière commande crée le fichier spec comportant tout ce que l’on a demandé.

Vous devriez avoir ceci comme réponse.

[root@lamp SOURCES]# sh make-postfix.spec

Creating Postfix spec file: /usr/src/redhat/SPECS/postfix.spec
Checking rpm database for distribution information...
- if the script gets stuck here:
check and remove /var/lib/rpm/__db.00? files
Distribution is: centos-release-4-3.2 (rhel-4.0)

adding LDAP support to spec file
adding PCRE support to spec file
adding MySQL support (RedHat mysql* packages) to spec file
adding SASL v2 support to spec file
adding TLS support to spec file
adding VDA support to spec file
setting alternatives priority to 1

Compilons maintenant les RPMS.

cd ../SPECS/

rpmbuild --target i686 -ba postfix.spec

La compilation se lance pour une architecture i686.

Un tas de lignes incompréhensible défilent, mais doivent se finir par un « exit 0 ».

Cela indique que les paquets RPMS ont été créés sans problèmes.

Installation et activation de Postfix


cp ../RPMS/i686/postfix* /root
cd
rpm -ivh postfix-2.2.10-4.pcre.mysql.sasl2.vda.rhel4.i686.rpm

system-switch-mail

Sélectionner Postfix dans la liste des serveurs SMTP disponibles et valider.

Postfix est maintenant actif sur votre système.

Création de la base de données Mysql

Je vais me connecter en tant que root sans mot de passe, ce qui est le compte par défaut de l’installation.

IL VOUS FAUDRA REMPLACER CE MOT DE PASSE PAR UN MOT DE PASSE SECURISE, avec la commande mysqladmin password MonMotDePasseSécurisé

Créer un fichier nommé relaydb.sql contenant la structure de la base.

Voici celui que j’ai utilisé avec un compte renseigné pour exemple.


— MySQL dump 10.9

— 

— Host: localhost Database: relaydb

— ------------------------------------------------------

— Server version 4.1.20

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0*/;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

— 

— Table structure for table `account_relay_list`

— 

DROP TABLE IF EXISTS `account_relay_list`;
CREATE TABLE `account_relay_list` (
`username` varchar(255) character set latin1 collate latin1_bin NOT NULL default '',
`password` varchar(30) character set latin1 collate latin1_bin NOT NULL default '',
`domain_name` varchar(255) NOT NULL default '',
`active` tinyint(4) NOT NULL default '1',
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

— 

— Dumping data for table `account_relay_list`

— 

/*!40000 ALTER TABLE `account_relay_list` DISABLE KEYS */;
LOCK TABLES `account_relay_list` WRITE;
INSERT INTO `account_relay_list` VALUES ('MonCompte','MonMotDePasse','',1);
UNLOCK TABLES;
/*!40000 ALTER TABLE `account_relay_list` ENABLE KEYS */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

Je ne détaille pas les tenants et les aboutissants de chaque champ, mais sachez que je ne vais utiliser pour cette doc que les champs « username », « password » et « active ».

Ceci correspond à ceci :
– username : le nom du compte utilisateur
– password : le mot de passe de ce compte
– active : 1 = compte actif, autre = compte désactivé

Les commandes que je tape dans MySQL commence par « mysql> », il ne faut taper que ce qui suit bien entendu.


[root@lamp ~]# mysql

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19 to server version: 4.1.20

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use mysql

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> create database relaydb;

Query OK, 1 row affected (0.00 sec)

mysql> use relaydb

Database changed

mysql> source relaydb.sql

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.03 sec)

Query OK, 0 rows affected (0.02 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> grant all on relaydb.* to 'UserRelay'@'localhost' identified by 'MotDePasse';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
[root@lamp ~]#

Voila, on vient de créer la base et l’utilisateur.

Récapitulatif :
– Serveur MySQL : localhost
– Base de données : relaydb
– Nom d’utilisateur : UserRelay
– Mot de passe : MotDePasse

La structure de la base a été créée avec le fichier relaydb.sql.

Ce qui donne ceci :

mysql> show tables;
+--------------------+

Tables_in_relaydb

+--------------------+

account_relay_list

+--------------------+
1 row in set (0.00 sec)

mysql> select * from account_relay_list;
+-------------------+----------------+-------------+--------+

username password domain_name active

+-------------------+----------------+-------------+--------+

MonCompte MonMotDePasse 1

+-------------------+----------------+-------------+--------+
1 rows in set (0.00 sec)

Configuration de SASL

L’installation de postfix incluant Sasl2 crée un fichier /usr/lib/sasl2/smtpd.conf.

C’est ce fichier que lit le démon saslauth pour faire sa recherche d’utilisateur.

Par défaut, il utilise la base pam et les comptes systèmes, mais pour utiliser MySQL il doit se présenter comme ceci :

# Ligne d'origine
#pwcheck_method: saslauthd
#
# Mofifs pour Mysql
#
pwcheck_method: auxprop
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_user: UserRelay
sql_passwd: MotDePasse
sql_hostnames: localhost
sql_database: relaydb
sql_select: SELECT password FROM account_relay_list WHERE username = '%u' AND active = '1'OR (username = '%u@%r' AND active= '1')

Rappel: Cela ne fonctionne que si vous avez bien installé le paquet cyrus-sasl-sql.

Modifier le fichier /etc/sysconfig/saslauthd comme ceci :

# Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled to use.
#
# Origine
# MECH=shadow
#
# Modif
MECH=pam

Configuration de Postfix

Postfix utilise le fichier de configuration /etc/postfix/main.cf.

Je le laisse tel quel hormis les paramètres suivants.


#
# Mes Paramètres Particuliers
#
myhostname=monrelais.MonDomaine.fr
mydomain=MonDomaine.fr
myorigin=$mydomain

inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain, localhost

mynetworks_style = subnet
mynetworks = 192.168.1.0/24, 127.0.0.0/8

#
# Liste des alias dans le dossier Postfix
#
alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases

#
# Banniere Modifiee
#

mail_name = (IntraStore TurboSendmail)
smtpd_banner = $myhostname $mail_name ESMTP Service ready

append_at_myorigin = no
append_dot_mydomain = no

#
# Valeur à indiquer en cas de serveur non internet et de relay denied
#
# relayhost = [smtp.monfai.fr]

#
# Table Transport particuliere
#
transport_maps = hash:/etc/postfix/transport

#
# Authentification SASL
#
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous

#
# Regles Antispam
#
smtpd_helo_required = yes
smtpd_recipient_restrictions =
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
permit_sasl_authenticated
reject

Relecture des configurations

Pour prendre en compte les modifications sur l’authentification, redémarrer sasl ne suffit pas, il faut aussi recharger postfix qui doit conserver un cache des requêtes quelque part. J’ai eu pas mal de soucis durant les tests sans cela.

Pour ce faire, utiliser les commandes suivantes :

service saslauthd restart
service postfix restart

Voila, le serveur postfix demande maintenant une authentification si le poste client n’est pas dans son réseau local ( variable permit_mynetworks ).

L’authentification se fait par rapport à la base de données MySQL.

Cet article n’est pas là pour vous expliquer comment fonctionne MySQL, il y a plein de docs qui font cela très bien.

Je met en fichier joint un récapitulatif de quelques commandes utiles.

Configuration d’Outlook Express 6

Pour utiliser l’authentification, il suffit d’aller dans les paramètres de serveur et cocher « Mon Serveur requiert une authentification ».
Si le compte est identique au compte pop, laisser « utiliser des paramètres identiques à ceux du serveur de messagerie entrant », ou spécifiez le compte et mot de passe que vous avez renseigné dans la base de données.
Capture d'écran OutlookExpress

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.