Dans les exemples suivants, on utilisera la commande apk sur un compte root. Pour adapter celles-ci à une installation Debian/Ubuntu, il suffit de remplacer :
apk add
par apt-get install
et d'ajouter sudo
au début de chaque commande si le compte root est désactivé.
Voici rapidement une liste des pré-requis :
==== Postfix ==== === Installation ===
Installation de postfix :
$ apk add postfix
=== Configuration ===
== Préparation du système ==
$ adduser vmail
$ grep vmail /etc/passwd
postdrop
:
$ addgroup vmail postdrop
$ mkdir /var/spool/mail/vhosts -p
$ chown vmail:vmail /var/spool/mail/vhosts
==Édition du fichier /etc/postfix/main.cf==
## Ces reglages sont normalement actifs par defaut.
## Certains d'entre eux sont a decommenter
soft_bounce = yes
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = mail.domaine.com
mydomain = domaine.com
myorigin = $myhostname
unknown_local_recipient_reject_code = 550
mynetworks_style = host
relayhost =
in_flow_delay = 1s
alias_maps = hash:/etc/aliases
home_mailbox = Maildir/
mail_spool_directory = /var/spool/mail
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /etc/postfix
readme_directory = /usr/share/doc/postfix/readme
## Les reglages suivants sont ajoutes a la configuration
# Definition des domaines virtuels
local_transport = virtual
virtual_mailbox_domains = domaine.tld
virtual_mailbox_base = /var/spool/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
## Configuration alternative pour utiliser des uids dynamiques (plus d'une bal)
## Si cette ligne est decommentee, penser a creer le fichier /etc/postfix/virtual_uids
## virtual_uid_maps = hash:/etc/postfix/virtual_uids
virtual_uid_maps = static:1006
virtual_gid_maps = static:1006
virtual_alias_maps = hash:/etc/postfix/valias
# quotas limites de taille
message_size_limit = 10240000 # 10 Mo par défaut
virtual_mailbox_limit = 10240000 # 10 Mo par défaut
# reglages de securite
smtpd_helo_required = yes
disable_vrfy_command = yes
smtpd_recipient_restrictions =
reject_unauth_pipelining,
permit_sasl_authenticated,
permit_mynetworks,
reject_invalid_hostname, reject_non_fqdn_hostname,
reject_non_fqdn_sender, reject_non_fqdn_recipient,
reject_unknown_sender_domain, reject_unknown_recipient_domain,
reject_unauth_destination,
# Reglages a decommenter une fois gross configuré
#check_policy_service inet:127.0.0.1:5525,
# optionnel
#check_client_access regexp:/etc/postfix/blacklist_clients,
permit
# ce travail est fait par grossd, on commente donc.
#reject_rbl_client zen.spamhaus.org,
#reject_rbl_client bl.spamcop.net,
permit
smtpd_data_restrictions = reject_unauth_pipelining, permit
## Reglages a decommenter une fois clamsmtp configuré
#
#content_filter = scan:[127.0.0.1]:10025
==Édition du fichier /etc/postfix/valias==
blah.blah@exemple.net utilisateur1@exemple.net
toc.toc@exemple.net utilisateur1@exemple.net
machin@exemple.net utilisateur2@exemple.net
==Édition du fichier /etc/postfix/blacklist_clients==
Ce fichier contient une liste d'expressions regexp pour lister les clients auxquels on souhaite refuser l'accès.
# Rejeter un nom de domaine complet
#/^example\.com$/ REJECT UCE black-listed
# Rejeter un nom de domaine et tous ses sous domaines
#/example\.com$/ REJECT UCE black-listed
# Rejeter un block d'IPs ou une IP
/^192\.168/ REJECT UCE black-listed
/^192\.168/.1/ REJECT UCE black-listed
/^192\.168/.1/.1$/ REJECT UCE black-listed
==Édition du fichier /etc/postfix/vmailbox ==
utilisateur1@exemple.net exemple.net/utilisateur1/
utilisateur2@exemple.net exemple.net/utilisateur2/
@exemple.net example.net/attrapetout # tous les messages qui ne correspondent pas aux regles ci-dessus
==Édition du fichier /etc/postfix/virtual_uids ( optionnel )==
virtualuidmaps
dans le fichier main.cf
.
100x et 100y représentent les UIDs des utilisateurs possédant une boite aux lettres.
utilisateur@domaine.com 100x
@domaine.com 100y
== Création des bases de données Postfix ==
Une fois ces opérations effectuées, il faut compiler la base de données de postfix :
$ postmap /etc/postfix/vmailbox
$ postmap /etc/postfix/valias
$ postmap /etc/postfix/virtual_uids
vmailbox
, valias
ou virtual_uids
.
=== Tester ===
== Démarrer postfix et démarrage auto==
$ rc-update add postfix
== Session Telnet et Netstat==
Pour tester la connexion à votre serveur, vous pouvez vous connecter au serveur avec telnet:
$ telnet localhost 143
ou encore, vérifier qu'un serveur écoute bien sur le port 143 (smtp):
$ netstat -l | grep smtp
== Trouver les problèmes ==
Si ça ne marche pas, vous pourrez sans doute trouver des indices en observant vos fichiers log :
$ tail -f /var/log/messages
Version : postfix-2.8.3-r0 ===== Sécuriser son serveur SMTP =====
==== anti-virus Clamav ====
apk add clamav
== Mises à jour automatique avec cron :==
$ rc-update add cron
Ajout de la règle pour la maj :
$ echo "00 04 * * * /usr/local/bin/freshclam --quiet" >> /etc/crontabs/root
$ /etc/init.d/clamd start && rc-update add clamd
version : clamav-0.97-r0 ==== Clamsmtp ====
$ apk add clamsmtp
OutAddress: 127.0.0.1:10026
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.sock
TempDirectory: /tmp
Action: drop
Quarantine: on
User: clamav
# AV scan filter (used by content_filter)
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no
# For injecting mail back into postfix from the filter
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
$ /etc/init.d/clamsmtpd start && rc-update add clamsmtpd
Une fois que vous êtes sûr de vos réglages, désactivez la ligne content_filter
dans le fichier /etc/postfix/main.cf
puis relancer postfix :
$ /etc/init.d/postfix reload
version : clamsmtp-1.10-r8 ==== Gross ====
$ apk add gross
/etc/grossd.conf
:
protocol = postfix
# Sous Debian Wheezy avec Gross 1.0.2, le fichier d'état pose problème.
# il faut alors créer ce fichier en lançant la commande suivante : sudo -u gross grossd -C
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=614790
statefile = /var/db/grossd.state
check = dnsbl
check = rhsbl
dnsbl = zen.spamhaus.org
dnsbl = list.dsbl.org
dnsbl = bl.spamcop.net
dnsbl = combined.njabl.org
dnsbl = cbl.abuseat.org
dnsbl = dnsbl.sorbs.net
rhsbl = rhsbl.sorbs.net
$ /etc/init.d/grossd start && rc-update add grossd
Il faut maintenant dé-commenter la ligne checkpolicyservice
dans le fichier /etc/postfix/main.cf
et relancer postfix :
$ /etc/init.d/postfix reload
version : gross-1.0.2-r2 ====SaneSecurity & MSRBL====
$ apk add curl rsync
/etc/postfix/scripts
:
$ mkdir /etc/postfix/scripts
$ nano /etc/postfix/scripts/up_clam_ex.sh
$ chmod +x /etc/postfix/scripts/up_clam_ex.sh
Copier le contenu du script dans le fichier ainsi créé : up_clam_ex.sh
$ echo "18 04 * * * /etc/postfix/scripts/up_clam_ex.sh &> /dev/nul" >> /etc/crontabs/root
=====Serveur IMAP : Dovecot =====
====Installation====
$ apk add dovecot
====Préparation====
* Création des fichiers log :
$ touch /var/log/dovecot-info.log && touch /var/log/dovecot.log
$ chown vmail:vmail /var/log/dovecot*.log
/etc/dovecot/conf.d/10-auth.conf
:
$ nano /etc/dovecot/conf.d/10-auth.conf
!include auth-passwdfile.conf.ext
# le fichier suivant sert a securiser le serveur smtp
!include auth-postfix.conf.ext
auth-passwdfile.conf.ext
:
$ nano /etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb {
driver = passwd-file
args = scheme=cram-md5 /etc/dovecot/md5
}
userdb {
args = username_format=%u /etc/dovecot/users
driver = passwd-file
}
auth-postfix.conf.ext
:
$ nano /etc/dovecot/conf.d/auth-postfix.conf.ext
passdb {
driver = passwd-file
args = scheme=plain username_format=%u /etc/postfix/users
}
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0660
user = postfix
}
}
userdb {
driver = passwd-file
args = username_format=%u /etc/postfix/users
}
=== Création des certificats de sécurité pour le SSL ===
/etc/dovecot/dovecot-openssl.cnf
avec les informations du serveur :
$ nano /etc/dovecot/dovecot-openssl.cnf
/etc/dovecot/
:
$ nano /etc/dovecot/mkcert.sh
# changement du bit d'execution
$ chown +x /etc/dovecot/mkcert.sh
#lancement
$ /etc/dovecot/mkcert.sh
=== Mise en place des utilisateurs ===
/etc/dovecot/users
:
<file>
utilisateur1::UID:GID::/home/utilisateur1
utilisateur2::UID:GID::/home/utilisateur2
</file>=== Mise en place des mots de passe ===
$ doveadm pw
Copier le hash md5 résultant et l'ajouter au fichier /etc/dovecot/md5
.
Exemple pour le mdp test123
:
$ Enter new password:
$ Retype new password:
{CRAM-MD5}8314fef5923bb513c7e8be9e663501bbc56ce1012aae68e4c68852be5ab8da76
/etc/dovecot/md5
:
utilisateur1:8314fef5923bb513c7e8be9e663501bbc56ce1012aae68e4c68852be5ab8da76
utilisateur2:e02d374fde0dc75a17a557039a3a5338c7743304777dccd376f332bee68d2cf6
=== Mise en place de la connexion sécurisée pour le serveur SMTP ===
# Choisissez un nom qui n'existe pas sur le systeme pour remplacer 'utilisateur'
# -H : ne pas creer de repertoire home -s : shell de l'utilisateur
$ adduser -H -s /bin/false 'utilisateur'
Entrez un mot de passe quand on vous le demande. Ce sont ce login et mot de passe qui seront utilisés pour vous connecter au serveur SMTP depuis votre client.
$ cat /etc/passwd | grep 'utilisateur'
donne une ligne du type suivant, à copier/coller dans le fichier /etc/postfix/users
:
'utilisateur':x:100x:100x:Linux User,,,:/home/'utilisateur':/bin/sh
/etc/postfix/users
:
$ nano /etc/postfix/users
# Substituer le mot de passe au ''x'' :
'utilisateur':'mot_de_passe':100x:100x:Linux User,,,:/home/'utilisateur':/bin/sh
/etc/init.d/dovecot restart && /etc/init.d/postfix restart
== Test du serveur SMTP ==
Les commandes précédées d'un >
sont à entrer par l'utilisateur.
truc@machin:~$ telnet serveur.exemple.com 25
Trying 0.0.0.0...
Connected to 0.0.0.0.
Escape character is '^]'.
220 serveur.exemple.com ESMTP Postfix (2.8.3)
> EHLO serveur.exemple.com
250-serveur.exemple.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN CRAM-MD5
250-AUTH=PLAIN LOGIN CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
> AUTH PLAIN AHRlc3QAdGVzdHBhc3M=
235 2.7.0 Authentication successful
> QUIT
221 2.0.0 Bye
Connection closed by foreign host.
La ligne AUTH PLAIN AHRlc3QAdGVzdHBhc3M=
contient les noms d'utilisateur et le mot de passe en base 64.
Pour faire la conversion :
echo -ne '\000utilisateur\000mot_de_passe' | openssl base64
Copier le résultat à la suite de la commande AUTH PLAIN
.
====Configuration====
/etc/dovecot/dovecot.conf
:
protocols = imap pop3
listen = *
base_dir = /var/run/dovecot/
login_greeting = IMAP ready.
!include conf.d/*.conf
# SSL
ssl = yes
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem
ssl = required
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
verbose_ssl = yes
mail_location = maildir:/var/spool/mail/vhosts/%d/%n
mail_privileged_group = vmail
mail_access_groups = vmail
# logging
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
auth_mechanisms = plain login cram-md5
# Plaintext login ( set to no for tests )
disable_plaintext_auth = yes
====Lancement et ajout au démarrage====
$ /etc/init.d/dovecot start && rc-update add dovecot
====Tester====
openssl s_client -connect localhost:993
doit retourner :
CONNECTED(00000003)
.........
New, TLSvX/SSLvX, Cipher is BLAH-BLAH
Server public key is X bit
Secure Renegotiation IS supported
Compression: zlib compression
Expansion: zlib compression
.........
+OK IMAP ready.
Version : dovecot-2.0.13-r0