SecuMail » Historique » Version 24
Fabien Dupont, 17/08/2012 17:28
1 | 3 | Fabien Dupont | h1. Sécuriser un serveur de mail |
---|---|---|---|
2 | 1 | Fabien Dupont | |
3 | 2 | Fabien Dupont | {{>toc}} |
4 | 2 | Fabien Dupont | |
5 | 1 | Fabien Dupont | h2. Présentation des différents systèmes |
6 | 1 | Fabien Dupont | |
7 | 10 | Fabien Dupont | h3. Antivirus |
8 | 10 | Fabien Dupont | |
9 | 10 | Fabien Dupont | Bon...linux, pas de virus, tout ça tout ça...m'enfin, ça ne coûte pas grand chose de filtrer ses propres messages à l'envoi pour s'assurer qu'on ne forwarde pas un PPT plein de chatons qui jouent du piano et de virus. Et puis quitte à filtrer dans un sens, autant filtrer dans l'autre. |
10 | 10 | Fabien Dupont | |
11 | 10 | Fabien Dupont | Il n'y a pas 50000 antivirus sous linux, ClamAV est l'un des plus complet, mis à jour et performant. Appelé depuis "ClamSMTP":http://thewalter.net/stef/software/clamsmtp/, il s'intègre très bien à postfix. |
12 | 10 | Fabien Dupont | |
13 | 1 | Fabien Dupont | h3. Spamassassin |
14 | 1 | Fabien Dupont | |
15 | 22 | Fabien Dupont | "Spamassassin":http://spamassassin.apache.org/ est un programme en perl développé par la fondation Apache. Ce programme regroupe plusieurs méthodes de détection de spams telles que : |
16 | 1 | Fabien Dupont | |
17 | 1 | Fabien Dupont | * DNSBL (DNS BlackList) : blocage d'adresses IP (voir RBL plus loin) par interrogation de DNS. |
18 | 1 | Fabien Dupont | * SURBL (URL BlackList) : idem mais par interrogation d'URI. |
19 | 1 | Fabien Dupont | * Hashcash : Système en DoS se basant sur la consommation CPU utilisée par l'émetteur lors de l'envoi de mail. |
20 | 1 | Fabien Dupont | |
21 | 1 | Fabien Dupont | D'autres sont disponibles via l'installation et l'activation de plug'ins. |
22 | 1 | Fabien Dupont | |
23 | 1 | Fabien Dupont | De plus, SpamAssassin, propose la détection de spams via l'application de "filtres bayesiens":http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Bayes permettant de différencier les spams des hams (les « pas spams »). |
24 | 1 | Fabien Dupont | |
25 | 1 | Fabien Dupont | h3. Greylisting |
26 | 1 | Fabien Dupont | |
27 | 1 | Fabien Dupont | Le greylisting est un procédé permettant de refuser la réception de spams en provenance de spambots. Ce procédé se base sur le fait que certains spams ne sont pas émis depuis de « vrais » serveurs de mail. |
28 | 1 | Fabien Dupont | Un « vrai » serveur de mail dispose d'une file de messages dans laquelle il stocke les messages dont l'émission a été refusée par une erreur 4xx (généralement, 450) alors qu'un spambot émets des mails sans se soucier du succès de l'envoi ou pas. |
29 | 1 | Fabien Dupont | |
30 | 1 | Fabien Dupont | Ainsi, un daemon de greylisting refuse systématiquement les mails en provenance d'un serveur en retournant un code d'erreur 450. Dans le même temps, il mémorise les informations de ce serveur (IP, nom, etc.). Ãtant donné que le code d'erreur n'est pas un refus catégorique (5xx), le serveur émetteur retente un envoi régulièrement, généralement toutes les 5 ou 10 minutes, jusqu'à la fin d'un timeout défini, généralement plusieurs jours. Si le même message a été émis 3 fois d'affilé, le daemon de greylisting l'accepte et place le serveur émetteur dans une « whitelist » temporaire pendant un temps défini. |
31 | 1 | Fabien Dupont | |
32 | 22 | Fabien Dupont | Un des daemons de greylisting célèbre et fonctionnant bien avec postfix est "postgrey":http://postgrey.schweikert.ch/. |
33 | 1 | Fabien Dupont | |
34 | 13 | Fabien Dupont | h3. Realtime Black Lists ou Domain Name Server based BlackLists |
35 | 1 | Fabien Dupont | |
36 | 13 | Fabien Dupont | Les RBL ou DNSBL sont des listes mises à jour en temps réel d'adresses IP réputées pour être émettrices de spams. L'interrogation de ces listes se fait grâce au protocole DNS. |
37 | 1 | Fabien Dupont | |
38 | 1 | Fabien Dupont | Par exemple, pour savoir si l'adresse IP 91.224.149.142 est classée comme émettrice de spams, d'abord, retournons là : 142.149.224.91. Puis ajoutons le nom d'une RBL, par exemple sbl-xbl.spamhaus.org. Et regardons si une adresse IP correspond à ce « nom de domaine » : |
39 | 1 | Fabien Dupont | |
40 | 1 | Fabien Dupont | <pre> |
41 | 1 | Fabien Dupont | $ host 142.149.224.91.sbl-xbl.spamhaus.org |
42 | 1 | Fabien Dupont | Host 142.149.224.91.sbl-xbl.spamhaus.org not found: 3(NXDOMAIN) |
43 | 1 | Fabien Dupont | </pre> |
44 | 1 | Fabien Dupont | |
45 | 1 | Fabien Dupont | Pas d'adresse IP associée à ce nom de domaine, l'adresse IP 91.224.149.142 est clean ! |
46 | 1 | Fabien Dupont | |
47 | 1 | Fabien Dupont | Même exercice pour l'adresse IP 114.37.70.152 : |
48 | 1 | Fabien Dupont | |
49 | 1 | Fabien Dupont | <pre> |
50 | 1 | Fabien Dupont | # host 152.70.37.114.sbl-xbl.spamhaus.org |
51 | 1 | Fabien Dupont | 152.70.37.114.sbl-xbl.spamhaus.org has address 127.0.0.4 |
52 | 1 | Fabien Dupont | </pre> |
53 | 1 | Fabien Dupont | |
54 | 1 | Fabien Dupont | L'adresse IP 127.0.0.4 est retournée et selon la "documentation de spamhaus.org":http://www.spamhaus.org/zen/, 127.0.0.4 veut dire que cette IP est notée comme étant une machine infectée par un virus émetteur de spam. |
55 | 1 | Fabien Dupont | |
56 | 1 | Fabien Dupont | L'utilisation de RBL pour bloquer les mails est souvent soumise à controverse car le remplissage et la maintenance de ces listes sont généralement obscurs. Il en existe même qui demande une rémunération pour la suppression d'adresse IP. Bref, libre à chacun d'utiliser ces listes ou pas tant que c'est en tout connaissance de cause. |
57 | 1 | Fabien Dupont | |
58 | 1 | Fabien Dupont | h3. SPF |
59 | 1 | Fabien Dupont | |
60 | 22 | Fabien Dupont | "SPF":http://www.openspf.org/ ou « Sender Policy Framework », est un système anti « spoofing ». C'est à dire qu'il permet de valider que le serveur émetteur du mail est bien le serveur qui gère les mails de ce domaine. |
61 | 1 | Fabien Dupont | |
62 | 1 | Fabien Dupont | Ce système se base sur la mise en place d'un champ TXT (ou SPF) dans le nom de domaine émetteur. Ce champs ne peut être ajouté que par le gestionnaire du domaine et donc sûrement le gestionnaire du serveur de mail émetteur (en tout cas, lui seul peut valider que l'un est associé à l'autre). |
63 | 1 | Fabien Dupont | |
64 | 1 | Fabien Dupont | Ce champ TXT permet de valider que le nom de domaine de l'adresse mail émettrice, l'adresse IP du serveur émetteur et son reverse sont valides. |
65 | 1 | Fabien Dupont | |
66 | 1 | Fabien Dupont | Exemple de champs SPF pour le domaine kafe-in.net : |
67 | 1 | Fabien Dupont | |
68 | 1 | Fabien Dupont | <pre> |
69 | 1 | Fabien Dupont | $ dig +short spf kafe-in.net |
70 | 1 | Fabien Dupont | "v=spf1 mx ptr:muscat.kafe-in.net ptr:fdn.le.fai.avec.les.bulles.qui.vont.vers.le.bas.kafe-in.net mx:mail.kafe-in.net mx:mail2.kafe-in.net ip6:2a01:6600:8081:8e00::fab ip6:2001:910:109c:2::25 ip4:91.224.149.142 ip4:80.67.176.156 include:dupont.eu.org -all" |
71 | 1 | Fabien Dupont | </pre> |
72 | 1 | Fabien Dupont | |
73 | 1 | Fabien Dupont | h3. DKIM |
74 | 1 | Fabien Dupont | |
75 | 22 | Fabien Dupont | "DKIM":http://www.dkim.org/, ou « DomainKeys Identified Mail », est une autre méthode pour associer un nom de domaine à un mail. Cette validation se base sur l'ajout d'un header contenant une clé, cette clé permet de signer le mail. Cette signature est validée en interrogeant un champ TXT du nom de domaine émetteur du mail. |
76 | 1 | Fabien Dupont | |
77 | 1 | Fabien Dupont | Exemple de champs TXT pour le domaine kafe-in.net et de signature : |
78 | 1 | Fabien Dupont | |
79 | 1 | Fabien Dupont | <pre> |
80 | 1 | Fabien Dupont | dig +short txt default._domainkey.kafe-in.net |
81 | 1 | Fabien Dupont | "v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCh2cOuv5Tb+oFElVq3sf837oclBXoiHcMDjlWxpjCfjyYq1fSZNyMxXG/CKqLRx/bqyI/Bcl6n30pR8Okp8ItjBvUXQJwh6fczyKdto69Z2DrGf495ANghUtPxKFOe98PXuEa0OmvhOD45VOKeHU9TW32SgxHy6kxur/WMaJMbDwIDAQAB" |
82 | 1 | Fabien Dupont | </pre> |
83 | 1 | Fabien Dupont | |
84 | 1 | Fabien Dupont | <pre> |
85 | 1 | Fabien Dupont | DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=kafe-in.net; |
86 | 1 | Fabien Dupont | s=default; t=1344852664; |
87 | 1 | Fabien Dupont | bh=fdkeB/A0FkbVP2k4J4pNPoeWH6vqBm9+b0C3OY87Cw8=; |
88 | 1 | Fabien Dupont | h=From:Date:To:Subject; |
89 | 1 | Fabien Dupont | b=DqT32ZzqUgRPm9PGYwfB7nxJiyaTLxT6yoeIPLqPnxwgMJ933nYLxQpMimSsaKZdT |
90 | 1 | Fabien Dupont | iGo68RBhgFFXe+6zJCWPZbCye8ptW8awCHfwsogYAzvRs0wk9rF/r78CWZXAn6dCeH |
91 | 1 | Fabien Dupont | cCMomFWcBOzTdbqQ/ZKizBCOdgLsT/aPDVBV00Eo= |
92 | 1 | Fabien Dupont | </pre> |
93 | 1 | Fabien Dupont | |
94 | 3 | Fabien Dupont | h2. Enchaînement des différents systèmes |
95 | 3 | Fabien Dupont | |
96 | 3 | Fabien Dupont | Il existe plusieurs moyens pour postfix de vérifier la validité du mail, ou pas : |
97 | 3 | Fabien Dupont | |
98 | 3 | Fabien Dupont | * Les content filters : Ce sont des programmes recevant un mail selon le protocole SMTP et le renvoyant, ou pas, à postfix selon le même protocole après ajout de headers. Exemple : ClamSMTP et SpamAssassin. |
99 | 3 | Fabien Dupont | * Les milters : ce sont des programmes dialoguant avec postfix sur un port TCP donné en suivant un "protocole défini":https://www.milter.org/developers/api/index. Exemple : OpenDKIM. |
100 | 3 | Fabien Dupont | * Les policy services : Ce sont des programmes au fonctionnement proche des milters. Ils permettent de valider ou non le passage d'un mail selon ses paramètres. Exemple : PostGrey et postfix-policyd-spf-python. |
101 | 3 | Fabien Dupont | * Les RBL : Voir plus haut, la gestion des RBL est gérée directement par postfix. |
102 | 3 | Fabien Dupont | |
103 | 3 | Fabien Dupont | Voilà rapidement l'enchaînement des validations faites à l'arrivée d'un mail : |
104 | 3 | Fabien Dupont | |
105 | 3 | Fabien Dupont | * Ãmetteur : Ouverture d'une connexion sur le port 25 (SMTP). |
106 | 3 | Fabien Dupont | * Récepteur : Vérification de la validité de l'adresse IP source et consultation des RBL (smtpd_client_restrictions). |
107 | 3 | Fabien Dupont | * Ãmetteur : HELO sondomaine.tld |
108 | 3 | Fabien Dupont | * Récepteur : Vérification de la validité du domaine et du reverse (smtpd_helo_restrictions). |
109 | 3 | Fabien Dupont | * Ãmetteur : MAIL from : "Marvin the paranoid android" <marvin@sondomaine.tld> |
110 | 3 | Fabien Dupont | * Récepteur : Vérification de la validité de l'adresse émettrice (smtpd_sender_restrictions). |
111 | 7 | Fabien Dupont | * Ãmetteur : RCPT to : "Fabien Dupont" <fab@mondomaine.tld> |
112 | 3 | Fabien Dupont | * Récepteur : Vérification de la validité de l'adresse destinataire (smtpd_recipient_restrictions). |
113 | 6 | Fabien Dupont | ** Interrogation du « policy service » postgrey sur le port 10023 |
114 | 6 | Fabien Dupont | ** Interrogation du « policy service » python-spf via la socket unix private/policyd-spf |
115 | 7 | Fabien Dupont | * Récepteur : Envoi du code de retour au serveur émetteur ("RFC3463":http://www.rfc-editor.org/rfc/rfc3463.txt) : |
116 | 6 | Fabien Dupont | ** 3xx : OK pour la suite |
117 | 7 | Fabien Dupont | ** 4xx : Erreur temporaire (exemple: postgrey). |
118 | 6 | Fabien Dupont | ** 5xx : Erreur permanente (Adresse émettrice ou réceptrice non valide). |
119 | 3 | Fabien Dupont | * Ãmetteur : DATA puis le contenu du mail (headers compris). |
120 | 3 | Fabien Dupont | * Récepteur : Transfert du mail au « content filters » : |
121 | 6 | Fabien Dupont | ** ClamSMTP reçoit le mail sur le port 10025 et si le mail est valide... |
122 | 6 | Fabien Dupont | ** SpamAssassin reçoit le mail sur le port 10026 et si le mail est valide... |
123 | 1 | Fabien Dupont | ** Postfix récupère le mail validé sur le port 10028 |
124 | 7 | Fabien Dupont | * Récepteur : Validation du mail via le milter OpenDKIM sur le port 10028 |
125 | 3 | Fabien Dupont | * Récepteur : Envoi du code de retour au serveur émetteur ("RFC3463":http://www.rfc-editor.org/rfc/rfc3463.txt) : |
126 | 7 | Fabien Dupont | ** 2xx : OK pour l'envoi |
127 | 1 | Fabien Dupont | ** 5xx : Erreur permanente (exemple: spam détecté par SpamAssassin, virus par ClamAV, etc.). |
128 | 22 | Fabien Dupont | * Ãmetteur : Fermeture de la connexion. |
129 | 1 | Fabien Dupont | |
130 | 1 | Fabien Dupont | h2. Installation et configuration |
131 | 1 | Fabien Dupont | |
132 | 7 | Fabien Dupont | h3. Postfix |
133 | 7 | Fabien Dupont | |
134 | 1 | Fabien Dupont | h4. Configuration de base |
135 | 7 | Fabien Dupont | |
136 | 7 | Fabien Dupont | Ce tutoriel part du principe que postfix est déjà correctement installé et configuré pour l'émission et la réception de mails. |
137 | 1 | Fabien Dupont | |
138 | 7 | Fabien Dupont | La configuration de postfix sera modifiée au fur et à mesure de l'installation des différents services. |
139 | 7 | Fabien Dupont | |
140 | 22 | Fabien Dupont | Postfix, s'il est configuré en tant que serveur de mail visible depuis internet, doit être configuré pour autoriser la réception de messages depuis n'importe où et l'émission uniquement depuis le réseau local. Si ce n'est pas le cas, le serveur de mail sera configuré en mode "open relay":http://en.wikipedia.org/wiki/Open_relay. Bien évidemment un tel serveur serait une plateforme d'envoi de spams ou autres saletés. Il serait très vite blacklisté auprès des différentes RBL. |
141 | 7 | Fabien Dupont | |
142 | 7 | Fabien Dupont | Pour ce tutoriel, le serveur de mail nommé ve-mail hébergera des adresses du domaine kafe-in.net et le réseau local sera composé de 192.168.2.0/24 en IPv4 et 2001:910:109c::/48 en IPv6. |
143 | 7 | Fabien Dupont | |
144 | 22 | Fabien Dupont | _main.cf :_ |
145 | 1 | Fabien Dupont | <pre> |
146 | 7 | Fabien Dupont | mydomain = kafe-in.net |
147 | 7 | Fabien Dupont | mydestination = ve-mail, ve-mail.kafe-in.net, localhost.localdomain, localhost, kafe-in.net |
148 | 7 | Fabien Dupont | mynetworks = 127.0.0.0/8, [::1]/128, 192.168.2.125/32, [2001:910:109c::]/48 |
149 | 7 | Fabien Dupont | </pre> |
150 | 7 | Fabien Dupont | |
151 | 7 | Fabien Dupont | h4. Restrictions de base |
152 | 7 | Fabien Dupont | |
153 | 23 | Fabien Dupont | Dans un premier temps, il faut indiquer à postfix qu'il faut délayer le rejet d'un mail à la fin du dialogue avec dialogue avec le serveur SMTP distant. C'est le paramètre "smtpd_delay_reject":http://www.postfix.org/postconf.5.html#smtpd_delay_reject. Ceci permet "3 choses":http://www.postfix.org/SMTPD_ACCESS_README.html#timing : |
154 | 1 | Fabien Dupont | |
155 | 7 | Fabien Dupont | * certains serveurs SMTP ne prennent pas en compte les rejets pendant l'émission d'un mail et essaient donc de finir de l'envoyer même s'il a été refusé, |
156 | 7 | Fabien Dupont | * postfix peut ainsi logger plusieurs informations intéressantes relatives à l'émetteur et au destinataire du mail, |
157 | 7 | Fabien Dupont | * une adresse émettrice peut être rejetée selon le destinataire du mail (ex: greylisting), il faut donc avoir tous les paramètres du mail avant de prendre une décision. |
158 | 7 | Fabien Dupont | |
159 | 7 | Fabien Dupont | Le paramètre "smtpd_helo_required":http://www.postfix.org/postconf.5.html#smtpd_helo_required permet de n'autoriser la réception de mail que si le serveur distant s'est présenté (HELO). Cela permet d'introduire des restrictions par rapport à cette commande SMTP (voir plus bas). |
160 | 7 | Fabien Dupont | |
161 | 7 | Fabien Dupont | Le paramètre "strict_rfc821_envelopes":http://www.postfix.org/postconf.5.html#strict_rfc821_envelopes permet de refuser la réception de mail si le serveur distant ne respecte pas strictement la "rfc821":http://www.faqs.org/rfcs/rfc821.html, celle qui décrit le protocole SMTP. |
162 | 7 | Fabien Dupont | |
163 | 22 | Fabien Dupont | _main.cf, restrictions de base :_ |
164 | 7 | Fabien Dupont | <pre> |
165 | 7 | Fabien Dupont | # Basics Restrictions |
166 | 7 | Fabien Dupont | smtpd_delay_reject = yes |
167 | 7 | Fabien Dupont | smtpd_helo_required = yes |
168 | 7 | Fabien Dupont | strict_rfc821_envelopes = yes |
169 | 7 | Fabien Dupont | </pre> |
170 | 7 | Fabien Dupont | |
171 | 7 | Fabien Dupont | Postfix applique ensuite des restrictions selon les paramètres du mail, dans l'ordre suivant : |
172 | 7 | Fabien Dupont | |
173 | 7 | Fabien Dupont | * restrictions sur le client, c'est à dire sur l'adresse IP du serveur émetteur, |
174 | 7 | Fabien Dupont | * restrictions sur le mot clé *HELO* lors du dialogue avec ce serveur, |
175 | 7 | Fabien Dupont | * restrictions sur le mot clé *MAIL from*, c'est à dire sur l'adresse mail de l'émetteur, |
176 | 7 | Fabien Dupont | * restrictions sur le mot clé *RCPT to*, c'est à dire sur l'adresse mail du destinataire, |
177 | 7 | Fabien Dupont | |
178 | 1 | Fabien Dupont | Une liste de restrictions, dans postfix, est définie avec la syntaxe suivante : |
179 | 1 | Fabien Dupont | |
180 | 8 | Fabien Dupont | smtpd_*nom*_restrictions = restriction 1, restriction 2, ..., restriction n |
181 | 7 | Fabien Dupont | |
182 | 8 | Fabien Dupont | Elles sont parcourues dans l'ordre, jusqu'à ce que l'une d'entre elle accepte ou rejette le mail. La dernière restriction est *permit*, ainsi le mail est accepté si rien n'a indiqué explicitement son rejet ou sa validation. |
183 | 7 | Fabien Dupont | |
184 | 7 | Fabien Dupont | h4. Restrictions sur le client |
185 | 1 | Fabien Dupont | |
186 | 7 | Fabien Dupont | Ici, notre serveur est public, il doit donc accepter les connexions entrantes depuis n'importe quelle adresse IP. |
187 | 7 | Fabien Dupont | |
188 | 22 | Fabien Dupont | _main.cf, restrictions sur le client :_ |
189 | 8 | Fabien Dupont | <pre> |
190 | 7 | Fabien Dupont | # Requirements for the connecting server |
191 | 7 | Fabien Dupont | smtpd_client_restrictions = |
192 | 7 | Fabien Dupont | permit |
193 | 7 | Fabien Dupont | </pre> |
194 | 7 | Fabien Dupont | |
195 | 1 | Fabien Dupont | h4. Restrictions sur HELO |
196 | 7 | Fabien Dupont | |
197 | 23 | Fabien Dupont | Comme on n'est pas des sauvages, on ne positionne aucunes restrictions si l'émetteur se situe sur notre réseau local (paramètre *mynetwork*, voir plus haut). Par contre, pour toutes les autres adresses IP source, on vérifie que le domaine indiqué après la commande *HELO* correspond à un "FQDN":http://en.wikipedia.org/wiki/FQDN et que celui-ci correspond à un nom d'hôte valide. |
198 | 7 | Fabien Dupont | |
199 | 22 | Fabien Dupont | _main.cf, restrictions sur le mot clé HELO :_ |
200 | 8 | Fabien Dupont | <pre> |
201 | 1 | Fabien Dupont | # Requirements for the HELO statement |
202 | 7 | Fabien Dupont | smtpd_helo_restrictions = |
203 | 1 | Fabien Dupont | permit_mynetworks, |
204 | 7 | Fabien Dupont | reject_non_fqdn_hostname, |
205 | 7 | Fabien Dupont | reject_invalid_hostname, |
206 | 7 | Fabien Dupont | permit |
207 | 7 | Fabien Dupont | </pre> |
208 | 7 | Fabien Dupont | |
209 | 9 | Fabien Dupont | h4. Restrictions sur l'adresse de l'émetteur |
210 | 9 | Fabien Dupont | |
211 | 9 | Fabien Dupont | De la même façon, il est préférable de refuser des mails ayant un domaine inexistant ou mal formé, sauf pour notre réseau local. |
212 | 9 | Fabien Dupont | |
213 | 22 | Fabien Dupont | _main.cf, restriction sur l'émetteur (sender) :_ |
214 | 8 | Fabien Dupont | <pre> |
215 | 1 | Fabien Dupont | # Requirements for the sender address |
216 | 7 | Fabien Dupont | smtpd_sender_restrictions = |
217 | 1 | Fabien Dupont | permit_mynetworks, |
218 | 7 | Fabien Dupont | reject_non_fqdn_sender, |
219 | 7 | Fabien Dupont | reject_unknown_sender_domain, |
220 | 7 | Fabien Dupont | permit |
221 | 8 | Fabien Dupont | </pre> |
222 | 9 | Fabien Dupont | |
223 | 9 | Fabien Dupont | h4. Restrictions sur l'adresse du destinataire |
224 | 9 | Fabien Dupont | |
225 | 23 | Fabien Dupont | On autorise notre LAN à envoyer des mails à destination de n'importe quelle adresse. Par contre, pour les autres, on refuse les mails à destination d'une adresse mal formée (*reject_non_fqdn_recipient* et *reject_unknown_recipient_domain*) ou bien inconnue du serveur (*reject_unauth_destination*). C'est à dire dont la partie domaine de l'adresse n'est pas listée dans les variables *mydestination* ou *relay_domains*. Le refuser si la boite n'existe pas sera le travail du LDA (Local Delivery Agent), c'est à dire le programme qui délivre le mail dans la boite maildir ou mbox du destinataire. |
226 | 7 | Fabien Dupont | |
227 | 8 | Fabien Dupont | <pre> |
228 | 7 | Fabien Dupont | # Requirement for the recipient address |
229 | 1 | Fabien Dupont | smtpd_recipient_restrictions = |
230 | 1 | Fabien Dupont | permit_mynetworks, |
231 | 1 | Fabien Dupont | reject_non_fqdn_recipient, |
232 | 1 | Fabien Dupont | reject_unknown_recipient_domain, |
233 | 1 | Fabien Dupont | reject_unauth_destination, |
234 | 1 | Fabien Dupont | permit |
235 | 10 | Fabien Dupont | </pre> |
236 | 10 | Fabien Dupont | |
237 | 10 | Fabien Dupont | h4. Content filters |
238 | 1 | Fabien Dupont | |
239 | 10 | Fabien Dupont | Les content filters sont des mini-serveurs SMTP analysant les mails entrants et les renvoyants ou pas sur un autre serveur SMTP. Postfix est donc le serveur source pour les content filters ainsi que le serveur de destination. Si un mail revient des content filters sans encombres, il est valide. |
240 | 10 | Fabien Dupont | |
241 | 23 | Fabien Dupont | Les content filters peuvent être chaînés. Le premier écoute sur un port (ex: 10025) puis le passe au second sur un autre port (ex: 10026) qui le retransmet au serveur postfix de départ sur un port défini (ex: 10027). En cas de problème sur le second content filter, il retourne une erreur 5xx au premier content filter qui retourne donc cette erreur au serveur postfix de départ. Les refus sont ainsi transmis en cascade et pris en compte par postfix au final. |
242 | 10 | Fabien Dupont | |
243 | 22 | Fabien Dupont | _main.cf, content filters :_ |
244 | 10 | Fabien Dupont | <pre> |
245 | 10 | Fabien Dupont | # Content filtering |
246 | 10 | Fabien Dupont | content_filter = scan:127.0.0.1:10025 |
247 | 10 | Fabien Dupont | receive_override_options = no_address_mappings |
248 | 10 | Fabien Dupont | </pre> |
249 | 10 | Fabien Dupont | |
250 | 10 | Fabien Dupont | Le port de destination des contents filters est écouté par un simple smtpd mais avec aucune restrictions ni autre content filters définis. Si ce n'était pas le cas, les mails entrant partirait en boucle dans le serveur de mail et serait refusés au final. Ce port est ouvert uniquement pour localhost (127.0.0.1) pour éviter qu'un serveur distant n'envoie un mail directement par ce biais. |
251 | 10 | Fabien Dupont | |
252 | 22 | Fabien Dupont | _master.cf, définition des services d'émission et de réception des content filters :_ |
253 | 1 | Fabien Dupont | <pre> |
254 | 16 | Fabien Dupont | # AV scan filter (used by content_filter) |
255 | 16 | Fabien Dupont | scan unix - - n - 16 smtp |
256 | 16 | Fabien Dupont | -o smtp_send_xforward_command=yes |
257 | 10 | Fabien Dupont | # For injecting mail back into postfix from the filter |
258 | 10 | Fabien Dupont | 127.0.0.1:10027 inet n - n - 16 smtpd |
259 | 10 | Fabien Dupont | -o content_filter= |
260 | 1 | Fabien Dupont | -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks |
261 | 10 | Fabien Dupont | -o smtpd_helo_restrictions= |
262 | 10 | Fabien Dupont | -o smtpd_client_restrictions= |
263 | 10 | Fabien Dupont | -o smtpd_sender_restrictions= |
264 | 1 | Fabien Dupont | -o smtpd_recipient_restrictions=permit_mynetworks,reject |
265 | 10 | Fabien Dupont | -o mynetworks_style=host |
266 | 10 | Fabien Dupont | -o smtpd_authorized_xforward_hosts=127.0.0.0/8 |
267 | 10 | Fabien Dupont | </pre> |
268 | 10 | Fabien Dupont | |
269 | 11 | Fabien Dupont | h3. ClamSMTPd |
270 | 10 | Fabien Dupont | |
271 | 23 | Fabien Dupont | L'interface entre postfix et "ClamAV":http://www.clamav.net/ peut être faite de différentes manières. La plus simple à mettre en place est d'utiliser le daemona "ClamSMTP":http://thewalter.net/stef/software/clamsmtp/. |
272 | 10 | Fabien Dupont | |
273 | 10 | Fabien Dupont | C'est un simple content filter pour lequel on définit le port d'entrée selon le paramètre *content_filter* de postfix et le port de sortie comme le port du prochain content filter mis en place ou bien celui de postfix si on ne désire pas en mettre en place d'autres. |
274 | 10 | Fabien Dupont | |
275 | 22 | Fabien Dupont | _Installation de ClamSMTP :_ |
276 | 10 | Fabien Dupont | <pre> |
277 | 10 | Fabien Dupont | # apt-get install clamsmtp clamav-daemon |
278 | 10 | Fabien Dupont | </pre> |
279 | 10 | Fabien Dupont | |
280 | 22 | Fabien Dupont | _/etc/clamsmtpd.conf, fichier de configuration du daemon :_ |
281 | 10 | Fabien Dupont | <pre> |
282 | 10 | Fabien Dupont | # Port et adresse IP sur lesquels le daemon écoute |
283 | 10 | Fabien Dupont | Listen: 127.0.0.1:10025 |
284 | 10 | Fabien Dupont | |
285 | 10 | Fabien Dupont | # Port et adresse IP sur lesquels le mail sera forwardé |
286 | 10 | Fabien Dupont | OutAddress: 127.0.0.1:10026 |
287 | 10 | Fabien Dupont | |
288 | 10 | Fabien Dupont | # Chemin vers la socket unix ouverte par le daemon ClamAV |
289 | 10 | Fabien Dupont | ClamAddress: /var/run/clamav/clamd.ctl |
290 | 10 | Fabien Dupont | |
291 | 10 | Fabien Dupont | # Header ajouté au mail pour indiquer qu'il a bien été scanné |
292 | 10 | Fabien Dupont | Header: X-AV-Checked: ClamAV using ClamSMTP |
293 | 10 | Fabien Dupont | |
294 | 10 | Fabien Dupont | # Répertoire temporaire |
295 | 10 | Fabien Dupont | TempDirectory: /var/spool/clamsmtp |
296 | 10 | Fabien Dupont | |
297 | 10 | Fabien Dupont | # Chemin vers le fichier PID |
298 | 10 | Fabien Dupont | PidFile: /var/run/clamsmtp/clamsmtpd.pid |
299 | 10 | Fabien Dupont | |
300 | 1 | Fabien Dupont | # Action effectuée en cas de détection de virus : |
301 | 10 | Fabien Dupont | # * bounce : retour à l'envoyeur (pas génial car l'adresse émettrice est souvent spoofée) |
302 | 10 | Fabien Dupont | # * drop : le mail est supprimé silencieusement |
303 | 10 | Fabien Dupont | # * pass : le mail est accepté mais le header X-Virus-Infected est ajouté |
304 | 1 | Fabien Dupont | Action: drop |
305 | 10 | Fabien Dupont | |
306 | 10 | Fabien Dupont | # Si 'on', les mails infectés sont stockés dans le répertoire temporaire |
307 | 10 | Fabien Dupont | Quarantine: on |
308 | 10 | Fabien Dupont | |
309 | 10 | Fabien Dupont | # Nom d'utilisateur sous lequel le programme tourne (ne pas utiliser root !) |
310 | 1 | Fabien Dupont | User: clamsmtp |
311 | 11 | Fabien Dupont | </pre> |
312 | 11 | Fabien Dupont | |
313 | 11 | Fabien Dupont | h3. SpamPD |
314 | 11 | Fabien Dupont | |
315 | 24 | Fabien Dupont | "SpamPD":http://www.worlddesign.com/Content/rd/mta/spampd/spampd.html est un proxy mail (un content filter) codé en perl et utilisant SpamAssassin pour tagger les mails en tant que spam ou ham (non spam). |
316 | 11 | Fabien Dupont | |
317 | 22 | Fabien Dupont | _ Installation de SpamPD :_ |
318 | 11 | Fabien Dupont | <pre> |
319 | 11 | Fabien Dupont | # apt-get install spampd spamassassin |
320 | 11 | Fabien Dupont | </pre> |
321 | 11 | Fabien Dupont | |
322 | 22 | Fabien Dupont | _/etc/default/spampd, configuration du daemon :_ |
323 | 11 | Fabien Dupont | <pre> |
324 | 11 | Fabien Dupont | # Démarrage du daemon au boot |
325 | 11 | Fabien Dupont | STARTSPAMPD=1 |
326 | 11 | Fabien Dupont | |
327 | 11 | Fabien Dupont | # Chemin vers le fichier PID |
328 | 11 | Fabien Dupont | PIDFILE=/var/run/spampd.pid |
329 | 11 | Fabien Dupont | |
330 | 11 | Fabien Dupont | |
331 | 11 | Fabien Dupont | # Port et adresse IP sur lesquels le daemon écoute |
332 | 11 | Fabien Dupont | LISTENHOST=127.0.0.1 |
333 | 11 | Fabien Dupont | LISTENPORT=10026 |
334 | 11 | Fabien Dupont | |
335 | 11 | Fabien Dupont | # Port et adresse IP sur lesquels le mail sera forwardé |
336 | 11 | Fabien Dupont | DESTHOST=127.0.0.1 |
337 | 11 | Fabien Dupont | DESTPORT=10027 |
338 | 11 | Fabien Dupont | |
339 | 11 | Fabien Dupont | # Nombre de processus enfants (trop = beaucoup de ressources utilisées, pas assez = traitement des mails lent en cas de gros trafic) |
340 | 11 | Fabien Dupont | CHILDREN=3 |
341 | 11 | Fabien Dupont | |
342 | 11 | Fabien Dupont | # Nom d'utilisateur et groupe sous lesquels le daemon tourne (pas root !) |
343 | 11 | Fabien Dupont | USERID=spampd |
344 | 11 | Fabien Dupont | GRPID=spampd |
345 | 11 | Fabien Dupont | |
346 | 11 | Fabien Dupont | # Ajoute les headers de SpamAssassin indiquant que le mail a été scanné même s'il n'a pas été identifié comme spam. |
347 | 1 | Fabien Dupont | TAGALL=1 |
348 | 11 | Fabien Dupont | |
349 | 11 | Fabien Dupont | # Option non utilisée depuis SpamAssassin >= 3.x |
350 | 11 | Fabien Dupont | AUTOWHITELIST=0 |
351 | 1 | Fabien Dupont | |
352 | 11 | Fabien Dupont | # Désactivation de tous les tests sur l'adresse IP source (ici ce sera toujours 127.0.0.1) |
353 | 11 | Fabien Dupont | LOCALONLY=1 |
354 | 11 | Fabien Dupont | |
355 | 11 | Fabien Dupont | # Utilisation de syslog via une socket unix (=0) ou une socket IP (=1) |
356 | 1 | Fabien Dupont | LOGINET=0 |
357 | 1 | Fabien Dupont | |
358 | 1 | Fabien Dupont | # Options additionnelles à passer à SpamAssassin |
359 | 1 | Fabien Dupont | ADDOPTS="" |
360 | 12 | Fabien Dupont | </pre> |
361 | 1 | Fabien Dupont | |
362 | 12 | Fabien Dupont | h3. Postgrey |
363 | 12 | Fabien Dupont | |
364 | 24 | Fabien Dupont | "Postgrey":http://postgrey.schweikert.ch/ est un policy server (voir plus haut) qui est appelé par postfix si besoin et via un port TCP. Ici le port 10023 a été choisi de façon arbitraire. |
365 | 12 | Fabien Dupont | |
366 | 22 | Fabien Dupont | _Installation de postgrey :_ |
367 | 12 | Fabien Dupont | <pre> |
368 | 12 | Fabien Dupont | # apt-get install postgrey |
369 | 12 | Fabien Dupont | </pre> |
370 | 12 | Fabien Dupont | |
371 | 22 | Fabien Dupont | _/etc/default/postgrey, configuration du service :_ |
372 | 12 | Fabien Dupont | <pre> |
373 | 1 | Fabien Dupont | # --inet : Port utilisé pour dialoguer avec postfix |
374 | 12 | Fabien Dupont | # --delay : Durée en secondes pendant laquelle les mails sont refusés |
375 | 12 | Fabien Dupont | # --max-age : Période en jour après laquelle le compteur d'émission est remis à zéro si pas de nouvelle réémission d'un mail |
376 | 12 | Fabien Dupont | POSTGREY_OPTS="--inet=10023 --delay=300 --max-age=35" |
377 | 12 | Fabien Dupont | |
378 | 12 | Fabien Dupont | # Message renvoyé en plus de l'erreur 4xx au serveur émettant le mail |
379 | 12 | Fabien Dupont | POSTGREY_TEXT="Good news, everyone ! I taught the mail server to detect spambots." |
380 | 12 | Fabien Dupont | </pre> |
381 | 12 | Fabien Dupont | |
382 | 22 | Fabien Dupont | _main.cf, ajout du policy service postgrey aux restrictions sur le destinataire :_ |
383 | 12 | Fabien Dupont | <pre> |
384 | 1 | Fabien Dupont | # Requirement for the recipient address |
385 | 1 | Fabien Dupont | smtpd_recipient_restrictions = |
386 | 13 | Fabien Dupont | *snip* |
387 | 1 | Fabien Dupont | check_policy_service inet:127.0.0.1:10023, |
388 | 1 | Fabien Dupont | permit |
389 | 1 | Fabien Dupont | </pre> |
390 | 13 | Fabien Dupont | |
391 | 13 | Fabien Dupont | h3. RBL |
392 | 13 | Fabien Dupont | |
393 | 24 | Fabien Dupont | Les RBL sont directement gérées par postfix en ajoutant une restriction *reject_rbl_client* pour le client (le serveur émetteur du mail). Il existe bon nombre de RBL (ou DNSBL), "wikipedia":http://en.wikipedia.org/wiki/Comparison_of_DNS_blacklists en liste un bon nombre mais en voici quatre plutôt « réputées » : |
394 | 13 | Fabien Dupont | |
395 | 22 | Fabien Dupont | _main.cf, configuration des RBL :_ |
396 | 13 | Fabien Dupont | <pre> |
397 | 13 | Fabien Dupont | smtpd_client_restrictions = |
398 | 13 | Fabien Dupont | permit_mynetworks, |
399 | 13 | Fabien Dupont | reject_rbl_client bl.spamcop.net, |
400 | 13 | Fabien Dupont | reject_rbl_client dnsbl.njabl.org, |
401 | 13 | Fabien Dupont | reject_rbl_client cbl.abuseat.org, |
402 | 13 | Fabien Dupont | reject_rbl_client sbl-xbl.spamhaus.org, |
403 | 1 | Fabien Dupont | permit |
404 | 13 | Fabien Dupont | </pre> |
405 | 13 | Fabien Dupont | |
406 | 13 | Fabien Dupont | h3. Policyd-SPF |
407 | 13 | Fabien Dupont | |
408 | 13 | Fabien Dupont | h4. Configuration du serveur de mail |
409 | 13 | Fabien Dupont | |
410 | 24 | Fabien Dupont | La vérification SPF peut se faire via deux daemon « policy », un en "perl":https://launchpad.net/postfix-policyd-spf-perl/ et un en "python":https://launchpad.net/pypolicyd-spf/. Leur installation et leur configuration dans postfix se fait exactement de la même manière. Seul le nom du paquet change (postfix-policyd-spf-perl ou postfix-policyd-spf-python). |
411 | 13 | Fabien Dupont | |
412 | 22 | Fabien Dupont | _Installation de policy-spf :_ |
413 | 13 | Fabien Dupont | <pre> |
414 | 13 | Fabien Dupont | # apt-get install postfix-policyd-spf-python |
415 | 13 | Fabien Dupont | </pre> |
416 | 13 | Fabien Dupont | |
417 | 22 | Fabien Dupont | _main.cf, ajout du policy service postgrey aux restrictions sur le destinataire :_ |
418 | 13 | Fabien Dupont | <pre> |
419 | 15 | Fabien Dupont | # SPF |
420 | 15 | Fabien Dupont | policyd-spf_time_limit = 3600 |
421 | 15 | Fabien Dupont | |
422 | 13 | Fabien Dupont | smtpd_recipient_restrictions = |
423 | 13 | Fabien Dupont | *snip* |
424 | 13 | Fabien Dupont | check_policy_service unix:private/policyd-spf, |
425 | 13 | Fabien Dupont | permit |
426 | 15 | Fabien Dupont | </pre> |
427 | 13 | Fabien Dupont | |
428 | 22 | Fabien Dupont | _master.cf, définition de la socket permettant de dialoguer avec postfix-spf :_ |
429 | 15 | Fabien Dupont | <pre> |
430 | 15 | Fabien Dupont | policyd-spf unix - n n - 0 spawn |
431 | 15 | Fabien Dupont | user=nobody argv=/usr/bin/python /usr/bin/policyd-spf |
432 | 15 | Fabien Dupont | /etc/postfix-policyd-spf-python/policyd-spf.conf |
433 | 13 | Fabien Dupont | </pre> |
434 | 13 | Fabien Dupont | |
435 | 13 | Fabien Dupont | h4. Configuration du nom de domaine |
436 | 13 | Fabien Dupont | |
437 | 13 | Fabien Dupont | La configuration du nom de domaine est facultative mais recommandée car elle permet aux serveurs distants de vérifier que les mails ayant notre nom de domaine dans l'adresse source proviennent bien de notre serveur. Cela permet de ne pas se faire « spoofer » nos adresses. |
438 | 13 | Fabien Dupont | |
439 | 13 | Fabien Dupont | <pre> |
440 | 13 | Fabien Dupont | vspf=1 [qualifier]mechanism1 [qualifier]mechanism2 .. [qualifier]mechanisN |
441 | 13 | Fabien Dupont | </pre> |
442 | 13 | Fabien Dupont | |
443 | 24 | Fabien Dupont | Les *mechanisms* sont des paramètres appliqués ou non selon les valeurs associées. En voici la liste (non-exhaustive ) : |
444 | 13 | Fabien Dupont | |
445 | 13 | Fabien Dupont | * all, s'applique tout le temps. |
446 | 13 | Fabien Dupont | * a, s'applique si le domaine de l'émetteur peut être résolu (A ou AAAA) en l'adresse IP de l'émetteur. |
447 | 13 | Fabien Dupont | * mx, s'applique si l'adresse IP de l'émetteur correspond au(x) MX du domaine. |
448 | 13 | Fabien Dupont | * ip:11.22.33.44, s'applique si l'adresse IP de l'émetteur est 11.22.33.44 |
449 | 13 | Fabien Dupont | * ip6:1111:2222:3333::, idem pour IPv6. |
450 | 13 | Fabien Dupont | * ptr:server.domain.tld, s'applique si le reverse de l'IP de l'émetteur est server.domain.tld. |
451 | 13 | Fabien Dupont | * include:domain.tld, s'applique si les mechanism définis dans le champs SPF de doman.tld s'appliquent aussi. |
452 | 13 | Fabien Dupont | |
453 | 24 | Fabien Dupont | Les *qualifiers* permette de définir l'action à effectuer lors qu'un *mechanism* est appliqué : |
454 | 13 | Fabien Dupont | |
455 | 24 | Fabien Dupont | * +, le mail est accepté si le *mechanism* est vérifié. C'est la valeur par défaut. |
456 | 24 | Fabien Dupont | * ?, le *mechanism* associé est ignoré. |
457 | 13 | Fabien Dupont | * ~, le mail n'est pas refusé mais il devrait être noté comme refusé par le serveur utilisant SPF. |
458 | 24 | Fabien Dupont | * -, le mail est refusé si le *mechanism* n'est pas vérifié. |
459 | 1 | Fabien Dupont | |
460 | 13 | Fabien Dupont | Ainsi, le champs SPF du domaine kafe-in.net : |
461 | 13 | Fabien Dupont | |
462 | 13 | Fabien Dupont | <pre> |
463 | 13 | Fabien Dupont | IN SPF v=spf1 mx ptr:muscat.kafe-in.net ip6:2a01:6600:8081:8e00::fab ip4:91.224.149.142 -all |
464 | 13 | Fabien Dupont | </pre> |
465 | 13 | Fabien Dupont | |
466 | 13 | Fabien Dupont | A pour signification : |
467 | 1 | Fabien Dupont | |
468 | 13 | Fabien Dupont | * Si un mail a pour adresse *@kafe-in.net : |
469 | 13 | Fabien Dupont | ** S'il provient d'un des MX de la zone kafe-in.net, alors il peut être accepté, |
470 | 13 | Fabien Dupont | ** Si le reverse du serveur émetteur est muscat.kafe-in.net, alors il peut être accepté, |
471 | 13 | Fabien Dupont | ** Si l'adresse IPv6 du serveur émetteur est 2a01:6600:8081:8e00::fab, alors il peut être accepté, |
472 | 13 | Fabien Dupont | ** Si l'adresse IPv4 du serveur émetteur est 91.224.149.142, alors il peut être accepté, |
473 | 13 | Fabien Dupont | ** Si aucune des conditions précédentes n'a été vérifiées, alors le mail doit être refusé. |
474 | 1 | Fabien Dupont | |
475 | 14 | Fabien Dupont | Le champs SPF est défini dans la "RFC448":http://tools.ietf.org/html/rfc4408 mais certains serveurs n'appliquent pas cette RFC et ne lisent que les champs TXT du domaine. Il est donc préférable de définir à la fois un champs SPF et un champs TXT. |
476 | 14 | Fabien Dupont | |
477 | 14 | Fabien Dupont | h3. OpenDKIM |
478 | 1 | Fabien Dupont | |
479 | 24 | Fabien Dupont | "OpenDKIM":http://www.opendkim.org/ est un "milter":http://www.milter.org/ appelé par postfix sur un port TCP. Ici le port 10028 a été choisi arbitrairement. |
480 | 15 | Fabien Dupont | |
481 | 22 | Fabien Dupont | _Installation de opendkim :_ |
482 | 15 | Fabien Dupont | <pre> |
483 | 15 | Fabien Dupont | # apt-get install opendkim |
484 | 15 | Fabien Dupont | </pre> |
485 | 15 | Fabien Dupont | |
486 | 22 | Fabien Dupont | _main.cf, ajout du milter opendkim :_ |
487 | 15 | Fabien Dupont | <pre> |
488 | 15 | Fabien Dupont | # DKIM |
489 | 15 | Fabien Dupont | milter_default_action = accept |
490 | 15 | Fabien Dupont | milter_protocol = 6 |
491 | 15 | Fabien Dupont | smtpd_milters = inet:127.0.0.1:10028 |
492 | 15 | Fabien Dupont | non_smtpd_milters = inet:127.0.0.1:10028 |
493 | 15 | Fabien Dupont | </pre> |
494 | 15 | Fabien Dupont | |
495 | 22 | Fabien Dupont | _/etc/opendkim.conf, configuration du milter :_ |
496 | 15 | Fabien Dupont | <pre> |
497 | 15 | Fabien Dupont | # Auto-redémarrage du daemon en cas de plantage |
498 | 15 | Fabien Dupont | AutoRestart Yes |
499 | 15 | Fabien Dupont | Background Yes |
500 | 1 | Fabien Dupont | |
501 | 15 | Fabien Dupont | # Domaines pour lesquels les mails doivent être signés |
502 | 15 | Fabien Dupont | Domain localhost.localdomain,localhost,kafe-in.net |
503 | 15 | Fabien Dupont | |
504 | 1 | Fabien Dupont | # Adresses IP des machines internes ne nécessitant pas de vérification |
505 | 15 | Fabien Dupont | InternalHosts 127.0.0.0/8,[::1]/128,192.168.2.125/32,[2001:910:109c::]/48 |
506 | 15 | Fabien Dupont | |
507 | 15 | Fabien Dupont | # Chemin vers la clé privée |
508 | 15 | Fabien Dupont | KeyFile /var/lib/dkim/default.private |
509 | 15 | Fabien Dupont | |
510 | 15 | Fabien Dupont | # Adresse mail à laquelle un rapport sera envoyé en cas de détection de mail mal signé |
511 | 15 | Fabien Dupont | ReportAddress "DKIM Error Postmaster" <postmaster@kafe-in.net> |
512 | 15 | Fabien Dupont | |
513 | 1 | Fabien Dupont | # Nom du sélecteur utilisé dans le cas où il y a plusieurs clés pour un même domaine |
514 | 15 | Fabien Dupont | Selector default |
515 | 15 | Fabien Dupont | |
516 | 15 | Fabien Dupont | # Définition de la socket sur laquelle le daemon écoute. Peut être : |
517 | 15 | Fabien Dupont | # - inet:port@host |
518 | 15 | Fabien Dupont | # - inet6:port@host |
519 | 1 | Fabien Dupont | # - unix:/chemin/vers/la/socket |
520 | 15 | Fabien Dupont | Socket inet:10028@localhost |
521 | 15 | Fabien Dupont | |
522 | 15 | Fabien Dupont | # Configuration de l'utilisation de syslog |
523 | 15 | Fabien Dupont | Syslog Yes |
524 | 15 | Fabien Dupont | SyslogFacility mail |
525 | 15 | Fabien Dupont | </pre> |
526 | 15 | Fabien Dupont | |
527 | 15 | Fabien Dupont | Une fois OpenDKIM installé, il faut générer la paire de clés privée/publique permettant de signer le mail. La clé privée est stockée dans le fichier /var/lib/dkim/default.private et la clé publique dans un champ TXT du domaine. OpenDKIM fourni divers outils dont opendkim-genkey qui permet de générer cette paire de clé. |
528 | 15 | Fabien Dupont | |
529 | 22 | Fabien Dupont | _Installation des outils d'opendkim :_ |
530 | 15 | Fabien Dupont | <pre> |
531 | 15 | Fabien Dupont | # apt-get install opendkim-tools |
532 | 15 | Fabien Dupont | </pre> |
533 | 15 | Fabien Dupont | |
534 | 22 | Fabien Dupont | _ Génération de la paire de clé :_ |
535 | 15 | Fabien Dupont | <pre> |
536 | 15 | Fabien Dupont | # opendkim-genkey -d kafe-in.net -s default |
537 | 15 | Fabien Dupont | # mkdir -p /var/lib/dkim |
538 | 15 | Fabien Dupont | # mv default.private /var/lib/dkim |
539 | 15 | Fabien Dupont | # chmod 640 /var/lib/dkim/default.private |
540 | 15 | Fabien Dupont | </pre> |
541 | 15 | Fabien Dupont | |
542 | 15 | Fabien Dupont | Le champs TXT est généré par opendkim-genkey dans le fichier default.txt. Il suffit d'ajouter son contenu à la zone kafe-in.net. |
543 | 1 | Fabien Dupont | |
544 | 22 | Fabien Dupont | _ Champs TXT pour DKIM du domaine kafe-in.net :_ |
545 | 15 | Fabien Dupont | <pre> |
546 | 15 | Fabien Dupont | default._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/B6ZgFIeKutA6W6jgaH4LCpDtHY5SNUmmFnt+Um68pYO6YZSNUF+mbxtN2+P4fI+CoFgoFEViI+HcRWMPd7IWMgoTTSwF4hOqzw8kscP/R+h2ZV/ogPQBbH8tWc6NyvIA6RnRwET5OUOEt4zOb7WwO26jmn+L1rIXgQb5I6ZqTwIDAQAB" ; ----- DKIM key default for kafe-in.net |
547 | 1 | Fabien Dupont | </pre> |
548 | 15 | Fabien Dupont | |
549 | 24 | Fabien Dupont | Une fois tout installé, configuré et généré, il faut démarrer le daemon opendkim pour prise en compte. |
550 | 15 | Fabien Dupont | |
551 | 22 | Fabien Dupont | _Redémarrage du daemon opendkim :_ |
552 | 15 | Fabien Dupont | <pre> |
553 | 1 | Fabien Dupont | # /etc/init.d/opendkim start |
554 | 16 | Fabien Dupont | </pre> |
555 | 16 | Fabien Dupont | |
556 | 16 | Fabien Dupont | h2. Vérifications |
557 | 16 | Fabien Dupont | |
558 | 16 | Fabien Dupont | h3. Postfix et open relay |
559 | 16 | Fabien Dupont | |
560 | 16 | Fabien Dupont | Maintenant que tout est configuré au niveau du serveur de mail, on peut vérifier qu'il n'est pas en mode « open relay ». C'est à dire qu'il n'autorise pas l'émission de mails depuis d'autres domaines que celui qu'il gère. Si 'était le cas, il serait très vite utilisé par les vilains spammeurs pour polluer nos boites mail. |
561 | 16 | Fabien Dupont | |
562 | 16 | Fabien Dupont | Il existe "bon nombre de tests en ligne":http://seeks.kafe-in.net/search?q=open%20relay%20check&expansion=1&action=expand. Celui de "DNS Goodies":http://dnsgoodies.com/ fonctionne plutôt bien. |
563 | 16 | Fabien Dupont | |
564 | 16 | Fabien Dupont | <pre> |
565 | 1 | Fabien Dupont | Good News! |
566 | 16 | Fabien Dupont | All tests for an open relay on your mail server failed. |
567 | 16 | Fabien Dupont | Your mail server does not allow open relay. |
568 | 16 | Fabien Dupont | </pre> |
569 | 1 | Fabien Dupont | |
570 | 16 | Fabien Dupont | h3. Détection de virus |
571 | 16 | Fabien Dupont | |
572 | 24 | Fabien Dupont | "EICAR":http://en.wikipedia.org/wiki/EICAR_test_file est une chaîne de caractères utilisée pour valider la détection de virus. Ce n'est pas un virus méchant, c'est juste un faux virus de test reconnus par tous les anti-virus. |
573 | 16 | Fabien Dupont | |
574 | 24 | Fabien Dupont | Pour tester notre serveur de mail, il suffit donc d'envoyer cette chaîne de caractère par mail à une de nos boites : |
575 | 16 | Fabien Dupont | |
576 | 22 | Fabien Dupont | _Envoi du virus de test :_ |
577 | 16 | Fabien Dupont | <pre> |
578 | 16 | Fabien Dupont | $ echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' | mail -s "Test d'antivirus" test@kafe-in.net |
579 | 16 | Fabien Dupont | </pre> |
580 | 16 | Fabien Dupont | |
581 | 22 | Fabien Dupont | _Vérification de sa détection dans les logs :_ |
582 | 16 | Fabien Dupont | <pre> |
583 | 16 | Fabien Dupont | # tail -fn 100 /var/log/mail.log |
584 | 16 | Fabien Dupont | *snip* |
585 | 16 | Fabien Dupont | Aug 17 09:00:36 ve-mail postfix/smtpd[1957]: 898B62022F: client=localhost[127.0.0.1], orig_queue_id=E9D552012C, orig_client=unknown[2001:910:109c:1::cab] |
586 | 16 | Fabien Dupont | Aug 17 09:00:36 ve-mail clamsmtpd: 10002E: quarantined virus file as: /var/spool/clamsmtp/virus.z3YbhR |
587 | 16 | Fabien Dupont | Aug 17 09:00:36 ve-mail postfix/smtp[1954]: E9D552012C: to=<test@kafe-in.net>, relay=127.0.0.1[127.0.0.1]:10025, delay=3.7, delays=1.2/0/2.4/0.14, dsn=2.0.0, status=sent (250 Virus Detected; Discarded Email) |
588 | 16 | Fabien Dupont | Aug 17 09:00:36 ve-mail postfix/qmgr[479]: E9D552012C: removed |
589 | 24 | Fabien Dupont | Aug 17 09:00:36 ve-mail clamsmtpd: 10002E: from=test@kafe-in.net, to=test@kafe-in.net, status=VIRUS:EICAR-Test-Signature |
590 | 16 | Fabien Dupont | Aug 17 09:00:36 ve-mail postfix/smtpd[1957]: disconnect from localhost[127.0.0.1] |
591 | 16 | Fabien Dupont | *snip* |
592 | 1 | Fabien Dupont | </pre> |
593 | 16 | Fabien Dupont | |
594 | 16 | Fabien Dupont | h3. Détection de spams |
595 | 16 | Fabien Dupont | |
596 | 24 | Fabien Dupont | De la même façon que EICAR, "GTUBE":http://spamassassin.apache.org/gtube/ (Generic Test for Unsolicited Bulk Email) est une chaîne de caractère détectée par SpamAssassin comme étant un spam. |
597 | 16 | Fabien Dupont | |
598 | 16 | Fabien Dupont | La vérification se déroule à peu prêt de la même manière : envoi de la chaîne de caractère, puis vérification des headers dans le mail reçu. Attention, pas mal de clients mails vont déplacer ce mail dans une boite dédiées aux spams. |
599 | 16 | Fabien Dupont | |
600 | 22 | Fabien Dupont | _Envoi du faux spam de test :_ |
601 | 16 | Fabien Dupont | <pre> |
602 | 16 | Fabien Dupont | $ echo 'XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X' | mail -s "Test d'antispam" test@kafe-in.net |
603 | 16 | Fabien Dupont | </pre> |
604 | 16 | Fabien Dupont | |
605 | 22 | Fabien Dupont | _Headers ajoutés au mail reçu :_ |
606 | 16 | Fabien Dupont | <pre> |
607 | 16 | Fabien Dupont | X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on ve-mail.kafe-in.net |
608 | 16 | Fabien Dupont | X-Spam-Flag: YES |
609 | 16 | Fabien Dupont | X-Spam-Level: ************************************************** |
610 | 16 | Fabien Dupont | X-Spam-Status: Yes, score=1003.0 required=5.0 tests=GTUBE,MISSING_MID, |
611 | 16 | Fabien Dupont | RDNS_NONE,TVD_SPACE_RATIO autolearn=no version=3.3.2 |
612 | 1 | Fabien Dupont | </pre> |
613 | 16 | Fabien Dupont | |
614 | 16 | Fabien Dupont | h3. Validation du greylisting |
615 | 16 | Fabien Dupont | |
616 | 24 | Fabien Dupont | Pour valider le greylisting, il suffit de s'envoyer une mail depuis une boite mail externe et de vérifier les logs du serveur de mail. Lors de la première réception du mail, celui-ci doit être refusé temporairement avec un code d'erreur 4xx (ici, 450). |
617 | 16 | Fabien Dupont | |
618 | 22 | Fabien Dupont | _Greylisting dans les logs du serveur de mail :_ |
619 | 16 | Fabien Dupont | <pre> |
620 | 1 | Fabien Dupont | # tail -fn 100 /var/log/mail.log |
621 | 16 | Fabien Dupont | *snip* |
622 | 16 | Fabien Dupont | Aug 17 00:53:34 ve-mail postfix/smtpd[22763]: NOQUEUE: reject: RCPT from muscat.kafe-in.net[2a01:6600:8081:8e00::fab]: 450 4.2.0 <test@kafe-in.net>: Recipient address rejected: Good news, everyone ! I taught the mail server to detect spambots.; from=<whatever@domain.tld> to=<test@kafe-in.net> proto=ESMTP helo=<muscat.kafe-in.net> |
623 | 16 | Fabien Dupont | *snip* |
624 | 16 | Fabien Dupont | </pre> |
625 | 16 | Fabien Dupont | |
626 | 16 | Fabien Dupont | h3. Validation des RBL |
627 | 16 | Fabien Dupont | |
628 | 1 | Fabien Dupont | Ce n'est pas facile de vérifier les RBL dans postfix. Il faudrait s'auto-blacklister une adresse IP et ce n'est quand même pas conseillé. Ceci-dit, une fois qu'un serveur de mail est rendu visible d'Internet, il est très vite assailli de mails. Il ne devrait pas trop se passer de temps avant que des mails bloqués par les RBL arrivent. On peut vérifier ça dans les logs du serveur de mail. |
629 | 16 | Fabien Dupont | |
630 | 22 | Fabien Dupont | _RBL dans les logs du serveur de mail :_ |
631 | 16 | Fabien Dupont | <pre> |
632 | 16 | Fabien Dupont | # tail -fn 100 /var/log/mail.log |
633 | 16 | Fabien Dupont | *snip* |
634 | 16 | Fabien Dupont | Aug 17 01:02:35 ve-mail postfix/smtpd[23453]: NOQUEUE: reject: RCPT from unknown[176.44.93.9]: 554 5.7.1 Service unavailable; Client host [176.44.93.9] blocked using cbl.abuseat.org; Blocked - see http://cbl.abuseat.org/lookup.cgi?ip=176.44.93.9; from=<826AD18@julianenpark.de> to=<test@kafe-in.net> proto=SMTP helo=<[176.44.93.9]> |
635 | 16 | Fabien Dupont | *snip* |
636 | 1 | Fabien Dupont | </pre> |
637 | 17 | Fabien Dupont | |
638 | 17 | Fabien Dupont | h3. Validation de SPF |
639 | 17 | Fabien Dupont | |
640 | 17 | Fabien Dupont | h4. Validation de la policy |
641 | 17 | Fabien Dupont | |
642 | 17 | Fabien Dupont | Pour vérifier la policy, il suffit de s'envoyer un mail depuis une adresse mail dont le domaine dispose du champs SPF (ex: gmail.com). |
643 | 17 | Fabien Dupont | |
644 | 22 | Fabien Dupont | _Interrogation du champs SPF du domaine gmail.com :_ |
645 | 17 | Fabien Dupont | <pre> |
646 | 17 | Fabien Dupont | $ dig -t txt gmail.com +short |
647 | 17 | Fabien Dupont | "v=spf1 redirect=_spf.google.com" |
648 | 17 | Fabien Dupont | $ dig -t txt _spf.google.com +short |
649 | 17 | Fabien Dupont | "v=spf1 ip4:216.239.32.0/19 ip4:64.233.160.0/19 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:209.85.128.0/17 ip4:66.102.0.0/20 ip4:74.125.0.0/16 ip4:64.18.0.0/20 ip4:207.126.144.0/20 ip4:173.194.0.0/16 ?all" |
650 | 17 | Fabien Dupont | </pre> |
651 | 17 | Fabien Dupont | |
652 | 22 | Fabien Dupont | _Logs de réception d'un mail depuis gmail.com :_ |
653 | 17 | Fabien Dupont | <pre> |
654 | 17 | Fabien Dupont | # tail -fn 100 /var/log/mail.log |
655 | 17 | Fabien Dupont | *snip* |
656 | 1 | Fabien Dupont | Aug 17 09:47:27 ve-mail policyd-spf[2765]: None; identity=helo; client-ip=209.85.214.171; helo=mail-ob0-f171.google.com; envelope-from=whatever@gmail.com; receiver=test@kafe-in.net |
657 | 17 | Fabien Dupont | Aug 17 09:47:27 ve-mail policyd-spf[2765]: Pass; identity=mailfrom; client-ip=209.85.214.171; helo=mail-ob0-f171.google.com; envelope-from=whatever@gmail.com; receiver=test@kafe-in.net |
658 | 17 | Fabien Dupont | *snip* |
659 | 17 | Fabien Dupont | </pre> |
660 | 1 | Fabien Dupont | |
661 | 22 | Fabien Dupont | _Headers du mail reçu :_ |
662 | 17 | Fabien Dupont | <pre> |
663 | 17 | Fabien Dupont | *snip* |
664 | 17 | Fabien Dupont | Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=209.85.214.171; helo=mail-ob0-f171.google.com; envelope-from=whatever@gmail.com; receiver=test@kafe-in.net |
665 | 17 | Fabien Dupont | *snip* |
666 | 17 | Fabien Dupont | </pre> |
667 | 17 | Fabien Dupont | |
668 | 17 | Fabien Dupont | Par contre, on peut tester le refus d'un mail grâce à SPF en s'envoyant un mail, depuis une adresse IP externe, avec pour source une adresse @gmail.com. SPF va vérifier que l'adresse IP ne correspond pas à celles définies dans le champs SPF de la zone gmail.com et va refuser le mail. |
669 | 17 | Fabien Dupont | |
670 | 22 | Fabien Dupont | _Envoyant d'un « faux » mail gmail.com :_ |
671 | 17 | Fabien Dupont | <pre> |
672 | 17 | Fabien Dupont | $ telnet 80.67.176.156 25 |
673 | 17 | Fabien Dupont | Connected to 80.67.176.156 |
674 | 1 | Fabien Dupont | Escape character is '^]'. |
675 | 17 | Fabien Dupont | 220 ve-mail.kafe-in.net ESMTP kafe-in.net (I'm Scruffy... the Janitor.) |
676 | 17 | Fabien Dupont | HELO gmail.com |
677 | 17 | Fabien Dupont | 250 ve-mail.kafe-in.net |
678 | 17 | Fabien Dupont | MAIL from: <test@gmail.com> |
679 | 17 | Fabien Dupont | 250 2.1.0 Ok |
680 | 17 | Fabien Dupont | RCPT to: <test@kafe-in.net> |
681 | 17 | Fabien Dupont | 550 5.7.1 <test@kafe-in.net>: Recipient address rejected: Message rejected due to: access neither permitted nor denied. Please see http://www.openspf.net/Why?s=helo;id=gmail.com;ip=103.6.65.2;r=test@kafe-in.net |
682 | 17 | Fabien Dupont | QUIT |
683 | 17 | Fabien Dupont | 221 2.0.0 Bye |
684 | 17 | Fabien Dupont | Connection closed by foreign host. |
685 | 17 | Fabien Dupont | </pre> |
686 | 17 | Fabien Dupont | |
687 | 22 | Fabien Dupont | _Logs du refus sur le serveur de mail :_ |
688 | 17 | Fabien Dupont | <pre> |
689 | 17 | Fabien Dupont | # tail -fn 100 /var/log/mail.log |
690 | 17 | Fabien Dupont | *snip* |
691 | 17 | Fabien Dupont | Aug 17 09:56:26 ve-mail policyd-spf[6051]: Neutral; identity=helo; client-ip=103.6.65.2; helo=gmail.com; envelope-from=test@gmail.com; receiver=test@kafe-in.net |
692 | 17 | Fabien Dupont | Aug 17 09:56:26 ve-mail postfix/smtpd[6035]: NOQUEUE: reject: RCPT from unknown[103.6.65.2]: 550 5.7.1 <test@kafe-in.net>: Recipient address rejected: Message rejected due to: access neither permitted nor denied. Please see http://www.openspf.net/Why?s=helo;id=gmail.com;ip=103.6.65.2;r=test@kafe-in.net; from=<test@gmail.com> to=<test@kafe-in.net> proto=SMTP helo=<gmail.com> |
693 | 17 | Fabien Dupont | *snip* |
694 | 1 | Fabien Dupont | </pre> |
695 | 17 | Fabien Dupont | |
696 | 20 | Fabien Dupont | h4. Validation du champs SPF pour le nom de domaine |
697 | 17 | Fabien Dupont | |
698 | 24 | Fabien Dupont | Le champs SPF peut être validé grâce à l'outil "spfquery":http://search.cpan.org/~jmehnle/Mail-SPF-Query-1.999.1/bin/spfquery. Cet outil permet d'interroger le champs SPF d'un nom de domaine et de valider ou pas ce champs en fonction de paramètres d'un mail (émetteur, récepteur, etc.). |
699 | 17 | Fabien Dupont | |
700 | 22 | Fabien Dupont | _Installation de spfquery :_ |
701 | 17 | Fabien Dupont | <pre> |
702 | 17 | Fabien Dupont | # apt-get install spfquery |
703 | 17 | Fabien Dupont | </pre> |
704 | 17 | Fabien Dupont | |
705 | 22 | Fabien Dupont | _Validation du domaine kafe-in.net :_ |
706 | 17 | Fabien Dupont | <pre> |
707 | 18 | Fabien Dupont | $ spfquery -ip 80.67.176.156 -sender test.kafe-in.net -helo mail.kafe-in.net -rcpt-to test@kafe-in.net |
708 | 17 | Fabien Dupont | pass |
709 | 17 | Fabien Dupont | |
710 | 17 | Fabien Dupont | spfquery: domain of kafe-in.net designates 80.67.176.156 as permitted sender |
711 | 19 | Fabien Dupont | Received-SPF: pass (spfquery: domain of kafe-in.net designates 80.67.176.156 as permitted sender) client-ip=80.67.176.156; envelope-from=test@kafe-in.net; helo=mail.kafe-in.net; |
712 | 17 | Fabien Dupont | </pre> |
713 | 17 | Fabien Dupont | |
714 | 17 | Fabien Dupont | h3. Validation de DKIM |
715 | 17 | Fabien Dupont | |
716 | 24 | Fabien Dupont | h4. Validation du milter OpenDKIM |
717 | 20 | Fabien Dupont | |
718 | 20 | Fabien Dupont | De même que pour SPF, pour tester DKIM il suffit de s'envoyer un mail depuis une boite dont le serveur signe les mails, par exemple gmail.com. Le résultat de la validation de la signature du mail est visible dans les headers du mail. |
719 | 20 | Fabien Dupont | |
720 | 22 | Fabien Dupont | _Headers correspondant à la signature d'un mail :_ |
721 | 20 | Fabien Dupont | <pre> |
722 | 20 | Fabien Dupont | Authentication-Results: ve-mail.kafe-in.net; dkim=pass |
723 | 20 | Fabien Dupont | reason="2048-bit key; insecure key" header.i=@gmail.com |
724 | 20 | Fabien Dupont | header.b=YblIqntw; dkim-adsp=pass; dkim-atps=neutral |
725 | 20 | Fabien Dupont | DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; |
726 | 20 | Fabien Dupont | d=gmail.com; s=20120113; |
727 | 20 | Fabien Dupont | h=mime-version:date:message-id:subject:from:to:content-type; |
728 | 20 | Fabien Dupont | bh=hPPI4v8dQehE4w4uUfmkx8PSxwisYyowXufU8qvkDu8=; |
729 | 20 | Fabien Dupont | b=YblIqntwajS0Y5tTvLXmoMNuiIgfdIN/iVQEBYUEy8CYZvPtOo7R66sT+FqcMCq4kt |
730 | 20 | Fabien Dupont | W3DEKRPeYpty/aqTP42WvP3hGK2x/Ar1azrUiAH2JkKqkmaH13DRHXyOspmGMk/oIuXa |
731 | 20 | Fabien Dupont | O90qSPZtOrgGA5/6fJUi7ioJL8dDiEXbnkCEoknVcaP1T8Rm9XmT2ikQLcqI2J/h4F7o |
732 | 20 | Fabien Dupont | 9iIa+UrU8OQ/f6MP67YV3kmMqeTkk9w1fcvPM+l29F/lb3mKdOGiMddoPLGvh2Khe1OR |
733 | 20 | Fabien Dupont | BBVDdPmhcMtR+3Oijf3BUJFgZK+Fo9DJrlauDXpl35yA7cDVZIairP66StWX+dswjXMu |
734 | 20 | Fabien Dupont | /giQ== |
735 | 20 | Fabien Dupont | </pre> |
736 | 20 | Fabien Dupont | |
737 | 20 | Fabien Dupont | h4. Validation du champs TXT pour le nom de domaine |
738 | 20 | Fabien Dupont | |
739 | 20 | Fabien Dupont | La validation du champs TXT d'un nom de domaine peut se faire en ligne sur "dkimcore.org":http://dkimcore.org/c/keycheck par exemple ou bien, tout simplement, en envoyant un mail à un serveur vérifiant les signatures DKIM (toujours gmail.com). |
740 | 20 | Fabien Dupont | |
741 | 22 | Fabien Dupont | _Headers d'un mail signé reçu par gmail :_ |
742 | 20 | Fabien Dupont | <pre> |
743 | 21 | Fabien Dupont | Authentication-Results: mx.google.com; spf=pass (google.com: domain of test@kafe-in.net designates 80.67.176.156 as permitted sender) smtp.mail=test@kafe-in.net; dkim=pass header.i=@kafe-in.net |
744 | 20 | Fabien Dupont | DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=kafe-in.net; |
745 | 20 | Fabien Dupont | s=default; t=1345197103; |
746 | 20 | Fabien Dupont | bh=4z3/ZP7zCKksb7M9Tss8QbgzOTP4YCBLM4qIxozbd7o=; |
747 | 20 | Fabien Dupont | h=Date:From:To:Subject; |
748 | 20 | Fabien Dupont | b=V7bIXcxv+wICKCX8AvN8cwex1LP/tRZabciI9A68gmccoG9NWRg/DFS63yOZhDITy |
749 | 20 | Fabien Dupont | e4x4tVqt++4IhDTSgqNx5ILbLUrwHQNzgAGuTS96EjamjZRqFvLvvzSNg+DA0MThbd |
750 | 20 | Fabien Dupont | AVymYUIXS/2gf1HYxpsSArQL34YlUt4Spow2owwg= |
751 | 20 | Fabien Dupont | </pre> |