POSTFIX - Formation Postfix
Sommaire
Introduction
- Postfix créé sur une rumeur de faille de sécu de sendmail, par Paul Vixie.
- Création dans un souci de sécurité.
- Postfix est un MTA constitué de plusieurs programmes indépendants, "ne se faisant pas confiance mutuellement".
- Postfix prêt à fonctionner quasi out of the box.
- Dans un premier temps, création de boite = création de compte système.
- Après, autres besoins sans utiliser de comptes systèmes, intégration de mysql par exemple => entraine besoin de recompilation de postfix sur des plateforme style Red Hat car fonctionnalité non incluse de base dans le package.
- Voir qemu/kvm (pour proc gérant virtualisation matérielle) pour virtualisation sous linux.
Vue d'ensemble d'un MTA
Comptes utilisateurs
Postfix utilise donc des comptes système ou des comptes virtuels.
Comptes virtuels:
- stockage local (mbox, maildir) OU
- stockage externe (fichier séquentiel indexé, mysql..., non géré par défaut par le MTA)
Comptes virtuels:
- domaines partagés OU
- domaines séparés
- stockage local OU
- stockage externe
cf Schéma 1
Introduction aux commandes de protocole
- Exemple d'utilisation de la commande telnet
- Toujours un code de retour aux commandes SMTP:
- 2xx: OK
- 3xx: informations
- 4xx: erreurs temporaires
- 5xx: erreurs fatales
- Commandes SMTP:
- ehlo <mon_hostname> dialogue en ESMTP
- helo dialogue en SMTP
- vrfy vérification existance d'un utilisateur, habituellement désactivé pour sécurité /SPAM
- mail from ENVELOPPE
- rcpt to ENVELOPPE (possibilité de répéter mail from et rcpt to dans le corps)
- data CORPS DU MESSAGE
- Subject
- Commandes POP:
- user
- pass
- list
- retr
Installation de postfix
Installation du package
apt-get install postfix
Pas de configuration, on va la faire à la main.
Configuration de postfix
Conf dans /etc/postfix/.
Comme on n'a rien configuré lors de l'installation, besoin de récupérer un fichier de conf vierge (ou de le créer):
cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf vi /etc/postfix/main.cf
Pour éliminer les lignes vides et les lignes de commentaires pour ne récupèrer que les directives de conf:
egrep -v "^$|^#" /etc/postfix/main.cf
Commande postconf: pour connaitre la configuration (totale) de postfix.
postconf <directive>: pour connaitre la valeur d'UNE directive:
root@julien:~# postconf swap_bangpath swap_bangpath = yes
postconf -d <directive>: pour connaitre la valeur par défaut avant surcharge.
postconf -n: pour connaitre les valeurs différentes de celles par défaut (en gros, celles du main.cf)
postconf -e <directive>=valeur: pour éditer les valeurs des directives (modif du fichier de conf).
NB : Attention, l'édition des paramètres par postconf -e nécessite un reload ou restart de postfix! |
---|
root@julien:~# postconf -d mydestination mydestination = $myhostname, localhost.$mydomain, localhost root@julien:~# postconf -e mydestination=toto.fr ==> ON CHOISIT UN DOMAINE POUR LA FORMATION root@julien:~# postconf -d myorigin myorigin = $myhostname root@julien:~# postconf -e myorigin=toto.fr root@julien:~# postconf myhostname myhostname = julien.localdomain
NB : Attention, $myhostname n'est pas obligatoire, postfix prend le hostname réel du serveur, par défaut! |
---|
root@julien:~# postconf -e myhostname=<FQDN du serveur>
Si on n'a pas le FQDN du serveur dans myhostname, et que mydomain est renseigné, concaténation de myorigin et mydomain.
- myhostname: si vide prend le hostname par défaut.
- myorigin: pour completer les adresses quand on entre 1 user sans domaine.
- mydomain: pour faire correspondre 1 domaine de délivrance à ce serveur.
- mydestination: contient au moins mydomain + tous les autres domaines que le serveur délivre.
Possibilité de mettre 1 ligne de conf sur plusieurs lignes, si les lignes secondaires comportent des espaces ou des tabulations en début de ligne.
NB : ATTENTION DE NE PAS PLACER D'ESPACES OU DE TABULATION EN DEBUT DE LIGNE (QUAND ON DECOMMENTE PAR EXEMPLE) |
---|
NB : ATTENTION DE NE PAS UTILISER DE DIRECTIVE N'EXISTANT PAS, SINON POSTCONF LA CREE...) |
---|
Pb au start de postfix: des lignes décommentées dans /etc/postfix/main.cf sans valeur associées:
- recommenter les lignes OU
- fixer des valeurs OU
root@julien:~# postconf -n|grep -v "= *$" > /etc/postfix/main.cf ==> on récupère la configuration actuelle, on en élimine les lignes ou les paramètres ne sont pas renseignés et on les réécrit dans le main.cf
NB : ATTENTION POSTFIX ECOUTE SUR L'INTERFACE PUBLIQUE) |
---|
root@julien:~# postconf -d inet_interfaces inet_interfaces = all => à changer en localhost pour ne relayer que les mails locaux
NB : ATTENTION PB POUR ATTAQUER LE PORT 25) |
---|
Nous n'avons pas de pb réseau, après examen des logs:
==> /var/log/mail.info <== Sep 22 13:50:03 julien postfix/smtpd[5653]: fatal: open database /etc/aliases.db: No such file or directory
Comme /etc/aliases existe il faut regénérer le fichier .db associé
root@julien:~# newaliases
postconf -e mydomain=toto.fr postconf -e myhostname=smtp => ce qui est affiché dans la bannière postconf -e myorigin=\$myhostname.\$mydomain postconf -e myorigin=\$mydomain postfix reload
- mydestination = liste des domaines gérés par postfix, domaines des messages pour lesquels postfix acceptera des mails (en délivrance locale).
NB : Par défaut Postfix est configuré pour NE PAS ETRE un relai ouvert (Open Relay) |
---|
- relay_domains = liste des domaines gérés en tant que relay.
- relayhost = machine à qui envoyer des mails pour relay vers l'extérieur quand le postfix ne peut pas directement contacter internet.
NB : Si on veut accepter de relayer pour d'autres réseaux (au sens IP) il existe la directive mynetworks |
---|
cf schéma 2
- mydomain = définit un domaine à concaténer à myhostname si le hostname n'est pas un FQDN
!!! si le myhostname est déjà un FQDN, le mydomain sera la partie terminale du FQDN
- myorigin = valeur par défaut pour completer mail from ou rcpt to...
Configuration avancée de Postfix
Plan
- Vérification des boites
- Distribution du courrier (sans pop)
- Gestion des adresses (alias)
- Multi domaines
- Filtrage de contenu
- Relayage/Authentification
Vérification des boites
root@julien:~# postconf local_recipient_maps local_recipient_maps = proxy:unix:passwd.byname $alias_maps root@julien:~#
Désigne à postfix la manière de rechercher les boites existantes (d'abord les comptes unix puis la directive alias_maps).
root@julien:~# postconf alias_maps alias_maps = hash:/etc/aliases, nis:mail.aliases root@julien:~#
root@julien:~# postconf -e local_recipient_maps='proxy:unix:passwd.byname $alias_maps hash:/etc/postfix/mesusers' root@julien:~#
On enrichit la manière dont postfix détecte les boites mail.
root@julien:~# postconf local_recipient_maps local_recipient_maps = proxy:unix:passwd.byname $alias_maps hash:/etc/postfix/mesusers root@julien:~# more /etc/postfix/mesusers julien ok davy ok roderick ok root@julien:~#
On associe 1 clé avec 1 valeur (pour l'instant on s'occupe surtout de la clé). On a besoin de "compiler" cette "base de donnée":
root@julien:~# postmap /etc/postfix/mesusers root@julien:~# ls -la /etc/postfix/mesusers* -rw-r--r-- 1 root root 30 2008-09-22 15:54 /etc/postfix/mesusers -rw-r--r-- 1 root root 12288 2008-09-22 15:55 /etc/postfix/mesusers.db root@julien:~#
hash pour désigner un fichier compilé de relations clé-valeur.
Pour avoir la liste des formats:
root@julien:~# postconf -m btree cidr environ hash nis proxy regexp sdbm static tcp unix root@julien:~#
On vérifie qu'on a le user davy que dans notre nouvelle base:
root@julien:~# id davy id: davy: No such user root@julien:~# grep davy /etc/aliases root@julien:~# grep davy /etc/postfix/mesusers davy ok root@julien:~# postfix reload postfix/postfix-script: refreshing the Postfix mail system root@julien:~#
On peut tester:
root@julien:~# telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 smtp ESMTP Postfix (Ubuntu) ehlo julien 250-smtp 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: toto@titi.fr 250 2.1.0 Ok rcpt to: davy 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: teststststst liheugh hezkfugze ihzef . 250 2.0.0 Ok: queued as 70FA3BA4E quit 221 2.0.0 Bye Connection closed by foreign host. root@julien:~#
A cette étape, qu'est devenu le mail?
root@julien:~# postconf mail_spool_directory mail_spool_directory = /var/mail
On voit dans les logs que ce user n'est pas reconnu...
root@julien:~# ls -la /var/mail total 16 drwxrwsr-x 2 root mail 4096 2008-09-22 16:00 . drwxr-xr-x 15 root root 4096 2008-05-05 16:58 .. -rw------- 1 jules mail 4940 2008-09-22 16:03 jules root@julien:~#
Ici le fichier des mails de jules est un fichier qui appartient au user jules. Adresse reconnue par postfix et par le système. Pour davy, adresse reconnue par postfix (via mesusers.db) mais pas par le système.