« 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]


= Commandes les plus utiles =
= Pré requis =


== Vérifier les versions TLS supportées par un openssl ==
* 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.


openssl ciphers -v| awk '{ print $2 }'|sort|uniq
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.


Exemple sur un vieux openssl:
[[Fichier:SecGroup..PNG]]


<pre>
= Installation et configuration =
[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:
== Vérifications préalables ==


<pre>
* Vérifier s'il y a déjà un service SMTP installé en local:
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 ==
netstat -tpln '''==> vérifier ce qui écoute sur le port 25'''


openssl s_client -connect google.com:443 -brief -<version_tls>
* Si besoin, désinstaller l'éventuel service SMTP (ex: exim par défaut sur les images Debian Scaleway):


Exemple:
apt-get remove exim4 --purge


<pre>
== Installation de postfix ==
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 ==
apt-get update
apt-get install postfix


for v in ssl2 ssl3 tls1 tls1_1 tls1_2 tls1_3; do \
Dans l'assistant de configuration graphique proposé par l'installer Postfix, choisir "No configuration", on fera tout manuellement ensuite.
  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 ==
== Préparation de la configuration ==


  openssl s_client -connect <host>:<port>
  cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf


== Générer un CSR ==
== Configuration compte SASL ==


  openssl req -sha256 -nodes -newkey rsa:2048 -keyout www.monsite.com.key -out www.monsite.com.csr
  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


A partir d'un fichier de détails:
== Configuration des aliases ==


  openssl req -nodes -newkey rsa:2048 -sha256 -keyout monsite.key -out monsite.csr -config <(cat csr_details.txt)
  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)'''


Format du fichier de détails:
== Configuration relaying SASL ==
 
vi /etc/postfix/main.cf
 
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
 
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
 
# appending .domain is the MUA's job.
append_dot_mydomain = no


[ dn ]
# Uncomment the next line to generate "delayed mail" warnings
C=FR
#delay_warning_time = 4h
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 ]
readme_directory = no
subjectAltName = @alt_names


[ alt_names ]
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
DNS.1 = <alt_name_1>
# fresh installs.
DNS.2 = <alt_name_2>
compatibility_level = 2
IP.1 = <IP>


== Lire le contenu d'un CSR ==
</pre>


openssl req -noout -text -verify -in mon.domaine.com.csr
Ajouter en fin de fichier les lignes suivantes:


== Vérifier le contenu d'un certificat SSL au format PEM ==
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 x509 -in <nom_fichier_certif> -text -noout
== Redémarrer postfix pour prendre la configuration en compte ==


== Convertir DER (.crt .cer .der) au format PEM ==
systemctl restart postfix.service


openssl x509 -outform der -in certificate.cer -out certificate.der
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:


  openssl x509 -inform der -in certificate.der -out certificate.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


== Supprimer la passphrase d'une clé privée ==
= Test du fonctionnement =


openssl rsa -in /path/to/ssl/032019/withPassPhrase.key -out /path/to/ssl/withoutPassPhrase.key
== Traces ==


Puis en interactif, renseigner la passphrase. Vous pouvez ensuite utiliser la clé sans passphrase pour vos configurations.
Mettre en place des traces pour vérifier le bon fonctionnement:


== Vérifier la correspondance CSR/clé privée/clé publique ==
tail -f /var/log/mail.log /var/log/mail.err &


Obtenir le hash md5 du modulus de chaque fichier et les comparer (ils doivent tous être identiques):
== Envoi manuel d'un mail avec telnet ==


  openssl x509 -in <clépublique> -noout -modulus | openssl md5
  root@machine:~# telnet localhost 25
  openssl rsa -in <cléprivée> -noout -modulus | openssl md5
  Trying ::1...
  openssl req -in <csr> -noout -modulus | openssl md5
  Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 machine.localdomain ESMTP Postfix (Debian/GNU)


== Vérifier le bon ordre des clés publiques dans une chaîne ==
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]


Logique:
Pas de pb, les messages en warning peuvent être ignorés.
* 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
  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


Puis
Le log indique:


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


La clé de la chaine ayant un Subject égal à l'issuer de la clé précédente vient à la suite.
data
354 End data with <CR><LF>.<CR><LF>
Subject: test relay SASL
Ca fonctionne?
.


Ensuite concaténer toutes ces clés dans un seul et même fichier:
Le log indique:


  cat <clépublique> > fullchain.pem
  Feb 23 11:38:50 machine postfix/cleanup[6615]: 898B22C250D: message-id=<20190223113833.898B22C250D@machine.localdomain>
  cat <cléAC1> >> fullchain.pem
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)
  cat <cléACn> >> fullchain.pem
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)
cat <cléRootCA> >> fullchain.pem
  Feb 23 11:38:51 machine postfix/qmgr[6137]: 898B22C250D: removed
 
'''Le mail est correctement délivré!'''
 
== Vérifier la réception ==


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.