Etape 7 - La sécurisation


Mettre en place un serveur de messagerie, c'est mettre une machine ouverte sur internet. Cela veut donc dire qu'il faut déjà sécuriser la machine elle-même. De plus, cette machine va faire transiter des informations vers les postes clients des utilisateurs. Il faut donc contrôler les données transmises (même si ces postes ont déjà un arsenal de sécurité, anti virus, etc..., deux contrôles valent mieux qu'un).

7.1 - Sécuriser le serveur


Je ne m'étendrai pas beaucoup sur ce sujet. Je pars du principe que si vous mettez une machine sur le net, c'est que vous êtes déjà familiarisé avec les règles de bases de sécurité.
Ce qu'il faut savoir :

7.1.1 - le firewall

Bien entendu, cette machine doit être placée derrière un firewall, et de préférence dans une dmz. Il faut donc contrôler quels ports ouvrir (puisque par défaut, derrière un firewall, les ports sont tous fermés...)

  • - le port 25 (tcp) : c'est le port de communication du smtp. Il faut que le serveur puisse communiquer avec l'extérieur sur ce port là (en sortie), et il faut surtout que l'extérieur puisse communiquer avec le serveur (en entrée), sinon, vous serez incapables de recevoir des mails
  • - le port 143 (tcp) : c'est le port imap par défaut. Si vous souhaitez que les postes clients puissent consulter les mails en imap depuis l'extérieur, vous devez ouvrir ce port. Sinon, il peut (doit...) rester fermé.
  • - le port 110 (tcp) : c'est le port pop3 par défaut. Si vous souhaitez que les postes clients puissent consulter les mails en pop3 depuis l'extérieur, vous devez ouvrir ce port. Même chose que pour le précédent, si la consultation des mails ne doit se faire qu'en réseau local, inutile de l'ouvrir.

7.2 - sécuriser les logiciels

7.2.1 - Les mises à jour logicielles

Un serveur n'est pas forcément destiné à évoluer. Quand il marche bien, inutile de le toucher. Cependant, il faut suivre avec attention les bulletins de sécurité des logiciels utilisés, ainsi que ceux qui concernent le système. Dans le cas d'une faille de sécurité, il faut installer les mises à jour qui corrigent ces failles. Dans les systèmes actuels, notamment celui qui est utilisé ici (Ubuntu), les mises à jour sont très faciles à installer, sans trop de risques, via synaptic ou apt-get.

7.2.2 - amavis

Amavis est un lien entre postfix (ou un autre serveur de messagerie, comme sendmail), et des programmes d'analyse, comme un anti virus par exemple. Il va falloir faire un lien entre les deux. Par défaut, les configuration d'amavis pour Clamav et spamassassin sont bonnes, mais non activées. Pour les activer, il suffit de faire

sudo gedit /etc/amavis/conf.d/15-content-filter-mode

et de décommenter les lignes

#@bypass_virus_checks_maps = (
#   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

et

#@bypass_spam_checks_maps = (
#   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Il faut également activer spamassassin. Pour cela, il faut éditer le fichier /etc/default/spamassassin et mettre la valeur de ENABLED à 1. Démarrer ensuite spamassassin

sudo /etc/init.d/spamassassin start

Cela ne suffit pas. En effet amavis a besoin de connaître avec précision le nom de la machine et le nom du domaine pour lequel il travaille. Vous pouvez commencer à mettre le nom de domaine définitif, ou bien travailler avec le domaine de test.
Tout cela se renseigne dans le fichier /etc/amavis/conf.d/05-node_id
Il faut décommenter et remplir la ligne :

$myhostname = "messagerie.tesmessagerie.fr";

puis redémarrer amavis

sudo /etc/init.d/amavis restart

Il faut maintenant dire à postfix comment se lier à amavis. Là c'est un tout petit peu plus corsé.
Il faut regarder quel port amavis utilise. Pour cela

grep '$inet_socket_port' /etc/amavis/conf.d/20-debian_defaults

Par défaut, c'est le port 10024 Il vous faut maintenant modifier le fichier /etc/postfix/main.cf (penser à faire une sauvegarde) et rajouter cette ligne :

content_filter = smtp-amavis:localhost:10024

Il faut aussi modifier le /etc/postfix/master.cf (même chose, penser aux sauvegardes), et rajouter :

127.0.0.1:10025 inet n  -       n       -       -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.1/32
    -o strict_rfc821_envelopes=yes
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
smtp-amavis unix -      -       n       -       8  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20

et redémarrer postfix

sudo postfix stop
sudo postfix start

Si vous renvoyez un mail et si tout s'est bien passé, dans les logs (/var/log/mail.log), vous allez voir passer des informations amavis (du genre "passed clean").

7.2.3 - postfix

Il faut tout d'abord configurer le nom de machine et le domaine. Beaucoup de serveurs smtp vérifient ces informations et il est donc très important que le nom de machine soit un nom public et que le reverse dns renvoie vers la bonne ip de ce serveur. Sans ça, vous risquez de vous faire rejeter tous les mails (suspicion de spam). Une configuration dns irréprochable est indispensable à la mise en place d'un serveur de messagerie.
Les champs à renseigner sont tous dans le /etc/postfix/main.cf

  • myhostname : il faut mettre le nom complet de la machine (ex : mail.mondomaine.com)
  • mydomain : il faut mettre le domaine de la machine (ex : mondomaine.com)
  • myorigin : en général, pour un serveur d'entreprise, on met $mydomain (les mails proviennent de tout le domaine, pas seulement d'une machine)

Il y a également d'autres paramètres à vérifier :

  • inet_interfaces : c'est la liste des interfaces réseau qui vont écouter sur le port 25. Au début, elle est en 127.0.0.1, ce qui fait que votre serveur ne peut pas accepter de connexion entrante pour envoyer des mails depuis une autre machine. Pour permettre ça, on le met à _all_.
  • mydestination : ce paramètre importe peu (contrairement à une configuration standard), car c'est la base de données qui va gérer les informations.
  • mynetworks : très important, c'est la liste des réseaux qui ont le droit d'utiliser votre serveur pour envoyer des mails. C'est donc un point de sécurisation important. Si vous ouvrez tout, comme votre machine doit communiquer avec l'extérieur sur le port 25, vous pourriez servir d'open relay pour les robots de spam et vous faire blacklister en quelques minutes. Il faut régler ce champ avec attention. En général, cela ressemble à ça : mynetworks = 168.168.1.0/24, 127.0.0.0/8

Bien sûr, après tout ça, il faut redémarrer postfix.

sudo postfix stop sudo postfix start


Si vous voulez plus d'infos sur le main.cf, il existe une version commentée dans /usr/share/postfix/main.cf.dist

Astuces

Supposons que vous ayez plusieurs domaines, que vous voulez qu'il y ait un domaine principal et que les autres soient des domaines "copie" du premier. Par exemple : mondomaine.fr, mondomaine.com et mondomaine.net. Vous souhaitez avoir les mêmes adresses sur ces 3 domaines, pour une seule destination. Choisissons d'abord (de manière tout à fait arbitraire), quel sera le domaine principal. Disons mondomaine.fr. Il faut le paramétrer dans la base de données et paramétrer les utilisateurs.
Ensuite, entrez dans la table virtual les lignes suivantes au moyen de votre éditeur sql préféré:

insert into virtual (adresse,vers,valide) values ('@mondomaine.com',' @mondomaine.fr', true);
insert into virtual (adresse,vers,valide) values ('mondomaine.com','VIRTUAL DOMAIN',true);
insert into virtual (adresse,vers,valide) values ('@mondomaine.net',' @mondomaine.fr', true);
insert into virtual (adresse,vers,valide) values ('mondomaine.net','VIRTUAL DOMAIN',true);

Si vous avez un utilisateur [email protected], si quelqu'un écrit à [email protected], le mail arrivera dans la boite de [email protected] Si vous voulez deux domaines parfaitement identiques, cela vous évite de reparamétrer tous les utilisateurs avec des alias.

Autre astuce : pourquoi ne pas développer une interface php de gestion des utilisateurs ? En gérant bien vos droits et la sécurité, vous pouvez ainsi ouvrir l'administration des comptes à une personne non technicienne. De même, si vous avez déjà un outil de création des utilisateurs, vous pouvez le modifier pour rajouter une requête postgres d'insertion/modification de l'utilisateur, de manière transparente.

Conclusion

Votre serveur de mail est maintenant prêt à être mis en production. Vous pouvez gérer autant de domaines que vous le voulez, avec autant d'utilisateurs de de listes de distributions. L'administration de tout ceci est grandement simplifiée par la base de données. La limite au nombre d'utilisateurs va plutôt être déterminée par l'espace disque, les process de sauvegarde, et la puissance du serveur.
Toutes les options sont celles par défaut et il est possible d'affiner tout ça, notamment pour clamav et spamassassin. Vous pouvez également rajouter du postgrey, qui est un élément anti spam très important (un autre billet lui sera consacré).
Ceci est la réplique d'un serveur qui a été en production pendant plusieurs années, sans aucune anomalie, pour une entreprise de près de 200 personnes, gérant 5 domaines différents.