LAB02 : part 02 : RHEL7 : RELAY01 : installation et configuration

De Pegasus45

Le serveur est sous RHEL 7 (dernière version disponible, cad. 7.2 à la date d'écriture de ce chapitre), 64bits.

Préparation

IPv6 étant désactivé, Postfix n'arrive pas à démarrer. On va modifier la configuration par défaut de Postfix :

Command
cd /etc/postfix
cp main.cf main.cf_ori

Configuration File vi main.cf
#soft_bounce = no
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
inet_interfaces = localhost
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

On peut relancer Postfix

Command
systemctl restart postfix

On peut voir que Postfix est bien démarré :

Command
systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2016-02-23 11:08:26 CET; 4s ago
  Process: 31065 ExecStop=/usr/sbin/postfix stop (code=exited, status=1/FAILURE)
  Process: 31533 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 31531 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 31528 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 31607 (master)
   CGroup: /system.slice/postfix.service
           ├─31607 /usr/libexec/postfix/master -w
           ├─31608 pickup -l -t unix -u
           ├─31609 qmgr -l -t unix -u
           ├─31676 /usr/libexec/postfix/master -w
           ├─31677 pickup -l -t unix -u
           └─31678 qmgr -l -t unix -u


Initialisation du mode PostMulti

On va dédier une instance de Postfix pour le traitement des mails venant des serveurs d'applications. Ainsi, on gardera intacte l'instance principale pour le traitement des batch et crontab de la machine. Pour activer le mode PostMulti de Postfix :

Command
postmulti -e init

Les lignes suivantes apparaissent dans le fichier de configuration de Postfix :

Command
cat /etc/postfix/main.cf
[...]
multi_instance_wrapper = ${command_directory}/postmulti -p --
multi_instance_enable = yes


Création de l'instance Postfix-Relay

Pour créer une nouvelle instance :

Command
postmulti -I postfix-relay -e create

Une erreur apparaît car il a créé une nouvelle instance par défaut qui cherche toujours à utiliser IPv6. De nouveaux répertoires viennent d'être créés :

Command
ls -ld /etc/postfix-relay
ls -ld /var/spool/postfix-relay
ls -ld /var/lib/postfix-relay

A cause de l'erreur précédente, le propriétaire du dernier répertoire n'est pas correcte. On va le corriger :

Command
chown postfix.root /var/lib/postfix-relay

Et on peut également voir qu'une nouvelle instance est gérée par Postfix mais qui n'est pas active :

Command
postmulti -l

-                   -               y         /etc/postfix
postfix-relay       -               n         /etc/postfix-relay


Configuration de l'instance Postfix-Relay

Il est temps de configurer cette instance. En supprimant toutes les lignes en commentaire, le fichier devrait ressembler à ceci :

Configuration File vi /etc/postfix-relay/main.cf
#soft_bounce = no
queue_directory = /var/spool/postfix-relay
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix-relay
mail_owner = postfix
inet_interfaces = all
inet_protocols = ipv4
mydestination =
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
enable_long_queue_ids = yes

smtpd_banner = ESMTP relay
transport_maps = hash:/etc/postfix-relay/transport
mynetworks = 

# 1er ccontrole: Client restrictions:
# Seules les IP de mynetworks sont autorisées à envoyer des mails vers ce Postfix.
# mynetworks: IP des serveurs d'applications
smtpd_client_restrictions =
   reject_unauth_pipelining
   permit_mynetworks
   reject

# 2e controle: Recipient restrictions:
smtpd_recipient_restrictions =
   reject_non_fqdn_recipient
   permit_mynetworks
   reject
   
master_service_disable = 
authorized_submit_users =
multi_instance_name = postfix-relay

Ensuite, on crée le fichier transport :

Configuration File vi /etc/postfix-relay/transport
*       mytransport:

Et on génère son fichier au format Berkeley :

Command
postmap /etc/postfix-relay/transport

L'instance doit écouter sur le port 25004 et gérer un nouveau démon de transport. Pour cela, on ajoute les lignes suivantes :

Configuration File vi /etc/postfix-relay/master.cf
mytransport     unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/appli/dispatch-smtp/dispatch-smtp.py ${recipient} ${sender} ${client_address}
25004      inet  n       -       n       -       -       smtpd
#smtp      inet  n       -       n       -       -       smtpd

Remarque : mettre en commentaire la ligne « smtp »

Etant donné que le script sera exécuté sous le compte vmail, il faut donc créer cet utilisateur :

Command
useradd -m vmail

Maintenant, on peut activer cette instance :

Command
postmulti -i postfix-relay -e enable

Ce qui a modifié la ligne suivante comme ceci :

Command
cat /etc/postfix-relay/main.cf

[...]
multi_instance_enable = yes

La commande suivante permet également de le vérifier :

Command
postmulti -l

-                    -               y         /etc/postfix
postfix-relay        -               y         /etc/postfix-relay

On peut donc relancer Postfix pour démarrer toutes les instance :

Command
service postfix restart

On vérifie que Postfix écoute également sur les nouveaux ports et que ces nouveaux ports écoutent sur toutes les interfaces :

Command
ss -lnt

LISTEN      0      100              *:25004           *:*       <== instance postfix-relay
LISTEN      0      100      127.0.0.1:25              *:*       <== instance principale


Installation du script Python

On installe le script Python qui, en fonction de l'IP du serveur d'application qui a émis le mail, va envoyer vers un port particulier du serveur Postfix/Dovecot :

Command
mkdir -p /appli/dispatch-smtp
chmod 755 /appli
chmod 750 /appli/dispatch-smtp
chown vmail.postfix /appli/dispatch-smtp

Configuration File vi /appli/dispatch-smtp/dispatch-smtp.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import smtplib

repTravail="/appli/dispatch-smtp"
ficConf="%s/dispatch-smtp.conf" % (repTravail)

# Récupération des arguments de Sender, du Recipient et de l'IP Source
mailDest=sys.argv[1]
mailSender=sys.argv[2]
ipSender=sys.argv[3]

# Fonction d'envoi du mail
def sendMail(message,serveur):
   var1 = serveur.split(':')
   serveurSMTP = var1[0]
   if len(var1) == 2:
      portSMTP = int(var1[1])
   else:
      portSMTP = 25
   mailserver = smtplib.SMTP(serveurSMTP, portSMTP)
   mailserver.ehlo()
   mailserver.sendmail(mailSender, mailDest, message)
   mailserver.quit()

with open(ficConf,"r") as fichier:
   found = False
   for ligne in fichier:
      if not ligne.startswith('#'):
	if ipSender in ligne:
	found = True
            serveur = ligne.split(',')
            data = sys.stdin.readlines()
            message = ""
            for line in data:
               message += line
            sendMail(message,serveur[1])
   if not found:
      print "IP Source(%s) non trouvee dans %s" % (ipSender,ficConf)
      sys.exit(1)

On le rend exécutable :

Command
chmod 755 /appli/dispatch-smtp/dispatch-smtp.py

Au moment de la configuration pour un nouveau serveur d'application, il faudra modifier le fichier dispatch-smtp.conf en y indiquant l'IP du serveur d'application ainsi que le port du serveur Postfix/Dovecot :

Configuration File vi /appli/dispatch-smtp/dispatch-smtp.conf
# <IP_Source>,<IP_SMTP:Port>

On change les permissions du fichier :

Command
chmod 644 /appli/dispatch-smtp/dispatch-smtp.conf



Listes des articles associés: