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

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.

Serveur DNS : PowerDNS (Serveur Web sur Debian Squeeze)

Le choix de PowerDNS par rapport à Bind est simple : ave PowerDNS, on peut configurer l'ensemble des informations dans une base données, MySQL dans mon cas.

Donc on commencer par stopper et désinstaller bind, qui peut être là :

/etc/init.d/bind9 stop
aptitude purge bind9

Et on install PowerDNS :

aptitude install pdns-server pdns-backend-mysql pdns-recursor libnet-dns-perl

PowerDNS est découpé de deux façon différentes et indépendantes : le serveur qui permet de définir vos zones (vos sites, sous-domaines, etc...) et le recursor qui permet d'effectuer des requêtes DNS vers l'extérieur.

Commençons par la configuration du serveur DNS dans /etc/powerdns/pdns.conf :

allow-axfr-ips=217.70.177.40 217.70.177.53 213.186.33.199
cache-ttl=300
disable-axfr=no
launch=gmysql
local-address=

local-ipv6=::0
do-ipv6-additional-processing=yes

logging-facility=0
loglevel=4
query-cache-ttl=300
recursive-cache-ttl=150
recursor=127.0.0.1:54

L'AXFR est le protocole qui permet a un éventuel secondaire de recopier les zones que vosu avez condifuré sur votre serveur. Dans l'exemple, je les autorise depuis les adresses IP des serveurs de gandi et OVH. On paramètre tout ce qu'il faut pour que le serveur puisse répondre en IPv6. Enfin, on log grâce au syslog N° 0, configuré plus bas.

Puis, passons au recurseur qui est plus simple, dans le fichier /etc/powerdns/recursor.conf

allow-from=127.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, ::1/128, fe80::/10
local-port=54
log-common-errors=yes
logging-facility=1
#quiet=yes

On autorise son utilise uniquement pour des adresses locales (donc le serveur lui même) sur le port 54. On log ses éléments grâce au syslog N° 1.

Pour configurer les logs correctement via syslog, editez le fichier /etc/rsyslog.d/pdns.conf pour y mettre : 

local0.* /home/var/log/pdns.log
local1.* /home/var/log/pdns-recursor.log

Et comme pour le PHP-FPM précédement, on ne veut pas gardé ces logs indéfiniments.

Donc on ajoute dans le fichier /etc/logrotate.d/rsyslog en dessous de /var/log/php-suhosin.log :

/var/log/pdns.log
/var/log/pdns-recursor.log

 

PowerDNS est maintenant configuré. Mais il n'au aucune entrée DNS. Pire encore, la base de données de configurations n'existe pas encore.

Commençons par créer la base de données de configuration, nommé serverconf :

mysqladmin -p create serverconf

Puis nous allons créer les tables de cette base, grâche au fichier SQL de création que voici. Vous avez un accès SFTP : utilisez-le pour transférer ce fichier ! Pensez à modifier le mot de passe et le nom d'utilisateur avant de l'exécuter. D'ailleurs, pour l'exécuter en ligne de commande :

mysql -h localhost -u root --password=MOT_DE_PASSE_ROOT_MYSQL serverconf < /path/to/serverconf.sql

Et maintenant, il faut configurer PowerDNS pour utiliser notre structure de base de données correctement. Dans le fichier /etc/powerdns/pdns.d/pdns.local :

gmysql-socket=/var/run/mysqld/mysqld.sock
gmysql-dbname=serverconf
gmysql-user=serverconfuser
gmysql-password=serverconfpass

gmysql-basic-query=select content,ttl,prio,type,domain_id,name from record where type='%s' and name='%s'
gmysql-id-query=select content,ttl,prio,type,domain_id,name from record where type='%s' and name='%s' and domain_id=%d
gmysql-any-query=select content,ttl,prio,type,domain_id,name from record where name='%s'
gmysql-any-id-query=select content,ttl,prio,type,domain_id,name from record where name='%s' and domain_id=%d
gmysql-list-query=select content,ttl,prio,type,domain_id,name from record where domain_id=%d
gmysql-master-zone-query=select master from domainDNS where name='%s' and type='SLAVE'
gmysql-info-zone-query=select domain_id AS id,name,master,last_check,notified_serial,type from domainDNS where name='%s'
gmysql-info-all-slaves-query=select domain_id AS id,name,master,last_check,type from domainDNS where type='SLAVE'
gmysql-supermaster-query=select account from supermaster where ip='%s' and nameserver='%s'
gmysql-insert-slave-query=insert into domainDNS (type,name,master,account) values('SLAVE','%s','%s','%s')
gmysql-insert-record-query=insert into record (content,ttl,prio,type,domain_id,name) values ('%s',%d,%d,'%s',%d,'%s')
gmysql-update-serial-query=update domainDNS set notified_serial=%d where id=%d
gmysql-update-lastcheck-query=update domainDNS set notified_serial=%d where id=%d
gmysql-info-all-master-query=select domain_id,name,master,last_check,notified_serial,type from domainDNS where type='MASTER'
gmysql-delete-zone-query=delete from record where domain_id=%d
gmysql-wildcard-query=select content,ttl,prio,type,domain_id,name from record where type='%s' and name like '%s'
gmysql-wildcard-id-query=select content,ttl,prio,type,domain_id,name from record where type='%s' and name like '%s' and domain_id=%d
gmysql-wildcard-any-query=select content,ttl,prio,type,domain_id,name from record where name like '%s'
gmysql-wildcard-any-id-query=select content,ttl,prio,type,domain_id,name from record where name like '%s' and domain_id=%d

Remplacer bien sûr les première ligne par ce que vous aurez utiliser précédement.


Tout est prêt et bien configuré. On redémarre les démons modifiés :

/etc/init.d/rsyslog force-reload
/etc/init.d/pdns-recursor force-reload
/etc/init.d/pdns force-reload

 

Le serveur PowerDNS n'inclue pas à ma connaissance un outil permettant de notifier automatiquement un DNS secondaire d'un changement de zone. Pour palier à cela, j'ai trouver une script perl qui permet d'envoyer cette notification manuellement en ligne de commande. Vous trouverez ce script sur github. Avec la ligne d'installation plus haut, vous devrez avoir tout en place pour l'utiliser.

 

Et on passe à la suite : Le serveur de mail.


Retour au sommaire du tutorial complet.


Base de données : MySQL (Serveur Web sur Debian Squeeze)

Cette partie n'a pas évolué depuis Lenny. C'est exactement la même procédure.

On installe le serveur :

aptitude install mysql-server

Durant l'installation, il vous sera demandé le mot de passe de l'utilisateur MySQL root.

MySQL vient avec une commande sympathique qui permet de sécurisé le serveur :

mysql_secure_installation
# Current password : VOTRE_MOT_PASSE
# set new password : N
# remove anonymous Users : Y
# Disallow root login remotley : Y
# remove test database and access to it : Y
# reload privileges table now : Y

Si vous utilisez InnoDB comme moteur de stockage de vos tables, l'ensemble des données de chaque table est stockée dans un seul et même fichier pour toutes les tables InnoDB de toutes les bases de données. Cela peut vous embetter, et dans certains cas, causer des lenteurs du serveur. Il est possible de paramétrer MySQL pour créer un fichier de stockage par table. Nous allons aussi optimiser un chouilla la taille des caches. Pour ce faire, on édite le fichier /etc/mysql/my.cnf pour y ajouter dans la section [mysqld] :

innodb_file_per_table=1
innodb_buffer_pool_size=64M
tmp_table_size=32M
table_cache=128


On déplace les fichiers de la base de données dans /home/var en prenant soin d'arrêter le serveur avant : 

/etc/init.d/mysql stop
mv /var/lib/mysql /home/var/
ln -s /home/var/mysql/ /var/lib/mysql
chown mysql:mysql /home/var/mysql
/etc/init.d/mysql start

 

Nous voilà prêt pour installer le serveur DNS.

 

Retour au sommaire du tutorial complet.

Serveur Web : Nginx et PHP (Serveur Web sur Debian Squeeze)

Avant de commencer l'instalaltion de Nginx et PHP, quelques petits éléments.

J'ai décidé d'utiliser Nginx plutôt qu'Apache car il est beaucoup plus rapide et supporte des montées en charge beaucoup plus importantes qu'Apache.

Pour utiliser PHP avec Apache, il suffisait d'installer un module apache et tout fonctionnait directement. Avec Nginx, nous sommes obligés d'utiliser FastCGI Process Manager qui est plus ou moins un démon PHP qui va tourner sur le serveur et répondre à Nginx lorsqu'il le demandera. Plus de détails dans les configurations.

 

Pour installer PHP et pas mal d'extenstions à PHP (vous pouvez en supprimer si vous le souhaitez), une seule ligne de commande :

aptitude install nginx-extras php5-cgi php5-fpm php5 php5-mysql php5-dev php-pear php5-cli php5-gd php5-mcrypt php5-imap php5-curl php5-apc php5-fpm

php5-cli : Utilisation de php en ligne de commande (utile pour les tâche CRON)

php5-gd : Manipulation d'images en PHP

php5-imap : Connexion en Imap à un serveur de web en PHP

php5-curl : Utilisation de CURL en PHP (utile pour beaucoup d'API)

php5-apc : Mise en cache de l'OP code de PHP poru accélérer son fonctionnement (utilsiation totalement transparente)

php5-fpm : Pour obtenir le script init.d qui permettra de gérer php-fpm. Le démon est maintenant inclus directement dans PHP.

 

Lorsque tout est installé, commencons par configurer Nginx. Dans le fichier /etc/nginx/nginx.conf, dans la zone events :

worker_connections 1024;
multi_accept on;
use epoll;

Détails sur la configuration.

Puis dans la zone http :

tcp_nopush off;
server_tokens off;
client_max_body_size 30M;
client_body_buffer_size 128k;
expires 31d;

index index.php index.htm index.html;

Détails sur la confgiration.

Puis nous allons éditer les paramètres par défaut utiliser lors du passage au PHP-FPM. Dans le fichier /etc/nginx/fastcgi_params, ajoutez :

fastcgi_index index.php;
fastcgi_split_path_info ˆ((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;

La dernière ligne indique le chemin du socket par lequel on va passer, que nous allons configurer un peu plus loin.

Editons le site par défaut /etc/nginx/sites-available/default de nginx pour y ajouter quelques éléments :

listen 80; ## listen for ipv4; this line is default and implied
listen [::]:80 default ipv6only=on; ## listen for ipv6

#comment index line

server_name localhost ks389877.kimsufi.com;
location = /nginx_status {
expires off;
stub_status on;
access_log off;
error_log off;
allow 176.31.102.83;
allow 127.0.0.1;
deny all;
}
location = /php_status {
expires off;
include fastcgi_params;
access_log off;
error_log off;
allow 127.0.0.1;
deny all;
}
location = /apc_info.php {
expires off;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /home/var/www/apc_info.php;
access_log off;
error_log off;
allow 127.0.0.1;
deny all;
}

location ~ \.php$ {
expires off;
include fastcgi_params;
}

les loctions nginx_status, php_status et apc_info.php seront utilisé plus tard pour le monitoring du serveur.

Pour la dernière section, on active le PHP. Ce ne sera pas plus compliqué que ça pour activer le PHP pour un autre site.

Enfin, pour être sûr que le site par défaut soit bien chargé en premier, exécutez :

rm /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/000-default

 

Voilà pour ce qui est du Nginx. Passons maintenant à la configuration du PHP.

D'abord la configuration de base du FPM pour autoriser l'envoi de fichier jusqu'à 15 Mégas dans le fichier /etc/php5/fpm/php.ini :

post_max_size = 30M
upload_max_filesize = 15M

Puis configurons le FPM pour correspondre un peu plus à nos attentes dans le fichier /etc/php5/fpm/pool.d/www.conf :

listen = /var/run/php5-fpm.sock
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.status_path = /php_status

La dernière ligne permet de répondre à la configuration que nous avons faites dans Nginx pour connaître le nombre de process du PHP-Fpm par exemple.

Puis, nous avons installé un accélérateur de code PHP. La configuration par défaut n'est pas très satisfaisante et arrive très vite a des limitations. Modifié le fichier /etc/php5/fpm/conf.d/apc.ini pour y mettre :

[apc]
apc.shm_size=256M
; workaround for CLI
apc.enable_cli=1
; Symfony make lot of path lookups, try to optimize
apc.include_once_override=1
apc.canonicalize=1

Tous les détails de cette configuration.

Dans Squeeze, PHP est installé directement avec suhosin. Cette une extension qui rajoute une couche de sécuirté dans pas mal d'éléments du PHP. Pour ma part, je n'avais pas vraiment envie de corriger tous les sites installé sur ce serveur. J'ai donc modifié la configuration de suhosin pour loggé ses erreurs (afin de les comprendre et les corriger), mais aussi d'augmenter les limites qu'il met en place et de supprimer quelques sécurités. Dans le fichier /etc/php5/conf.d/suhosin.ini :

[suhosin]
suhosin.log.syslog.facility = LOG_LOCAL2

suhosin.executor.include.whitelist="phar"

suhosin.memory_limit = 4G

suhosin.post.max_value_length = 1280000
suhosin.request.max_value_length = 1280000

suhosin.session.encrypt = Off
suhosin.cookie.encrypt = Off

Tous les détails de cette configuration.

la première ligne de cette configuration utilise rsyslog, avec le numéro 2. Il faut donc créer le configuration correspondante dans le fichier /etc/rsyslog.d/php-suhosin.conf :

local2.*  /home/var/log/php-suhosin.log

Et comme on ne veut pas gardé ad vitam eternam ces logs, on ajoute dans le fichier /etc/logrotate.d/rsyslog juste en dessous de /var/log/messages :

/var/log/php-suhosin.log

 

Pour finir, on déplace le dossier www dans notre /home/var, on redémarre les démons dont la configuration a été modifié et notre serveur web est prêt !

mkdir /home/var/www/
ln -s /home/var/www/ /var/www
/etc/init.d/rsyslog restart
/etc/init.d/php5-fpm restart
/etc/init.d/nginx force-reload

 

La suite : Base de données MySQL.

Retour au sommaire du tutorial complet.

Préparation et accès SFTP (Serveur Web sur Debian Squeeze)

La première étape lors de la réception d'un serveur dédié et de bien préparer le terrain pour configurer l'espace de travail dont nous avons besoin.

Pour l'édition de fichiers, j'utilise vi. Il existe une variante un peu plus ergonimique et avec plus d'options, nommé vim.

Je commence par l'installer :

aptitude install vim vim-common

Puis j'éditer la configuration de base pour y ajouter la colorisation syntaxique et l'affichage du nombre de ligne.

En modifiant le fichier /etc/vim/vimrc :

syntax on # décommenter
set number # ajouter la ligne

Puis, on va aussi ajouter la colorisation lorsqu'on parcours les dossiers et fichier, c'est toujours plus agréable. On va aussi ajouter un alias sur la ligne de commande vi pour utiliser vim.

Editer le fichier /root/.bashrc pour décommenter les lignes suivantes et ajouter la dernière :

export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
alias vi='vim'

 

Lorsque vous vous connectez la première fois sur votre serveur, ce sera sûrement en root. Les administrateurs n'apprécient pas vraiment ça. Personnelement, je préfère garder mon accès root pour plus de liberté. Plutôt que de devoir utiliser sudo à tour de bras, je préfère créer un alias de l'utilisateur root, et n'autoriser que cet utilisateur à se connecter en SSH.

Editer le fichier /etc/passwd pour y ajouter la ligne :

toto::0:0:root:/root:/bin/bash

Puis exécuter les commandes :

passwd toto
shadowconfig on

La première vous demandera le mot de passe pour toto. La seconde améliore la sécurité des mots de passe sur votre serveur.

 

Puis, Nous allons autoriser uniquement cet utiliser à se connecter en SSH. Les autres utilisateurs appartenant au groupe www-data vont être forcé d'utiliser le sous-système SFTP.

Editer le fichier /etc/ssh/sshd_config pour y ajouter à la fin :

DenyUsers root
Match group www-data
ChrootDirectory %h
AllowTcpForwarding no
X11Forwarding no
ForceCommand internal-sftp

Chaque utilisateur du groupe www-data qui se connectera en SSH sera forcé d'utiliser le SFTP, et sera en plus Chrooté dans son répertoire personnel.

On redémarre le serveur SSH et nous voilà déjà avec un serveur SFTP opérationnel :

/etc/init.d/ssh force-reload

Si vous êtes sûr que tout fonctionne bien, vous pouvez vous déconnecter et vosu reconnecter avec toto.

 

La seconde partie importante de la prépaparation du serveur Debian consiste à mettre à jour les sources de fichiers APT.

Pour ce faire, il faut éditer le fichier /etc/apt/sources.list pour autoriser les sources contrib et non-free, y ajouter les backports. Nous y ajoutons aussi dotdeb qui permettra d'obtenir les dernières versions de PHP par exemple. Le fichier sources.list devrait donc ressembler à cela :

deb http://mirror.ovh.net/debian/ squeeze main contrib non-free
deb-src http://mirror.ovh.net/debian/ squeeze main contrib non-free

deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free

deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free
deb-src http://backports.debian.org/debian-backports squeeze-backports main contrib non-free

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Pour terminer l'installation des sources dotdeb, il faut exécuter :

wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add -
rm dotdeb.gpg

Nous voilà prêt pour notre première mise à jour du serveur. vous en aurez peut-être déjà !

aptitude update
aptitude full-upgrade

 

Sur le serveur dédié OVH que j'ai acheté, le / du serveur ne dispose que de 10G, alors que le /home a quant à lui 1.8T ! Plutôt que de stocker les logs sur le / et de craindre d'atteindre un jour cet hypotétique 10G de logs, je préfère les stockés dans /home/var/log. Réalisé simplement grâhce à un lien symbolique :

mkdir /home/var
mv /var/log /home/var
ln -s /home/var/log/ /var/log

 

Enfin, pour être compatible IPv6, il faut d'abord récupérer l'adresse IPv6 de votre serveur. Chez OVH, vous le trouverez dans le manager, sur le récapitualitf de votre dédié. Il s'agira sûrement d'une plage d'adresse IP, se terminant par exemple par /64. Nous allons pour noter serveur n'utiliser qu'une seule adresse IPv6. L'adresse IPv6 indiqué par OVH est 2001:41d0:8:1753::/64. J'ai décidé d'utilsier comme adresse IPv6 2001:41d0:8:1753::1. Pour que le serveur comprenne qu'il possède cette IP, il faut ajouter dans le fichier /etc/network/interfaces :

iface eth0 inet6 static
address 2001:41d0:8:1753::1
netmask 64

Puis redémarrer le service correspondant :

/etc/init.d/networking restart

 

Voilà, votre serveur est prêt pour la suite, le serveur Web.

 

Retour au sommaire du tutorial complet.