Corrections 1
parent
2c126fe34a
commit
08ba68fb3a
|
@ -15,7 +15,6 @@ seront décrites.
|
|||
bien que mal, en proposant de chiffrer les mails qui transitent d'un MTA à un
|
||||
autre, signant les mails émis par un serveur,... Toutes ces techniques sont
|
||||
mises en place autour du protocole mail, lequel ne change pas.
|
||||
|
||||
- Aujourd'hui, certains organismes influents ont le bon goût de rejeter les
|
||||
mails issus de serveurs n'implémentant pas les protocoles les plus
|
||||
importants. Quoi que l'on pense du poids de l'influence des géants, cela
|
||||
|
@ -27,7 +26,7 @@ seront décrites.
|
|||
## Au Cr@ns
|
||||
|
||||
| | *Statut au Cr@ns ?* | Adoption |
|
||||
|---------+-------------------+------------------------------------|
|
||||
|---------|-------------------|------------------------------------|
|
||||
| SPF | Implémenté | Large |
|
||||
| DKIM | Implémenté | Large |
|
||||
| SRS | Implémenté | ? |
|
||||
|
@ -37,6 +36,7 @@ seront décrites.
|
|||
| DANE | Non-implémenté | Faible (requiert DNSSEC) |
|
||||
|
||||
Tous ce qui est discuté ci-dessous fonctionne de la manière suivante :
|
||||
|
||||
- l'infrastructure émettrice (le Cr@ns) publie des informations la concernant,
|
||||
- les serveurs réceptionnant les mails (les `MX` des destinataires des mails émis par
|
||||
le Cr@ns) peuvent vérifier les mails à l'aide de ces informations.
|
||||
|
@ -45,7 +45,7 @@ Tous ce qui est discuté ci-dessous fonctionne de la manière suivante :
|
|||
émetteur car plus d'un service est souvent requis (*e.g.* un serveur DNS
|
||||
autoritaire, un serveur Web,...).
|
||||
|
||||
# SPF
|
||||
## SPF
|
||||
|
||||
- [SPF](https://www.rfc-editor.org/rfc/rfc7208),
|
||||
- [Page Wikipédia](https://en.wikipedia.org/wiki/Sender_Policy_Framework).
|
||||
|
@ -53,13 +53,18 @@ autoritaire, un serveur Web,...).
|
|||
Le SPF (*Sender Policy Framework*) permet d'indiquer quels serveurs ont le droit
|
||||
d'émettre des mails en `crans.org` (ou tout autre domaine, bien entendu).
|
||||
|
||||
## Implémentation (côté infrastructure émettrice)
|
||||
### Implémentation (côté infrastructure émettrice)
|
||||
|
||||
Pour cela, nous publions un champ `TXT` pour `crans.org`. Voici le contenu que l'on
|
||||
obtient pour quelques associations avec `kdig -t TXT crans.org` (`dig`
|
||||
peut être utilisé à la place de `kdig`) :
|
||||
|
||||
- Cr@ns: `v=spf1 mx ip4:185.230.79.1 ip6:2a0c:700:2:0:ec4:7aff:fe59:a1ad ip4:185.230.79.38 ip6:2a0c:700:2::ff:fe01:3502 ~all`
|
||||
Au Cr@ns :
|
||||
|
||||
```txt
|
||||
v=spf1 mx ip4:185.230.79.1 ip6:2a0c:700:2:0:ec4:7aff:fe59:a1ad ip4:185.230.79.38
|
||||
ip6:2a0c:700:2::ff:fe01:3502 ~all
|
||||
```
|
||||
|
||||
Cela signifie que les serveurs mail du Cr@ns (`mx`) et les adresses listées (et
|
||||
celles-ci uniquement) ont le droit d'envoyer des mails dont la source
|
||||
|
@ -68,7 +73,11 @@ prétendue est *...@crans.org*.
|
|||
Utiliser `~all` permet d'indiquer que si un mail provient d'une autre IP, il ne
|
||||
faut pas rejeter le mail, mais le mettre en *permerror*.
|
||||
|
||||
- April: `v=spf1 include:spf.mailjet.com mx ip4:62.73.5.35 include:spf.protection.outlook.com include:_spf.april.com ip4:37.71.69.68 ip4:37.71.69.69 ip4:37.71.69.70 include:_spf.salesforce.com -all`
|
||||
À l'April :
|
||||
|
||||
```txt
|
||||
v=spf1 include:spf.mailjet.com mx ip4:62.73.5.35 include:spf.protection.outlook.com include:_spf.april.com ip4:37.71.69.68 ip4:37.71.69.69 ip4:37.71.69.70 include:_spf.salesforce.com -all
|
||||
```
|
||||
|
||||
Idem, avec des champs `include:...` en plus. Ces derniers permettent d'inclure
|
||||
un autre enregistrement SPF (*e.g.* celui de `spf.mailjet.com`).
|
||||
|
@ -79,20 +88,20 @@ ne satisfaisant pas ce test. C'est une politique plus sévère que `~all`, qui a
|
|||
D'autres mécanismes et formats existent, mais nous ne les présentons pas
|
||||
ici. Se référer à la RFC ou la page Wikipédia pour leur description.
|
||||
|
||||
## Vérification (côté serveur récepteur)
|
||||
### Vérification (côté serveur récepteur)
|
||||
|
||||
Lorsque `redisdead` (le `MX` du Cr@ns) reçoit un mail, nous demandons à un service
|
||||
externe de vérifier le SPF (via la variable `smtpd_recipient_restrictions`). Le
|
||||
service externe tourne sur la même VM et est `postfix-policyd-spf-python`.
|
||||
|
||||
# TODO SRS
|
||||
## TODO SRS
|
||||
|
||||
- [Le papier d'origine](https://www.libsrs2.org/srs/srs.pdf),
|
||||
- [La page Wikipédia](https://en.wikipedia.org/wiki/Sender_Rewriting_Scheme).
|
||||
|
||||
*Note :* les adresses générées par `postsrsd` sont valides pendant 21 jours.
|
||||
|
||||
# DKIM
|
||||
## DKIM
|
||||
|
||||
- [La RFC](https://www.rfc-editor.org/rfc/rfc6376.html),
|
||||
- [La page Wikipédia](https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail).
|
||||
|
@ -101,12 +110,13 @@ Le protocole DKIM (*Domain Key Identified Mail*) permet au serveur émetteur de
|
|||
mails, et au serveur récepteur de vérifier cette signature, en utilisant des
|
||||
méthodes de cryptographie asymétrique.
|
||||
|
||||
## Implémentation (côté émetteur)
|
||||
### Implémentation (côté émetteur)
|
||||
|
||||
### Serveur mail
|
||||
#### Serveur mail
|
||||
|
||||
Le serveur émetteur possède la clef privée. Il ajoute à tout mail sortant un
|
||||
champ à l'en-tête de la forme suivante :
|
||||
|
||||
```txt
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=crans.org; s=mail;
|
||||
t=1702660809; bh=NqcDLO2gkZU0IxcV+mE7uZ2NRnN/yfceH73Q1nhaFg4=;
|
||||
|
@ -125,30 +135,43 @@ champ à l'en-tête de la forme suivante :
|
|||
```
|
||||
|
||||
Le bloc contient une liste de clefs-valeurs :
|
||||
|
||||
- `v` indique la version du protocole,
|
||||
- `d` le domaine attestant de la validité du mail,
|
||||
- `s` le nom du sélecteur (/Cf/. plus bas),
|
||||
- `b` et `bh` contiennent les signatures.
|
||||
|
||||
*Notes :*
|
||||
|
||||
- Il est possible que le mail ne soit pas signé par le domaine correspondant à
|
||||
l'adresse d'envoi, puisqu'il est possible d'autoriser autrui à envoyer un
|
||||
mail à notre place (*cf*. SPF plus haut).
|
||||
- Se référer à la page Wikipédia, ou à la RFC pour une liste exhaustive des
|
||||
clefs.
|
||||
|
||||
### Serveur DNS
|
||||
#### Serveur DNS
|
||||
|
||||
Il faut placer dans le serveur DNS un champ TXT dont la clef est
|
||||
`sélecteur._domainkey.domain`, où `domain` (resp. `sélecteur`) est la valeur de la
|
||||
clef `d` (resp. `s`) définie plus haut.
|
||||
|
||||
Par exemple, pour le champ fourni plus haut, nous pouvons lire :
|
||||
|
||||
```txt
|
||||
"v=DKIM1; k=rsa; " "p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtwkNVd9Mmz8S4WcfuPk0X2drG39gS8" "+uxAv8igRILgzWeN8j2hjeZesl8pm/1UTVU87bYcdfUgXiGfQy9nR5p/Vmt2kS7sXk9nsJ/VYENg" "b3IJQ6paWupSTFMyeKycJ4ZHCEZB/bVvifoG6vLKqW5jpsfCiOcfdcgXATn0UPuVx9t93yRrhoEM" "ntMv9TSodjqd3FKCtJUoh5cNQHo0T6dWKtxoIgNi/mvZ92D/IACwu/XOU+Rq9fnoEI8GukBQUR5A" "kP0B/JrvwWXWX/3EjY8X37ljEX0XUdq/ShzTl5iK+CM83stgkFUQh/rpww5mnxYEW3X4uirJ7VJH" "mY4KPoIU+2DPjLQj9Hz63CMWY3Ks2pXWzxD3V+GI1aJTMFOv2LeHnI3ScqFaKj9FR4ZKMb0OW2BE" "FBIY3J3aeo/paRwdbVCMM7twDtZY9uInR/NhVa1v9hlOxwp4/2pGSKQYoN2CkAZ1Alzwf8M3EONL" "KeiC43JLYwKH1uBB1oikSVhMnLjG0219XvfG/tphyoOqJR/bCc2rdv5pLwKUl4wVuygfpvOw12bc" "vnTfYuk/BXzVHg9t4H8k/DJR6GAoeNAapXIS8AfAScF8QdKfplhKLJyQGJ6lQ75YD9IwRAN0oV+8" "NTjl46lI/C+b7mpfXCew+p6YPwfNvV2shiR0Ez8ZGUQIcCAwEAAQ=="
|
||||
"v=DKIM1; k=rsa; "
|
||||
"p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtwkNVd9Mmz8S4WcfuPk0X2drG39gS8" "
|
||||
+uxAv8igRILgzWeN8j2hjeZesl8pm/1UTVU87bYcdfUgXiGfQy9nR5p/Vmt2kS7sXk9nsJ/VYENg"
|
||||
"b3IJQ6paWupSTFMyeKycJ4ZHCEZB/bVvifoG6vLKqW5jpsfCiOcfdcgXATn0UPuVx9t93yRrhoEM"
|
||||
"ntMv9TSodjqd3FKCtJUoh5cNQHo0T6dWKtxoIgNi/mvZ92D/IACwu/XOU+Rq9fnoEI8GukBQUR5A" "kP0B/
|
||||
JrvwWXWX/3EjY8X37ljEX0XUdq/ShzTl5iK+CM83stgkFUQh/rpww5mnxYEW3X4uirJ7VJH" "mY4KPoIU
|
||||
+2DPjLQj9Hz63CMWY3Ks2pXWzxD3V+GI1aJTMFOv2LeHnI3ScqFaKj9FR4ZKMb0OW2BE" "FBIY3J3aeo/
|
||||
paRwdbVCMM7twDtZY9uInR/NhVa1v9hlOxwp4/2pGSKQYoN2CkAZ1Alzwf8M3EONL"
|
||||
"KeiC43JLYwKH1uBB1oikSVhMnLjG0219XvfG/tphyoOqJR/bCc2rdv5pLwKUl4wVuygfpvOw12bc" "vnTfYuk/
|
||||
BXzVHg9t4H8k/DJR6GAoeNAapXIS8AfAScF8QdKfplhKLJyQGJ6lQ75YD9IwRAN0oV+8" "NTjl46lI/C
|
||||
+b7mpfXCew+p6YPwfNvV2shiR0Ez8ZGUQIcCAwEAAQ=="
|
||||
```
|
||||
|
||||
## Vérification (côté récepteur)
|
||||
### Vérification (côté récepteur)
|
||||
|
||||
Côté réception (`redisdead` pour nous), nous utilisons le milter (filtre pour
|
||||
mail) fourni par `opendkim`. Ce milter écoute en local et est appelé par `postfix`.
|
||||
|
@ -157,17 +180,17 @@ prendre. Ce dernier va regarder les en-têtes du mail. Si il trouve une signatur
|
|||
DKIM, il va effectuer la requête DNS décrite plus haut et vérifier la signature
|
||||
du mail (valeurs des clefs `b` et `bh`).
|
||||
|
||||
# TODO DMARC
|
||||
## TODO DMARC
|
||||
|
||||
- [La RFC](https://www.rfc-editor.org/rfc/rfc7489),
|
||||
- [La page Wikipédia](https://en.wikipedia.org/wiki/DMARC).
|
||||
|
||||
# TODO ARC
|
||||
## TODO ARC
|
||||
|
||||
- [La RFC](https://www.rfc-editor.org/rfc/rfc8617.html),
|
||||
- [La page Wikipédia](https://en.wikipedia.org/wiki/Authenticated_Received_Chain).
|
||||
|
||||
* MTA-STS
|
||||
## MTA-STS
|
||||
|
||||
- [La RFC](https://datatracker.ietf.org/doc/html/rfc8461),
|
||||
- [La page Wikipédia](https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#SMTP_MTA_Strict_Transport_Security).
|
||||
|
@ -179,37 +202,39 @@ Contrairement au `DANE` (décrit plus bas), ce protocole ne demande pas la mise
|
|||
place de DNSSEC. En revanche, il demande d'avoir un serveur Web accessible en
|
||||
`https` (pour nous, `https://crans.org` doit être servi par un serveur Web).
|
||||
|
||||
## Implémentation (côté infrastructure émettrice)
|
||||
### Implémentation (côté infrastructure émettrice)
|
||||
|
||||
### Dans la zone DNS
|
||||
#### Dans la zone DNS
|
||||
|
||||
Il faut ajouter un champ `TXT` accessible à `_mts-sts.domain.tld`.
|
||||
|
||||
Quelques exemples :
|
||||
|
||||
- Gmail : `v=STSv1; id=20190429T010101;`,
|
||||
- Microsoft : `v=STSv1; id=20190225000000Z;`,
|
||||
- Outlook : `v=STSv1; id=20190225000000Z;`.
|
||||
|
||||
### Sur le serveur Web
|
||||
#### Sur le serveur Web
|
||||
|
||||
Il faut que le serveur Web associé serve un fichier texte accessible à l'adresse
|
||||
`https://mta-sts.domain.tld/.well-known/mta-sts.txt`
|
||||
|
||||
Quelques exemples :
|
||||
+ [Gmail](https://mta-sts.gmail.com/.well-known/mta-sts.txt),
|
||||
+ [Outlook](https://mta-sts.outlook.com/.well-known/mta-sts.txt),
|
||||
+ [Microsoft](https://mta-sts.microsoft.com/.well-known/mta-sts.txt).
|
||||
|
||||
- [Gmail](https://mta-sts.gmail.com/.well-known/mta-sts.txt),
|
||||
- [Outlook](https://mta-sts.outlook.com/.well-known/mta-sts.txt),
|
||||
- [Microsoft](https://mta-sts.microsoft.com/.well-known/mta-sts.txt).
|
||||
|
||||
Le fichier texte contient une liste de clefs-valeurs. Ces clefs décrivent quel
|
||||
protocole sera utilisé.
|
||||
|
||||
## Vérification côté récepteur.
|
||||
### Vérification côté récepteur
|
||||
|
||||
Est-il possible d'utiliser `postfix-mta-sts-resolver` ? N'ayant pas implémenté cette
|
||||
solution pour le moment (ni au Cr@ns, ni personnellement), nous ne pouvons pas
|
||||
commenter sur le sujet.
|
||||
|
||||
# DANE
|
||||
## DANE
|
||||
|
||||
- [La RFC](https://www.rfc-editor.org/rfc/rfc6698),
|
||||
- [La page Wikipédia](https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities).
|
||||
|
@ -218,15 +243,16 @@ Actuellement, pour vérifier un certificat `C` proposé par un serveur mail, il
|
|||
faire confiance à un certificat racine, lequel est utilisé pour signer un autre
|
||||
certificat (dit *certificat intermédiaire*), lequel est utilisé pour signer le
|
||||
certificat `C`. Pour vérifier `C`, il faut
|
||||
+ faire confiance au certificat racine,
|
||||
+ vérifier les deux signatures sus-mentionnées.
|
||||
|
||||
- faire confiance au certificat racine,
|
||||
- vérifier les deux signatures sus-mentionnées.
|
||||
|
||||
`DANE` est une norme permettant aux propriétaires de domaines de déclarer quels
|
||||
cetificats doivent être acceptés pour quels services.
|
||||
|
||||
*Note :* cela n'est pas spécifique aux mails.
|
||||
|
||||
## Implémentation (côté infrastructure émettrice)
|
||||
### Implémentation (côté infrastructure émettrice)
|
||||
|
||||
Pour mettre en place `DANE`, il suffit d'ajouter un champ DNS à sa zone :
|
||||
|
||||
|
@ -247,7 +273,7 @@ Pour mettre en place `DANE`, il suffit d'ajouter un champ DNS à sa zone :
|
|||
L'objectif de ce champ est d'indiquer comment vérifier le certificat.
|
||||
|
||||
| *Valeur* | *Signification* |
|
||||
|--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 0 | Le certificat doit être valide (root -> intermediate -> "cert"), et /associated data/ décrit l'un des certificats parents de "cert" |
|
||||
| 1 | `associated data` décrit "cert", et le certificat doit aussi être valide /wrt/. un certificat racine de confiance. |
|
||||
| 2 | `associated data` décrit un parent de "cert". Ce parent est supposé de confiance, et "cert" doit bien être son descendant. |
|
||||
|
@ -258,7 +284,7 @@ L'objectif de ce champ est d'indiquer comment vérifier le certificat.
|
|||
Ce champ décrit ce qui est décrit par `associated data`.
|
||||
|
||||
| *Valeur* | *Signification* |
|
||||
|--------+-----------------------------|
|
||||
|--------|-----------------------------|
|
||||
| 0 | Tout le certificat. |
|
||||
| 1 | Seulement la clef publique. |
|
||||
|
||||
|
@ -268,7 +294,7 @@ Ce champ indique comment vérifier `associated data` contre la donnée du certif
|
|||
(ou de la clef publique).
|
||||
|
||||
| *Valeur* | *Signification* |
|
||||
|--------+--------------------------------------------------------|
|
||||
|--------|--------------------------------------------------------|
|
||||
| 0 | `associated data` doit être égal à la donnée. |
|
||||
| 1 | `associated data` doit être égal au sha256 de la donnée. |
|
||||
| 2 | `associated data` doit être égal au sha512 de la donnée. |
|
||||
|
@ -287,11 +313,13 @@ peut faire la même chose (ou du `3 0 2`).
|
|||
### Mise en place
|
||||
|
||||
Hypothèses :
|
||||
|
||||
- le serveur DNS accepte des mises à jour DNS dynamiques de la part du serveur
|
||||
mail,
|
||||
- le renouvellement du certificat utilise `certbot`.
|
||||
|
||||
Mise en place :
|
||||
|
||||
- Dans la confguration `certbot`,
|
||||
+ passer en challenge DNS-01 et :
|
||||
* `manual_auth_hook` : un script mettant en place le challenge,
|
||||
|
@ -316,10 +344,11 @@ Mise en place :
|
|||
=> 3 0 1 50E9221F066DCD1991ED9D3BA0AD10159F3585780F6FABBAE2942E43 37789FC8
|
||||
```
|
||||
|
||||
## Implémentation (côté serveur mail destinataire)
|
||||
### Implémentation (côté serveur mail destinataire)
|
||||
|
||||
Côté serveur mail destinataire, la configuration est très simple (car nous
|
||||
utilisons Postfix). Cela se fait principalement via les options suivantes :
|
||||
|
||||
- `smtp_dns_supoprt_level` (valeur `dnssec`)
|
||||
- `smtp_tls_dane_insecure_mx_policy` (valeur `dane`)
|
||||
|
||||
|
|
Loading…
Reference in New Issue