nyroBlog
Bannière NyroBlog, par Emi
Image par Emi - ?

Tag : Spam


Monitoring du serveur : Monit (Serveur Web sur Debian Squeeze)

Le serveur fonctionne bien. Mais qu'arrive-t-il si pour une raison ou une autre un des services tombe ? Pour l'instant, aucune alerte n'est en place et rien ne sera fait.

C'est là que monit intervient. Après quelques configurations, Monit vérifiera toutes les 10 minutes si l'ensemble des services fonctionnement bien. Si ce n'est pas le cas, une alerte est envoyée par email et il tente de le rédmarrer automatiquement.

L'installation du démon est très simple :

aptitude install monit

Puis déplaçon la configuration par défaut pour ne pas l'utiliser:

mv /etc/monit/monitrc /etc/monit/monitrc_default

Editons une nouvelle configuration dans le fichier /etc/monit/monitrc en y mettant :

set daemon  600
    with start delay 120
set logfile syslog facility log_daemon
set mailserver localhost
set mail-format {
    from: yourSender@email.com
    subject: [monit] $SERVICE: $EVENT
}
set eventqueue basedir /home/var/monit slots 100
set alert you@email.com
set httpd port 9999 and
        allow ADMINUSER:ADMINPASS

include /etc/monit/conf.d/*

Puis configurons chacun des services que nous avons installé dans le dossier /etc/monit/conf.d/.

Le fichier /etc/monit/conf.d/clamav :

check process clamav with pidfile /var/run/clamav/clamd.pid
        group virus
        start program = "/etc/init.d/clamav-daemon start"
        stop  program = "/etc/init.d/clamav-daemon stop"
        if failed host localhost port 3310 then restart
        if 5 restarts within 5 cycles then timeout

check process freshclam with pidfile /var/run/clamav/freshclam.pid
        group virus
        start program = "/etc/init.d/clamav-freshclam start"
        stop  program = "/etc/init.d/clamav-freshclam stop"
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/cron :

check process cron with pidfile /var/run/crond.pid
        group system
        start program = "/etc/init.d/cron start"
        stop  program = "/etc/init.d/cron stop"
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/dovecot :

check process dovecot with pidfile /var/run/dovecot/master.pid
        group mail
        start program = "/etc/init.d/dovecot start"
        stop  program = "/etc/init.d/dovecot stop"
        if failed host localhost port 993 type tcpssl sslauto protocol imap then restart
        if failed host localhost port 995 type tcpssl sslauto protocol pop then restart
        if failed host localhost port 143 protocol imap then restart
        if failed host localhost port 110 protocol pop then restart
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/dspam :

check process dspam with pidfile /var/run/dspam/dspam.pid
        group mail
        start program = "/etc/init.d/dspam start"
        stop program = "/etc/init.d/dspam stop"
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/fail2ban :

check process fail2ban with pidfile /var/run/fail2ban/fail2ban.pid
        start program = "/etc/init.d/fail2ban start"
        stop  program = "/etc/init.d/fail2ban stop"
        if failed unixsocket /var/run/fail2ban/fail2ban.sock then restart
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/munin :

check process munin-node with pidfile /var/run/munin/munin-node.pid
        group system
        start program = "/etc/init.d/munin-node start"
        stop program  = "/etc/init.d/munin-node stop"
        if failed host localhost port 4949 then restart
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/mysql :

check process mysql with pidfile /var/run/mysqld/mysqld.pid
        group database
        start program = "/etc/init.d/mysql start"
        stop program = "/etc/init.d/mysql stop"
        if failed unix "/var/run/mysqld/mysqld.sock" then restart
        if failed host 127.0.0.1 port 3306 then restart
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/nginx :

check process nginx with pidfile /var/run/nginx.pid
        group www
        start program = "/etc/init.d/nginx start"
        stop program  = "/etc/init.d/nginx stop"
        if failed host localhost port 80 protocol http
                and request "/nginx_status" then restart
        if cpu > 60% for 2 cycles then alert
        if cpu > 90% for 5 cycles then restart
        if totalmem > 50% for 5 cycles then restart
        if children > 250 then restart
        if loadavg(5min) greater than 10 for 8 cycles then stop
        if 3 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/phpfpm :

check process phpfpm with pidfile /var/run/php5-fpm.pid
        group www
        start program = "/etc/init.d/php5-fpm start"
        stop program = "/etc/init.d/php5-fpm stop"
        if failed unix "/var/run/php5-fpm.sock" then restart
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/postfix :

check process postfix with pidfile /var/spool/postfix/pid/master.pid
        group mail
        start program = "/etc/init.d/postfix start"
        stop  program = "/etc/init.d/postfix stop"
        if failed port 10026 protocol smtp for 2 times within 2 cycles then restart
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/powerdns :

check process powerdns with pidfile /var/run/pdns.pid
        start program = "/etc/init.d/pdns start"
        stop program = "/etc/init.d/pdns stop"
        if failed host localhost port 53 then restart
        if 5 restarts within 5 cycles then timeout

check process powerdns-recursor with pidfile /var/run/pdns_recursor.pid
        start program = "/etc/init.d/pdns-recursor start"
        stop program = "/etc/init.d/pdns-recursor stop"
        if failed host localhost port 54 then restart
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/rsyslog :

check process rsyslogd with pidfile /var/run/rsyslogd.pid
        group system
        start program = "/etc/init.d/rsyslog start"
        stop  program = "/etc/init.d/rsyslog stop"
        if 5 restarts within 5 cycles then timeout

 

Le fichier /etc/monit/conf.d/sshd :

check process sshd with pidfile /var/run/sshd.pid
        start program  "/etc/init.d/ssh start"
        stop program  "/etc/init.d/ssh stop"
        if failed port 22 protocol ssh then restart
        if 5 restarts within 5 cycles then timeout

 

Pour que monit démarre, il faut aussi modifier le fichier /etc/default/monit pour y mettre :

startup=1

Un redémarrage de monit et le tour est joué :

/etc/init.d/monit force-reload

 

Il ne reste plus que quelques petits éléments à mettre en place.

Retour au sommaire du tutorial complet.

Serveur email : Postfix, Dovecot, Dspam et ClamAV (Serveur Web sur Debian Squeeze)

Cette partie du tutorial est la plus longue car elle nécessite beaucoup de configuration. En effet, c'est pas moins de 4 démons que nous allons installé et configuré pour fonctionner parfaitement avec le reste de notre serveur. De plus notre serveur d'emails incluera un antispam pour tous les emails entrant, qui en plus vérifiera si les emails ne contiennent pas des virus grâce à ClamAV. Enfin, il sera possible d'entrâiner l'antispam simplement en déplacement un email du dossier enrant vers le dossier Spam et inversement.

Vous êtes prêt ?

 

On commence par désinstaller les logiciels d'emails énventuellement présents, puis par installer ceux qu'on désire :

aptitude purge exim4 exim4-base exim4-config exim4-daemon-light bsd-mailx
aptitude install postfix postfix-mysql dovecot-imapd dovecot-pop3d dovecot-dev dspam dspam-doc libdspam7-drv-mysql bzip2 clamav-daemon make sudo

Durant l'installation, il vous sera demandé le type de configuration pour postfix. Sélectionnez Sites internet. Puis pour le nom, le champ par défaut sera sûrement très bien : il s'agit du reverseIP de votre serveur (nsXXX.ovh.net pour un serveur OVH par exemple)

Puis quelques questions arrivent pour la configuration du stockage de données de Dspam, votre antispam. Il faudra répondre que vous voulez que la base de données soit créés, puis renseigné votre mot de passe root MySQL. Enfin le mot de passe de la librairei, vus pouvez laisser vide pour qu'il en génére un aléatoirement pour vous. Comme le fichier de configuration est changé par ce choix de mot de passe, il vous demandera si vous souhaitez conserver la version de la configuration. Il faudra répondre : Installer la version du responsable du paquet.

 

Dans l'étape précédente, nous avons mis en place une base de données pour configurer les DNS de notre serveur. Cette base de données contient l'ensemble des noms de domaines qui sont gérer par notre serveur. Nous allons y ajouter 2 tables pour gérer les alias emails et une autre pour configurer les adresse emails, grâce au fichier de création SQL. Comme tout à l'heure, on l'exécute de cette façon :

mysql -h localhost -u root --password=MySQL serverconf < /PATH/TO/postfix.sql

Pour utiliser cette base de données, postfix a besoin de savoir comment y accéder. Nous allons mettre ces fichiers dans le dossier /etc/postfix/mysqlà créer :/p>

mkdir /etc/postfix/mysql

Puis y placer nos différents fichiers de configurations.

/etc/postfix/mysql/email2email.cf est utilisé pour connaître les adresse email existantes :

hosts = 127.0.0.1
dbname = serverconf
user = serverconfuser
password = serverconfpass
query = SELECT CONCAT(user.user, '@', domain.name) AS email FROM domain,user WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%s'

/etc/postfix/mysql/virtual-alias-maps.cf est utilisé pour connaître les alias (les redirection d'emails) :

hosts = 127.0.0.1
dbname = serverconf
user = serverconfuser
password = serverconfpass
query = SELECT destination FROM alias, domain WHERE alias.domain_id=domain.id AND CONCAT(alias.source, '@', domain.name)='%s'

/etc/postfix/mysql/virtual-mailbox-domains.cf est utilisé pour connaître les domaines gérés :

hosts = 127.0.0.1
dbname = serverconf
user = serverconfuser
password = serverconfpass
query = SELECT 1 FROM domain WHERE name='%s'

/etc/postfix/mysql/virtual-mailbox-maps.cf est utilisé pour vérifier si une adresse email est bien géré par le serveur :

hosts = 127.0.0.1
dbname = serverconf
user = serverconfuser
password = serverconfBlaBlu00
query = SELECT 1 FROM user,domain WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%s'

 

Pour terminer la configuration de postfix, il faut paramétrer quelques port à écouter et comment il doit les interpréter. Dans le fichier /etc/postfix/master.cf, commenter la ligne commençant par smtp et la remplacer par :

smtp inet n - - - - smtpd -o content_filter=lmtp:unix:/var/run/dspam.sock
smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes -o content_filter=lmtp:unix:/var/run/dspam.sock

On voit que la configuration de Dspam est déjà présente. Puis en bas du fichier /etc/postfix/master.cf, ajouter les lignes :

127.0.0.1:10026 inet n - - - - 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=127.0.0.0/8
-o smtpd_authorized_xforward_hosts=127.0.0.0/8

dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/bin/sudo /usr/lib/dovecot/deliver -d ${recipient}

slow unix - - n - 5 smtp
-o syslog_name=postfix-slow
-o smtp_destination_concurrency_limit=3
-o slow_destination_rate_delay=1

La première partie permet à Dspam de délivrer les emails. La seconde permet à postfix de savori comment parler avec dovecot. La dernière permet de délivrer les emails pour orange beaucoup plus rapidement (cf cette page)

Pour bien paramétré ce fonctionnement spécial d'orange et consors, créer le fichier /etc/postfix/transport pour y mettre :

wanadoo.com slow:
wanadoo.fr slow:
orange.com slow:
orange.fr slow:

Puis transformer le en fichier utilsiable par postfix :

postmap /etc/postfix/transport

Pour bien fonctionner, ces éléments vont voir besoin d'exécuter des commandes en tant que root. Bien sûr, comme ces démons ne doivent pas connaître le mot de passe root pour des raisons évidentes de sécurité, nous allons les ajoutés dans le fichier /etc/sudoers.d/mail :

Defaults:postfix !syslog
postfix ALL=NOPASSWD:/usr/lib/dovecot/deliver
Defaults:clamav !syslog
clamav ALL=NOPASSWD:/usr/lib/dovecot/deliver
Defaults:dovecot !syslog
dovecot ALL=NOPASSWD:/usr/lib/dovecot/deliver
Defaults:dspam !syslog
dspam ALL=NOPASSWD:/usr/lib/dovecot/deliver
Defaults:vmail !syslog
vmail ALL=NOPASSWD:/usr/lib/dovecot/deliver

Et on applique les bons droits d'accès à ce fichier :

chmod 0440 /etc/sudoers.d/mail

Et voici la configuration général de postfix à ajouter dans le fichier /etc/postfix/main.cf :

virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual-mailbox-domains.cf
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual-alias-maps.cf,mysql:/etc/postfix/mysql/email2email.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject_unauth_destination
smtpd_tls_auth_only = yes
transport_maps = hash:/etc/postfix/transport
maximal_queue_lifetime = 3d
bounce_queue_lifetime = 3d
broken_sasl_auth_clients = yes
message_size_limit = 20480000
slow_destination_recipient_limit = 20
slow_destination_concurrency_limit = 2

 

S'en est fini de la configuration de Postfix. Passons à Dovecot.

Pour permettre à dovecot d'entraîner Dspam lorsqu'un email passe du dossier Spam a un dossier de réception ou inversement, nous avons besoin d'installer un plugin. Télécharger ce plugin ici et envoyer le tar.gz sur votre serveur dans le dossier personnel de root. Puis exécutez les commandes :

cd
mv /home/user/data/dovecot-antispam-HEAD-98b5e06.tar.gz ./
gzip -d dovecot-antispam-HEAD-98b5e06.tar.gz
tar xvf dovecot-antispam-HEAD-98b5e06.tar
cd dovecot-antispam-HEAD-98b5e06
cp defconfig .config

Editez le fichier .config pour y décommenter la ligne :

DOVECOT=/usr/include/dovecot

Votre plugin est maintenant prêtre à être compilé et installé. Une seule ligne de commande :

make install

Ce plugin étant prêt à être utilisé, passons à la configuration générale de dovecot dans le fichier /etc/dovecot/dovecot.conf :

protocols = imap imaps pop3 pop3s managesieve
mail_location = maildir:/home/var/vmail/%d/%n/Maildir:INBOX=/home/var/vmail/%d/%n/Maildir/:INDEX=/home/var/vmail/%d/%n/Maildir/tmp/index

Dans la partie protocol imap :

  mail_plugins = antispam
  mail_plugin_dir = /usr/lib/dovecot/modules/imap
  imap_client_workarounds = outlook-idle delay-newmail tb-extra-mailbox-sep

Dans la partie protocol pop3 :

  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh

Dans la partie protocol managesieve :

  mail_location=~/.dovecot.sieve

Dans la partie protocol lda :

   postmaster_address = postmaster@domain.tld
   auth_socket_path = /var/run/dovecot/auth-master
   mail_plugins = sieve
   log_path = /home/var/log/dovecot-deliver.log
   global_script_path = /home/var/vmail/globalsieverc

Dans la partie auth default :

 mechanisms = plain login
 # Commenter la partie passdb pam
 # Décommenter la partie passdb sql avec comme paramètres :
    args = /etc/dovecot/dovecot-sql.conf

Dans la partie userdb static :

    args = uid=5000 gid=5000 home=/home/var/vmail/%d/%n allow_all_users=yes

 Dans la partie socket listen :

    master {
        path = /var/run/dovecot/auth-master
        mode = 0600
        user = vmail
    }
    client {
        path = /var/spool/postfix/private/auth
        mode = 0660
        user = postfix
        group = postfix
    }


Dans la partie plugin, nous allons paramètrer le plugin précédemment compilé :

sieve_storage=~/sieve

##################################
# Antispam plugin

# Debugging options
# Uncomment to get the desired debugging behaviour.
# Note that in some cases stderr debugging will not be as
# verbose as syslog debugging due to internal limitations.
#
# antispam_debug_target = syslog
# antispam_debug_target = stderr
# antispam_verbose_debug = 1

# backend selection, MUST be configured first,
# there's no default so you need to set one of
# these options:
# antispam_backend = crm114
antispam_backend = dspam
# antispam_backend = pipe
# antispam_backend = spool2dir

# mail signature (used with any backend requiring a signature)
antispam_signature = X-DSPAM-Signature

# action to take on mails without signature
# (used with any backend requiring a signature)
# (we recommend only setting this to 'move' after verifying that the
# whole setup is working)
# antispam_signature_missing = move # move silently without training
antispam_signature_missing = move

# The list of folders for trash, spam and unsure can be given
# with three options, e.g. "trash" matches the given folders
# exactly as written, "trash_pattern" accept the * wildcard at
# the end of the foldername, "trash_pattern_ignorecase"
# accepts the * wildcard at the end of the foldername _and_
# matches the name case insensitivly.

# the *-wildcard with the following meaning:
# * at the end: any folder that _start_ with the string
# e.g.:
# antispam_trash_pattern = deleted *;Gel&APY-schte *
# match any folders that start with "deleted " or "Gelöschte "
# match is _case_senstive_!
#
# antispam_trash_pattern_ignorecase = deleted *;Gel&APY-schte *
# match any folders that start with "deleted " or "gelöschte "
# match is _case_insenstive_, except the non-USASCII letters,
# "ö" in this example.
# To match the upper-case Ö, too, you need to add yet another
# pattern "gel&ANY-schte *", note the different UTF7 encoding:
# &ANY- instead of &APY-.


# semicolon-separated list of Trash folders (default unset i.e. none)
antispam_trash = trash;Trash;Deleted Items; Deleted Messages;&AMk-l&AOk-ments supprim&AOk-s
# antispam_trash = trash;Trash;Deleted Items; Deleted Messages
# antispam_trash_pattern = trash;Trash;Deleted *
# antispam_trash_pattern_ignorecase = trash;Deleted *

# semicolon-separated list of spam folders
antispam_spam = Spam;spam;Junk;junk;Courrier ind&AOk-sirable
# antispam_spam_pattern = SPAM
# antispam_spam_pattern_ignorecase = SPAM

# semicolon-separated list of unsure folders (default unset i.e. none)
# antispam_unsure =
# antispam_unsure_pattern =
# antispam_unsure_pattern_ignorecase =

# Whether to allow APPENDing to SPAM folders or not. Must be set to
# "yes" (case insensitive) to be activated. Before activating, please
# read the discussion below.
# antispam_allow_append_to_spam = no

###########################
# BACKEND SPECIFIC OPTIONS
#

#===================
# dspam plugin

# dspam binary
antispam_dspam_binary = /usr/bin/dspam

# semicolon-separated list of extra arguments to dspam
# (default unset i.e. none)
antispam_dspam_args = --user;root;--source=error
# antispam_dspam_args = --deliver=;--user;%u # % expansion done by dovecot
# antispam_dspam_args = --mode=teft

# Ignore mails where the DSPAM result header contains any of the
# strings listed in the blacklist
# (default unset i.e. none)
# antispam_dspam_result_header = X-DSPAM-Result
# semicolon-separated list of blacklisted results, case insensitive
# antispam_dspam_result_blacklist = Virus

 

Il faut configurer dovector pour utiliser correctement notre base de données dans le fichier /etc/dovecot/dovecot-sql.conf :

driver = mysql
connect = host=127.0.0.1 dbname=serverconf user=serverconfuser password=serverconfpass
default_pass_scheme = PLAIN-MD5
password_query = SELECT CONCAT(user.user, '@', domain.name) AS user,user.password FROM user,domain WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%u'

 

Comme le serveur utilise des protocoles sécurisés, nous devons créés des certificats :

openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem -keyout /etc/ssl/private/dovecot.pem
# Country Name (2 letter code) [AU]:                        FR
# State or Province Name (full name) [Some-State]:            France
# Locality Name (eg, city) []:                            Besancon
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:        Company Name
# Organizational Unit Name (eg, section) []:                    .
# Common Name (eg, YOUR name) []:                            domain.tld
# Email Address []:                                    certs@domain.tld
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.pem

Et de donner les droits nécessaires :

chmod o= /etc/ssl/private/dovecot.pem
chmod o= /etc/ssl/private/postfix.pem

 

Il faut aussi créer l'utilisateur vmail, créer quelques fichiers vides avec les bons droits, etc :

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/var/vmail -m
rm -rf /home/var/vmail/* /home/var/vmail/.*
touch /home/var/log/dovecot-deliver.log
chmod 777 /home/var/log/dovecot-deliver.log

chgrp postfix /etc/postfix/mysql/*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql/*.cf
chown vmail:vmail /etc/dovecot/dovecot.conf
chmod g+r /etc/dovecot/dovecot.conf

 

Postfix et Dovecot sont maintenant configuré, plus qu'à configuré l'antispam Dspam et l'antivirus ClamAV.

Pour DSpam, commençons par créer son dossier d'exécution avec les bons droits :

mkdir -p /var/spool/postfix/var/run/
chown dspam:dspam /var/spool/postfix/var/run/
chown -R dspam:dspam /etc/dspam/*

 

Puis le paramétrer dans /etc/dspam/dspam.conf (seules les lignes qui changents sont indiqués ici) :

StorageDriver /usr/lib/dspam/libmysql_drv.so
#TrustedDeliveryAgent "/usr/lib/dovecot/deliver -d %u"
DeliveryHost 127.0.0.1
DeliveryPort 10026
DeliveryIdent localhost
DeliveryProto SMTP
QuarantineAgent "/usr/bin/sudo /usr/lib/dovecot/deliver -d %u -m Spam"
Trust vmail
Feature noise
WebStats no
Preference "spamAction=quarantine"
Preference "signatureLocation=headers" # 'message' or 'headers'
#Preference "showFactors=on"
TrackSources spam virus
ClamAVPort 3310
ClamAVHost 127.0.0.1
ClamAVResponse reject
ServerPID /var/run/dspam/dspam.pid
ServerMode auto
ServerPass.Relay1 "secret"
ServerParameters "--deliver=innocent -d %u"
ServerIdent "localhost.localdomain"
ServerDomainSocketPath "/var/spool/postfix/var/run/dspam.sock"
ClientHost /var/spool/postfix/var/run/dspam.sock
ClientIdent "secret@Relay1"

On modifie la configuration du stockage dans MySQL dans /etc/dspam/dspam.d/mysql.conf :

MySQLUIDInSignature    on

On paramètre DSpam pour regrouper tous les apprentissages de tous les emails dans un seul et même utilisateur dpsam dans vi /var/spool/dspam/group :

dspam:shared:*

Et on indique au démon qu'il peut maintenant démarrer dans /etc/default/dspam :

Start=yes

 

Nous y sommes presque, plus que l'antivirus !

Dans /etc/clamav/clamd.conf

# Commenter la ligne avec  localSocket et ajouter :
TCPAddr 127.0.0.1
TCPSocket 3310

 

Et voilà !

 

Il ne reste plus qu'à tout redémarrer :

/etc/init.d/clamav-daemon restart
/etc/init.d/dspam restart
/etc/init.d/postfix restart
/etc/init.d/dovecot restart

Attention, dans certains cas il faudra peut-être redémarrer plusieurs fois dovecot.

 

Si vous avez suivi tout le tutorial jusqu'à maintenant, votre serveur est maintenant tout à fait opérationnel avec toutes les options de base dont il a besoin. Mais nous pouvons encore y ajouter un peu de sécurité et de monitoring...


Retour au sommaire du tutorial complet.

Sécurité du serveur : fail2ban (Serveur Web sur Debian Lenny)

UPDATE : voir la version à jour pour Debian Squeeze.

 

fail2ban est utilisé pour lire les log de tous les autres démons et bannir des adresses IP s'ils ont échoués à plusieurs reprises de se connecter.
On installe simplement par apt :

apt-get install fail2ban

Puis on configure fail2ban dans /etc/fail2ban/jail.conf

bantime  = 600
destemail = server@domain.tld
action = %(action_mwl)s

[postfix]
action   = %(action_)s
bantime  = 3600

De cette façon, on recevra un email lorsque fail2ban fera une action quelconque. Il a été désactivé pour postfix car les emails étaient très très nombreux !!!
Ensuite, activez les démons que vous désirez. Dans notre installation, il s'agit de pam-generic, vsftpd, postfix, apache, apache-noscripts, apache-overflows et sasl : il suffit de mettre enabled à true dans les sections concernés.

Il existe aussi une attaque sur le serveur Apache qui envoie des requêtes étranges sur la racine du serveur en cherchant un fichier commencant par w00tw00t. Nous pouvons bannir aussi les IP qui effectuent ces requêtes en ajoutant le fichier /etc/fail2ban/filter.d/apache-w00tw00t.conf :

# - - [29/Apr/2008:22:54:08 +0200] "GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 326

[Definition]
# Option:  failregex
# Notes.:  regex to match the w00tw00t scan messages in the logfile. The
#          host must be matched by a group named "host". The tag "" can
#          be used for standard IP/hostname matching.
# Values:  TEXT
failregex = ˆ -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex =

Puis il faut activer ce filtre dans /etc/fail2ban/jail.conf en ajoutant :

[apache-w00tw00t]
enabled = true
filter  = apache-w00tw00t
port = all
banaction = iptables-allports
port     = anyport
logpath  = /var/log/apache*/access.log
maxretry = 1
bantime = 86400


En plus, je me suis aperçu que de nombreux spammeurs essayaient d'envoyer des emails à des adresses inexistantes. Par défaut, le filtre de fail2ban ne banni que les emails rejeté par le serveur (erreur 554) et pas les emails rejeté pour une adresse inexistante. c'est pour cela qu'on édite le fichier /etc/fail2ban/filter.d/postfix.conf pour simplement supprimé le 4 de failregex = reject: RCPT from (.*)\[\]: 55 pour bannir n'importe quelle erreur.

Et pour finir, on recharge le démons pour prendre en compte nos changements :

/etc/init.d/fail2ban force-reload

Maintenant que notre serveur fonctionne avec les démons que l'on veut, si on monitorait pour avoir quelques stats et outils ?

Retour au sommaire.

Serveur de mail : postfix, dovecot, dspam, clamav (Serveur Web sur Debian Lenny)

UPDATE : voir la version à jour pour Debian Squeeze.

 

Cette partie sera la plus grande car la plus complexe. Et on ne se facilite pas la tâche puisque le serveur de mail incluras un antispam avec vérifications des éventuels virus contenu dans les emails. L'antispam pourra aussi apprendre de ses erreurs lorsque l'utilisateur final déplacera simplement ses emails dans les dossiers IMAP.

Bref, commençons par supprimer l'éventuel Exim 4 qui serait présent sur le serveur :

apt-get remove exim4 exim4-base exim4-config exim4-daemon-light

Puis on installe tous les paquets d'un coup :

apt-get install mysql-server postfix postfix-mysql dovecot-imapd dovecot-pop3d dspam dspam-doc libdspam7-drv-mysql bzip2 clamav-daemon make

Durant l'installation, Postfix demande le type de configuration, qui sera naturellement "Sites Internet". Puis le nom du serveur ; entrez simplement le nom de domaine principal de votre serveur comme domain.tld.

Puis libdspam7-drv-mysql (le driver de stockage des informations de DSpam sur MySQL) vous demandera s'il faut créer la base de données. Répondez simplement oui. Le mot de passe MySQL root est demandé ensuite. Enfin, un mot de passe pour cette base de donnée est demandé. Laissez simplement le champ vide pour qu'il en choisisse un pour vous.

Commençons par créer les tables contenant les informations des emails et alias des sites web avec le fichier de création. Ces tables sont naturellement dans la même base de donnée que powerdns, puisqu'un email devra forcément être rattaché à un nom de domaine géré par le serveur DNS.

mysql -h localhost -u root --password=MySQL serverconf < /PATH/TO/postfix.sql

Postfix a besoin de savoir comment s'adresser à MySQL pour vérifier les mots de passe ou trouver les alias. Ces fichiers seront créé dans /etc/postfix/mysql :

mkdir  /etc/postfix/mysql

Puis on créé les fichiers :
/etc/postfix/mysql/email2email.cf est utilisé pour connaître les adresse email existantes :

hosts = 127.0.0.1
dbname = serverconf
user = serverconfuser
password = serverconfpass
query = SELECT CONCAT(user.user, '@', domain.name) AS email FROM domain,user WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%s'

/etc/postfix/mysql/virtual-alias-maps.cf est utilisé pour connaître les alias (les redirection d'emails) :

hosts = 127.0.0.1
dbname = serverconf
user = serverconfuser
password = serverconfpass
query = SELECT destination FROM alias, domain WHERE alias.domain_id=domain.id AND CONCAT(alias.source, '@', domain.name)='%s'

/etc/postfix/mysql/virtual-mailbox-domains.cf est utilisé pour connaître les domaines gérés :

hosts = 127.0.0.1
dbname = serverconf
user = serverconfuser
password = serverconfpass
query = SELECT 1 FROM domain WHERE name='%s'

Enfin /etc/postfix/mysql/virtual-mailbox-maps.cf est utilisé pour vérifier si une adresse email est bien géré par le serveur :

hosts = 127.0.0.1
dbname = serverconf
user = serverconfuser
password = serverconfpass
query = SELECT 1 FROM user,domain WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%s'


Enfin, il faut paramétrer postfix pour réagir sur différents ports dans le fichier /etc/postfix/master.cf :
Supprimer la ligne commençant par smtp et remplacer là par :

smtp inet       n       -       -       -       -       smtpd -o content_filter=lmtp:unix:/var/spool/postfix/var/run/dspam.sock
smtps inet      n       -       -       -       -       smtpd -o smtpd_tls_wrappermode=yes -o content_filter=lmtp:unix:/var/spool/postfix/var/run/dspam.sock

Afin que les courriers arrivant par smtp ou smtps soit filtrer par l'antispam.

Remplacer la ligne commençant par ltmp par

lmtp      unix  -       -       n       -       -       lmtp

Pour qu'il ne soit pas chrooté.

Enfin ajouter :

127.0.0.1:10026 inet    n       -       -       -       -       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=127.0.0.0/8
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8

dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Le port 10026 est ici ouvert uniquement en local pour permettre à DSpam de renvoyer les emails non vérolés. Enfin la ligne avec dovecot permet d'utiliser ce dernier pour remettre l'email à l'utilisateur.

Tous nos emails vont être crée par un même utilisateur serveur, nommé vmail. Il faut donc le créer :

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/var/vmail -m
rm -rf /home/var/vmail/* /home/var/vmail/.*

Passons à la configuration de postfix :

postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql/virtual-mailbox-domains.cf
postconf -e virtual_uid_maps=static:5000
postconf -e virtual_gid_maps=static:5000
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql/virtual-mailbox-maps.cf
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql/virtual-alias-maps.cf,mysql:/etc/postfix/mysql/email2email.cf
postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1
postconf -e smtpd_sasl_type=dovecot
postconf -e smtpd_sasl_path=private/auth
postconf -e smtpd_sasl_auth_enable=yes
postconf -e smtpd_use_tls=yes
postconf -e broken_sasl_auth_clients=yes
postconf -e mydestination=localhost
postconf -e smtpd_tls_auth_only=yes
postconf -e maximal_queue_lifetime=3d
postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject_unauth_destination

Avec smtpd_use_tls, seules les connexions sécurisés seront autorisé pour smtp. La dernière ligne est sans doute la plus important et la plus difficile à comprendre.
Elle permet de définir qui a le droit d'envoyer des emails. Paramètre très important pour que son serveur ne soit pas utilisable comme open relay et utilisé par les spammeurs...
On autorise les envoies du réseau (donc le serveur lui même), vers les adresses locales existantes (indispensable pour que les FAI puissent vous envoyer des emails par exemple), avec une connexion authentifié (donc les utilisateurs de votre serveur qui ont une adresse email sur votre serveur), et on rejette le reste.

Un petit peu d'autorisations sur ces fichiers est nécessaire pour vmail :

chgrp postfix /etc/postfix/mysql/*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql/*.cf


Comme indiqué en haut de page, les utilsateurs vont pouvoir entrainé DSpam par de simples déplacement de mails en IMAP. Dovecot ne permet pas de mettre en place ceci directement, mais ce plugin le permet. Télécharger le à cette adresse et envoyer le sur votre serveur (vous avez un serveur FTP maintenant, non ?) et placer le dans /usr/src. Puis dégzippage :

cd /usr/src
gzip -d dovecot-antispam-HEAD.tar.gz
tar xvf dovecot-antispam-HEAD.tar
cd dovecot-antispam

Pour pouvoir compiler, ce plugin a besoin des sources de dovecot :

apt-get source dovecot
tar xfv dovecot_1.0.15.orig.tar.gz


Puis on paramètre ce plugin :

cp defconfig .config

Et on édite .config

BACKEND=dspam-exec
DOVECOT=./dovecot-1.0.15

Le backend spécifie de quelle façon le plugin va réapprendre à DSpam les emails déplacés. Après quelques tests, l'appel direct à DSpam s'est avéré le plus efficace. On peut donc compiler :

make install

Le fichier /usr/lib/dovecot/modules/imap/lib90_antispam_plugin.so devrait être créé.

Et on peut passer à la configuration de dovecot dans /etc/dovecot/dovecot.conf :

protocols = imap imaps pop3 pop3s managesieve
mail_location = maildir:/home/var/vmail/%d/%n/Maildir:INBOX=/home/var/vmail/%d/%n/Maildir/:INDEX=/home/var/vmail/%d/%n/Maildir/tmp/index

Dans la partie protocol imap :

  mail_plugins = antispam
  imap_client_workarounds = outlook-idle delay-newmail

Dans la partie protocol pop3 :

  pop3_client_workarounds = outlook-no-nuls

Dans la partie protocol lda :

   postmaster_address = postmaster@domain.tld
   auth_socket_path = /var/run/dovecot/auth-master
   mail_plugins = cmusieve
   log_path = /home/var/log/dovecot-deliver.log
   global_script_path = /home/var/vmail/globalsieverc

Dans la partie auth default :

 mechanisms = plain login
 # Commenter la partie passdb pam
 # Décommenter la partie passdb sql avec comme paramètres :
    args = /etc/dovecot/dovecot-sql.conf
 Dans la partie userdb static :
    args = uid=5000 gid=5000 home=/home/var/vmail/%d/%n allow_all_users=yes
 Dans la partie socket listen :
    master {
        path = /var/run/dovecot/auth-master
        mode = 0600
        user = vmail
    }
    client {
        path = /var/spool/postfix/private/auth
        mode = 0660
        user = postfix
        group = postfix
    }


Dans la partie plugin, nous allons paramètrer le plugin précédemment compilé :

  ##################################
  # Antispam plugin

  # mail signature (used with any backend requiring a signature)
  antispam_signature = X-DSPAM-Signature

  # semicolon-separated list of Trash folders (default unset i.e. none)
  # antispam_trash =
  antispam_trash = trash;Trash;Deleted Items;&AMk-l&AOk-ments supprim&AOk-s

  # semicolon-separated list of spam folders
  antispam_spam = Spam;spam;Junk;junk;Courrier ind&AOk-sirable

  # semicolon-separated list of unsure folders (default unset i.e. none)
  # antispam_unsure =
  # Whether to allow APPENDing to SPAM folders or not. Must be set to
  # "yes" (case insensitive) to be activated. Before activating, please
  # read the discussion below.
  # antispam_allow_append_to_spam = no

  antispam_dspam_binary = /usr/bin/dspam
  antispam_dspam_args = --user;root;--source=error

Le protocole managesieve permettra à l'utilsateur de créer des filtres côtés serveur, pour par exemple pour créer une réponse automatique.

Il faut créer le fichier de log :

touch /home/var/log/dovecot-deliver.log
chmod 777 /home/var/log/dovecot-deliver.log

Et comme ce fichier de log va grossir, nous devons paramétrer la rotation de ce fichier de log an ajoutant le fichier /etc/logrotate.d/dovecot :

/var/log/dovecot*log {
       weekly
       missingok
       rotate 4
       compress
       delaycompress
       notifempty
       create 777 root adm
}

Donner les droits à vmail sur la config de dovecot :

chown vmail:vmail /etc/dovecot/dovecot.conf
chmod g+r /etc/dovecot/dovecot.conf

Enfin, il faut paramétrer dovecot pour se connecter à MySQL et vérifier les mot de passes dans /etc/dovecot/dovecot-sql.conf :

driver = mysql
connect = host=127.0.0.1 dbname=serverconf user=serverconfuser password=serverconfpass
default_pass_scheme = PLAIN-MD5
password_query = SELECT CONCAT(user.user, '@', domain.name) AS user,user.password FROM user,domain WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%u'

Comme le serveur utilise des protocoles sécurisés, nous devons créés des certificats :

openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem -keyout /etc/ssl/private/dovecot.pem
# Country Name (2 letter code) [AU]:                        FR
# State or Province Name (full name) [Some-State]:            France
# Locality Name (eg, city) []:                            Besancon
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:        Company Name
# Organizational Unit Name (eg, section) []:                    .
# Common Name (eg, YOUR name) []:                            domain.tld
# Email Address []:                                    certs@domain.tld
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.pem

Et de donner les droits nécessaires :

chmod o= /etc/ssl/private/dovecot.pem
chmod o= /etc/ssl/private/postfix.pem

Pour enfin les utilisé dans postfix :

postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem
postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem

S'en est terminé avec postfix et dovecot, passons à l'antispam :
Il faut d'abord créer son dossier et donner les droits nécessaires dans le pool de postfix :

mkdir -p /var/spool/postfix/var/run/
chown dspam:dspam /var/spool/postfix/var/run/

Et le paramétrer dans /etc/dspam/dspam.conf :

StorageDriver /usr/lib/dspam/libmysql_drv.so
#TrustedDeliveryAgent "/usr/lib/dovecot/deliver -d %u"
DeliveryHost 127.0.0.1
DeliveryPort 10026
DeliveryIdent localhost
DeliveryProto SMTP
QuarantineAgent "/usr/lib/dovecot/deliver -d %u -m Spam"
Trust vmail
SupressWebStats on
Preference "spamAction=quarantine"
Preference "signatureLocation=headers"  # 'message' or 'headers'
#Preference "showFactors=on"
Opt out
TrackSources spam virus
ClamAVPort     3310
ClamAVHost     127.0.0.1
ClamAVResponse reject
ServerPID /var/run/dspam/dspam.pid
ServerMode auto
ServerPass.Relay1 "secret"
ServerParameters        "--deliver=innocent -d %u"
ServerIdent "localhost.localdomain"
ServerDomainSocketPath "/var/spool/postfix/var/run/dspam.sock"
ClientHost /var/spool/postfix/var/run/dspam.sock
ClientIdent "secret@Relay1"

Lorsque des spams seront détectés, ils seront directement envoyer dans le dossier Spam de l'utilsataeur. Si un virus est détecté, on rejette l'email.

Dans /etc/dspam/dspam.d/mysql.conf :

MySQLUIDInSignature    on
chown -R dspam:dspam /etc/dspam/*
echo "dspam:shared:*" > /var/spool/dspam/group

Dans /etc/default/dspam :

Start=yes

Enfin, nous devons autorisé DSpam à délivrer les messages directement via deliver de dovecot. Mais il doit avoir le bon userid lorsqu'il exécute ce programme. C'est pourquoi nous utilisons et setuid sur ce dernier :

chmod +s /usr/lib/dovecot/deliver

Il faudra réiterer cette commande à chaque mise à jour de dovecot.

Il ne reste plus qu'à configurer l'antivirus, ClamAv. très rapidement, on édite /etc/clamav/clamd.conf

#Comment localSocket and Add
TCPAddr 127.0.0.1
TCPSocket 3310

Enfin, on redémarre tous les services paramétrés :

/etc/init.d/clamav-daemon force-reload
/etc/init.d/dspam force-reload
/etc/init.d/dovecot force-reload
/etc/init.d/postfix force-reload

Notre serveur de mail complet est maintenant terminé. Ouf, c'était le plus gros point de notre serveur. Il est d'ailleurs maintenant tout à fait opérationnel, mais on va encore y ajouter quelques éléments pour la sécurité et le monitoring.

Retour au sommaire.

Chips, Twix and Mix

It was long time since I didn't make a post like this one. And it's also the first one in English. Basically, I just put some info and links without any orders. So it's possible that some of theme are old...

  • Android grows up pretty well. We can except the first real phone soon
  • Facebook Connect will allow to add a social dimension to your website
  • Firefox came out in version 3 RC1. The RC2 should come soon. If everything goes good, the finale version should come by the end of June
  • Google changed his favicon. Do you like it? I do
  • jQuery released 3 minor versions in a few time (1.2.6 at this time). They're working in the version 2 which is coming soon; a new version of the website will be done, a new logo and maybe the first final release of jQuery UI
  • TinyMCE did the same, to fix many bugs. Right now it's the version 3.0.8

And some personal news, no reasons:

  • The Lakers won yesterday the West Conference, it's official. First of the season, First of the playoffs, and the MVP for Kobe Bryant. They only have to win against the Celtics from Boston and they'll get everything this year
  • My internship by Fluidesign ends in more than 1 month
  • NyroModal was downloaded more than 2'000 times, the homepage was saw by more than 20'000 uniq visitors! A post is in preparation about that
  • After some problems in the server of Amenothès, I decided to but my own dedicated server when I'll come back in France. If somebody has some good URLs or infos about the installation or configuration of Postfix, SpamAssassin, ClamAV or anything else which could be useful, don't hesitate to write a comment! I'll take a debian to play as I want with it

Version française de ce billet