« OpenSSL - Commandes utiles » et « POSTFIX - Configurer postfix pour relayer en SASL » : différence entre les pages

De PedroWiki
(Différence entre les pages)
Aller à la navigationAller à la recherche
imported>Jules
 
imported>Jules
Aucun résumé des modifications
 
Ligne 1 : Ligne 1 :
= Introduction =
= Introduction =


Cet article liste les commandes openssl les plus couramment utilisées. Il y a déjà des 100aines de pages sur internet, l'idée de cet article est de capitaliser dans le temps à titre personnel.
Le contexte: vous avez un serveur, qui porte une application web. Cette application dispose par exemple d'un formulaire de contact, ou fait des traitements nécessitant des notifications par mail, et vous avez besoin de pouvoir envoyer via localhost sur le port 25.
 
Cet article décrit comment j'ai produit une configuration fonctionnelle pour relayer au travers d'un relay de chez Gandi ou Gmail, ces configurations sont valables quel que soit le relay SMTP.


= Liens utiles =
= Liens utiles =


* [https://www.sslshopper.com/article-most-common-openssl-commands.html Page sur SSLShopper]
N'étant pas spécialiste de postfix ou de la messagerie en général, je me suis appuyé sur quelques liens et tutos bien utiles:
* [https://www.tbs-certificats.com/FAQ/fr/192.html Génération de CSR (TBS)]
* [https://www.howtoforge.com/tutorial/configure-postfix-to-use-gmail-as-a-mail-relay/ Un wiki de configuration relatif à Gmail]
* [https://en.wikipedia.org/wiki/Self-signed_certificate Wikipedia - Certifs autosignés]
* [https://www.linuxquestions.org/questions/linux-software-2/postfix-error-open-database-etc-aliases-db-no-such-file-or-directory-4175423118/ Un article de forum relatif aux erreurs d'aliases]
* [https://www.ibm.com/docs/en/api-connect/2018.x?topic=overview-generating-self-signed-certificate-using-openssl Générer un certificat auto signé]
* [https://wiki.archlinux.org/index.php/Postfix Un wiki très complet sur Postfix, pour ArchLinux, cf postaliases]
* [https://romain.therrat.fr/posts/2020/04/openssl-tester-la-compatibilit%C3%A9-d-une-version-de-tls/ Blog de Romain Therrat, post sur la compatibilité TLS d'openssl]
 
= Pré requis =
 
* connaitre votre OS (Debian 9.5 dans notre cas).
* avoir un relay (ex: mail.gandi.net ou smtp.google.com).
* connaitre le port TCP de destination (en général 587 pour le SASL).
* disposer d'un compte et d'un mot de passe pour pouvoir utiliser ce relai.
* vérifier que votre hébergeur vous permet de sortir sur les ports SMTP classiques.


= Commandes les plus utiles =
Chez Scaleway par exemple, il est nécessaire de se rendre dans la configuration du Security Group protégeant votre VM, et de cocher une case correspondant à l'autorisation, en sortie, des protocoles de messagerie. Sans cette autorisation explicite, votre configuration pourra être valide, mais vous ne relayerai pas correctement.


== Vérifier les versions TLS supportées par un openssl ==
[[Fichier:SecGroup..PNG]]


openssl ciphers -v| awk '{ print $2 }'|sort|uniq
= Installation et configuration =


Exemple sur un vieux openssl:
== Vérifications préalables ==


<pre>
* Vérifier s'il y a déjà un service SMTP installé en local:
[root@hostname ~]# openssl ciphers -v| awk '{ print $2 }'|sort|uniq
SSLv3
[root@hostname ~]# openssl version
OpenSSL 1.0.0-fips 29 Mar 2010
</pre>


Exemple sur un openssl récent:
netstat -tpln '''==> vérifier ce qui écoute sur le port 25'''


<pre>
* Si besoin, désinstaller l'éventuel service SMTP (ex: exim par défaut sur les images Debian Scaleway):
user@hostname:~$ openssl ciphers -v| awk '{ print $2 }'|sort|uniq
SSLv3
TLSv1
TLSv1.2
TLSv1.3
user@hostname:~$ openssl version
OpenSSL 1.1.1d  10 Sep 2019
</pre>


== Tester la compatibilité d'un service distant avec une version de TLS ==
apt-get remove exim4 --purge


openssl s_client -connect google.com:443 -brief -<version_tls>
== Installation de postfix ==


Exemple:
apt-get update
apt-get install postfix


<pre>
Dans l'assistant de configuration graphique proposé par l'installer Postfix, choisir "No configuration", on fera tout manuellement ensuite.
user@hotname:~$ echo "Q" | openssl s_client -connect google.com:443 -brief -tls1_3
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: CN = *.google.com
Hash used: SHA256
Signature type: ECDSA
Verification: OK
Server Temp Key: X25519, 253 bits
DONE
user@hotname:~$ echo "Q"  | openssl s_client -connect google.com:443 -brief -tls1_2
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-ECDSA-CHACHA20-POLY1305
Peer certificate: CN = *.google.com
Hash used: SHA256
Signature type: ECDSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed
Server Temp Key: X25519, 253 bits
DONE
</pre>


== Identifier les protos SSL dispos sur un service web ==
== Préparation de la configuration ==


  for v in ssl2 ssl3 tls1 tls1_1 tls1_2 tls1_3; do \
  cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
  for c in $(openssl ciphers 'ALL:eNULL' | tr ':' ' '); do \
    openssl s_client -connect <URL>:443 -cipher $c -$v < /dev/null > /dev/null 2>&1 && echo -e "$v:\t$c"; \
  done; \
done


== Tester un port SSL ==
== Configuration compte SASL ==


  openssl s_client -connect <host>:<port>
  vi /etc/postfix/sasl_passwd
...
[smtp.gmail.com]:587    username@gmail.com:password '''(ATTENTION A INSTANCIER FONCTION DE VOS PARAM PERSOS)'''
...
chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd


== Générer un CSR ==
== Configuration des aliases ==


  openssl req -sha256 -nodes -newkey rsa:2048 -keyout www.monsite.com.key -out www.monsite.com.csr
  vi /etc/postfix/aliases
...
root: <votre_adresse_d_admin>
...
postalias /etc/postfix/aliases
cp /etc/postfix/aliases.db /etc/ '''(ON PEUT CONFIGURER LE CHEMIN DANS POSTFIX, MAIS LA FLEMME, DONC ON RECOPIE LE FICHIER OU LA CONF PAR DEFAUT LE CHERCHE)'''


A partir d'un fichier de détails:
== Configuration relaying SASL ==


  openssl req -nodes -newkey rsa:2048 -sha256 -keyout monsite.key -out monsite.csr -config <(cat csr_details.txt)
  vi /etc/postfix/main.cf


Format du fichier de détails:
Avec l'option "No configuration" votre ''main.cf'' doit ressembler à ça:


<pre>
<pre>
[req]
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
default_bits = 2048
 
prompt = no
 
default_md = sha256
# Debian specific:  Specifying a file name will cause the first
req_extensions = req_ext
# line of that file to be used as the name.  The Debian default
distinguished_name = dn
# is /etc/mailname.
#myorigin = /etc/mailname


[ dn ]
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
C=FR
biff = no
ST=<Une région>
L=<Une ville>
O=<Une organisation>
OU=<Une OU>
emailAddress=<Un email de contact>
CN = <le CN souhaité, i.e. le nom à couvrir>


[ req_ext ]
# appending .domain is the MUA's job.
subjectAltName = @alt_names
append_dot_mydomain = no


[ alt_names ]
# Uncomment the next line to generate "delayed mail" warnings
DNS.1 = <alt_name_1>
#delay_warning_time = 4h
DNS.2 = <alt_name_2>
 
IP.1 = <IP>
readme_directory = no
<pre>
 
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2
 
</pre>
 
Ajouter en fin de fichier les lignes suivantes:


== Lire le contenu d'un CSR ==
relayhost = [smtp.google.com]:587 '''(ATTENTION LE RELAY DOIT ETRE COHERANT AVEC CELUI DESIGNE DANS sasl_passwd)'''
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt


openssl req -noout -text -verify -in mon.domaine.com.csr
== Redémarrer postfix pour prendre la configuration en compte ==


== Vérifier le contenu d'un certificat SSL au format PEM ==
systemctl restart postfix.service


openssl x509 -in <nom_fichier_certif> -text -noout
En principe sur une conf si petite, peu de chance d'avoir des erreurs au démarrage, sauf fichier mal placé ou fautes de frappe. Vous pouvez vérifier que le service tourne bien:


== Convertir DER (.crt .cer .der) au format PEM ==
netstat -tpln '''=> chercher le port 25, vérifier qu'il n'est bien bindé que sur 127.0.0.1'''
systemctl status postfix.service


openssl x509 -outform der -in certificate.cer -out certificate.der
= Test du fonctionnement =


openssl x509 -inform der -in certificate.der -out certificate.pem
== Traces ==


== Supprimer la passphrase d'une clé privée ==
Mettre en place des traces pour vérifier le bon fonctionnement:


  openssl rsa -in /path/to/ssl/032019/withPassPhrase.key -out /path/to/ssl/withoutPassPhrase.key
  tail -f /var/log/mail.log /var/log/mail.err &


Puis en interactif, renseigner la passphrase. Vous pouvez ensuite utiliser la clé sans passphrase pour vos configurations.
== Envoi manuel d'un mail avec telnet ==


== Vérifier la correspondance CSR/clé privée/clé publique ==
root@machine:~# telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 machine.localdomain ESMTP Postfix (Debian/GNU)


Obtenir le hash md5 du modulus de chaque fichier et les comparer (ils doivent tous être identiques):
Le log indique:
==> /var/log/mail.log <==
Feb 23 11:38:08 machine postfix/smtpd[6555]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Feb 23 11:38:08 machine postfix/smtpd[6555]: connect from localhost[127.0.0.1]


openssl x509 -in <clépublique> -noout -modulus | openssl md5
Pas de pb, les messages en warning peuvent être ignorés.
openssl rsa -in <cléprivée> -noout -modulus | openssl md5
openssl req -in <csr> -noout -modulus | openssl md5


== Vérifier le bon ordre des clés publiques dans une chaîne ==
ehlo localhost
250-machine.localdomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
mail from: contact@domaine.test
250 2.1.0 Ok
rcpt to: adresse@domaine.dest
250 2.1.5 Ok


Logique:
Le log indique:
* partir de la clé publique de son certificat.
* avoir 1 fichier par clé publique faisant partie de la chaîne.
* si on considère que la clé publique est tout en haut, il faut en déterminer l'Issuer, et la clé à l'étage du dessous doit avoir un Subject strictement identique.


  openssl x509 -in <clépublique> -text -noout | grep Issuer
  Feb 23 11:38:33 machine postfix/smtpd[6555]: 898B22C250D: client=localhost[127.0.0.1]


Puis
data
354 End data with <CR><LF>.<CR><LF>
Subject: test relay SASL
Ca fonctionne?
.


openssl x509 -in <unedesclésdelachaine> -text -noout | grep Subject
Le log indique:


La clé de la chaine ayant un Subject égal à l'issuer de la clé précédente vient à la suite.
Feb 23 11:38:50 machine postfix/cleanup[6615]: 898B22C250D: message-id=<20190223113833.898B22C250D@machine.localdomain>
250 2.0.0 Ok: queued as 898B22C250D
Feb 23 11:38:50 machine postfix/qmgr[6137]: 898B22C250D: from=<contact@domaine.test>, size=360, nrcpt=1 (queue active)
Feb 23 11:38:51 machine postfix/smtp[6651]: 898B22C250D: to=<adresse@domaine.dest>, relay=smtp.google.com[A.B.C.D]:587, delay=26, delays=25/0.05/0.06/0.18, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 25E42240005)
Feb 23 11:38:51 machine postfix/qmgr[6137]: 898B22C250D: removed


Ensuite concaténer toutes ces clés dans un seul et même fichier:
'''Le mail est correctement délivré!'''


cat <clépublique> > fullchain.pem
== Vérifier la réception ==
cat <cléAC1> >> fullchain.pem
...
cat <cléACn> >> fullchain.pem
cat <cléRootCA> >> fullchain.pem


Vérifier qu'il n'y ait pas de mélange des BEGIN et END CERTIFICATE (ex: manque de retour à la ligne dans les fichiers).
Checker la boite de destination. Vérifier que le mail est bien délivré et qu'il n'est pas classé directement en spam.


[[Category:Commande]]
[[Category:Configuration]]
[[Category:Howto]]
[[Category:Howto]]
[[Category:SSL]]
[[Category:Postfix]]
[[Category:SASL]]

Version du 23 février 2019 à 11:48

Introduction

Le contexte: vous avez un serveur, qui porte une application web. Cette application dispose par exemple d'un formulaire de contact, ou fait des traitements nécessitant des notifications par mail, et vous avez besoin de pouvoir envoyer via localhost sur le port 25.

Cet article décrit comment j'ai produit une configuration fonctionnelle pour relayer au travers d'un relay de chez Gandi ou Gmail, ces configurations sont valables quel que soit le relay SMTP.

Liens utiles

N'étant pas spécialiste de postfix ou de la messagerie en général, je me suis appuyé sur quelques liens et tutos bien utiles:

Pré requis

  • connaitre votre OS (Debian 9.5 dans notre cas).
  • avoir un relay (ex: mail.gandi.net ou smtp.google.com).
  • connaitre le port TCP de destination (en général 587 pour le SASL).
  • disposer d'un compte et d'un mot de passe pour pouvoir utiliser ce relai.
  • vérifier que votre hébergeur vous permet de sortir sur les ports SMTP classiques.

Chez Scaleway par exemple, il est nécessaire de se rendre dans la configuration du Security Group protégeant votre VM, et de cocher une case correspondant à l'autorisation, en sortie, des protocoles de messagerie. Sans cette autorisation explicite, votre configuration pourra être valide, mais vous ne relayerai pas correctement.

Installation et configuration

Vérifications préalables

  • Vérifier s'il y a déjà un service SMTP installé en local:
netstat -tpln ==> vérifier ce qui écoute sur le port 25
  • Si besoin, désinstaller l'éventuel service SMTP (ex: exim par défaut sur les images Debian Scaleway):
apt-get remove exim4 --purge

Installation de postfix

apt-get update
apt-get install postfix

Dans l'assistant de configuration graphique proposé par l'installer Postfix, choisir "No configuration", on fera tout manuellement ensuite.

Préparation de la configuration

cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf

Configuration compte SASL

vi /etc/postfix/sasl_passwd
...
[smtp.gmail.com]:587    username@gmail.com:password (ATTENTION A INSTANCIER FONCTION DE VOS PARAM PERSOS)
...
chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd

Configuration des aliases

vi /etc/postfix/aliases
...
root: <votre_adresse_d_admin>
...
postalias /etc/postfix/aliases
cp /etc/postfix/aliases.db /etc/ (ON PEUT CONFIGURER LE CHEMIN DANS POSTFIX, MAIS LA FLEMME, DONC ON RECOPIE LE FICHIER OU LA CONF PAR DEFAUT LE CHERCHE)

Configuration relaying SASL

vi /etc/postfix/main.cf

Avec l'option "No configuration" votre main.cf doit ressembler à ça:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

Ajouter en fin de fichier les lignes suivantes:

relayhost = [smtp.google.com]:587 (ATTENTION LE RELAY DOIT ETRE COHERANT AVEC CELUI DESIGNE DANS sasl_passwd)
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

Redémarrer postfix pour prendre la configuration en compte

systemctl restart postfix.service

En principe sur une conf si petite, peu de chance d'avoir des erreurs au démarrage, sauf fichier mal placé ou fautes de frappe. Vous pouvez vérifier que le service tourne bien:

netstat -tpln => chercher le port 25, vérifier qu'il n'est bien bindé que sur 127.0.0.1
systemctl status postfix.service

Test du fonctionnement

Traces

Mettre en place des traces pour vérifier le bon fonctionnement:

tail -f /var/log/mail.log /var/log/mail.err &

Envoi manuel d'un mail avec telnet

root@machine:~# telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 machine.localdomain ESMTP Postfix (Debian/GNU)

Le log indique:

==> /var/log/mail.log <==
Feb 23 11:38:08 machine postfix/smtpd[6555]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Feb 23 11:38:08 machine postfix/smtpd[6555]: connect from localhost[127.0.0.1]

Pas de pb, les messages en warning peuvent être ignorés.

ehlo localhost
250-machine.localdomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
mail from: contact@domaine.test
250 2.1.0 Ok
rcpt to: adresse@domaine.dest
250 2.1.5 Ok

Le log indique:

Feb 23 11:38:33 machine postfix/smtpd[6555]: 898B22C250D: client=localhost[127.0.0.1]
data
354 End data with <CR><LF>.<CR><LF>
Subject: test relay SASL
Ca fonctionne?
.

Le log indique:

Feb 23 11:38:50 machine postfix/cleanup[6615]: 898B22C250D: message-id=<20190223113833.898B22C250D@machine.localdomain>

250 2.0.0 Ok: queued as 898B22C250D

Feb 23 11:38:50 machine postfix/qmgr[6137]: 898B22C250D: from=<contact@domaine.test>, size=360, nrcpt=1 (queue active)
Feb 23 11:38:51 machine postfix/smtp[6651]: 898B22C250D: to=<adresse@domaine.dest>, relay=smtp.google.com[A.B.C.D]:587, delay=26, delays=25/0.05/0.06/0.18, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 25E42240005)
Feb 23 11:38:51 machine postfix/qmgr[6137]: 898B22C250D: removed

Le mail est correctement délivré!

Vérifier la réception

Checker la boite de destination. Vérifier que le mail est bien délivré et qu'il n'est pas classé directement en spam.