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.