Projet

Général

Profil

SecuMail » Historique » Version 30

Mathieu Goessens, 29/10/2012 09:52
Ajout note intégration RBL spamassassin et policyd

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 26 Fabien Dupont
Il n'y a pas 50000 antivirus sous linux, "ClamAV":http://www.clamav.net/ 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 30 Mathieu Goessens
* Les RBL : Voir plus haut, la gestion des RBL est gérée directement par postfix. Elle peut également être intégrée à SpamAssassin ou à des services de policyd (comme http://www.policyd-weight.org/ ) pour aider à classer les mails.
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 25 Fabien Dupont
_Envoi 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>
752 27 Fabien Dupont
753 27 Fabien Dupont
h2. Puppetisation du tout
754 27 Fabien Dupont
755 29 Laurent GUERBY
Tous ces logiciels, ainsi que postfix, peuvent bien évidemment être installés et configurés via "puppet":http://www.puppetlabs.com.
756 27 Fabien Dupont
757 28 Fabien Dupont
J'ai d'ailleurs écrit un module "puppet-mailserver":http://git.kafe-in.net/puppet-mailserver.git/ pour ça, il peut être utilisé sans soucis (voir "ma conf":http://git.kafe-in.net/puppet.git/tree/manifests/nodes/ve-mail.kafe-in.net.pp à titre d'exemple).