Serveur relais SMTP avec authentification
Transcription
Serveur relais SMTP avec authentification
Serveur relais SMTP avec authentification LINUXTIPS - Mes trucs et astuces sous LINUX -- Réseau - Services Réseaux -- Services Réseaux Serveur relais SMTP avec authentification Laurent Rayssiguier jeudi 6 juillet 2006 Résumé : Mise en place d'un serveur de messagerie Postfix avec une authentification SASL via une base de donnée MySql LINUXTIPS - Mes trucs et astuces sous LINUX Page 1/11 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 LINUXTIPS - Mes trucs et astuces sous LINUX Page 2/11 Serveur relais SMTP avec authentification 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. LINUXTIPS - Mes trucs et astuces sous LINUX Page 3/11 Serveur relais SMTP avec authentification 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` -- LINUXTIPS - Mes trucs et astuces sous LINUX Page 4/11 Serveur relais SMTP avec authentification 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 LINUXTIPS - Mes trucs et astuces sous LINUX Page 5/11 Serveur relais SMTP avec authentification 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) LINUXTIPS - Mes trucs et astuces sous LINUX Page 6/11 Serveur relais SMTP avec authentification 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; +-------------------+----------------+-------------+--------+ LINUXTIPS - Mes trucs et astuces sous LINUX Page 7/11 Serveur relais SMTP avec authentification | 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. LINUXTIPS - Mes trucs et astuces sous LINUX Page 8/11 Serveur relais SMTP avec authentification 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 LINUXTIPS - Mes trucs et astuces sous LINUX Page 9/11 Serveur relais SMTP avec authentification 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. LINUXTIPS - Mes trucs et astuces sous LINUX Page 10/11 Serveur relais SMTP avec authentification Capture d'écran OutlookExpress Le paramétrage de Outlook Express 6. LINUXTIPS - Mes trucs et astuces sous LINUX Page 11/11