nyroBlog
Ban NyroBlog, by Nyro
Image by Nyro - ?

Serveur DNS : PowerDNS (Serveur Web sur Debian Lenny)

UPDATE : voir la version à jour pour Debian Squeeze.

 

J'ai choisi PowerDNS plutôt que Bind parce que sa configuration peut se faire de différentes façons. J'ai choisi d'utiliser MySQL. On désinstalle donc bind avant d'installer PowerDNS :

apt-get remove bind9
apt-get install pdns-server pdns-backend-mysql pdns-recursor

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.

Configurons d'abord le serveur DNS dans /etc/powerdns/pdns.conf :

allow-axfr-ips=217.70.177.40
allow-recursion=127.0.0.1
disable-axfr=no
cache-ttl=300
launch=gmysql
logging-facility=0
out-of-zone-additional-processing=yes
query-cache-ttl=300
recursive-cache-ttl=150
recursor=127.0.0.1:54

Les paramètres avec axfr sont utilisé pour autoriser les transfert de zones vers l'IP 217.70.177.40, qui n'est autre que ns6.gandi.net, le DNS secondaire des domaines que j'utilise. De cette façon, lorsque je fait une mise à jour de mes DNS sur mon serveur, Gandi vérifie régulièrement la version de mon paramètrage et met à jour ses DNS si besoin.
On paramètre bien sûr du cache pour ne pas rappeler tout le temps les mêmes requêtes MySQL. On sélectionne le backend mysql avec le paramètre launch, active les log en précisant le logging-facility à 0 (cf plus bas) et en indiquant l'adresse du recursor. Recursor que l'on configure tout de suite dans /etc/powerdns/recursor.conf :

allow-from=127.0.0.1
local-address=127.0.0.1
local-port=54
logging-facility=1

On le lance sur le port 54, en n'autorisant les requêtes que locales et en logant les fichiers via logging-facility 1.

Mais qu'est ce que ces logging-facility ? Il s'agit en fait d'utiliser le démon rsyslog fourni avec Debian pour loggé les fichiers. Les logs seront en fait crée sous le nom localN, où N est le numéro que nous avons indiqués. Il faut donc paramétrer rsyslog pour gérer ces fichiers :

echo "local0.*  /var/log/pdns.log" > /etc/rsyslog.d/pdns.conf
echo "local1.*  /var/log/pdns-recursor.log" >> /etc/rsyslog.d/pdns.conf

Dans le même temps, paramétrons ces log pour ne pas qu'ils fassent une taille énorme via le proccessus des logrotate. Pour ce fait, ajouter simplement dans /etc/logrotate.d/rsyslog les lignes suivantes, juste après /var/log/messages

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

On recharge rsyslog pour être tranquille avec les logs :

/etc/init.d/rsyslog force-reload

Mais maintenant, il reste encore à paramétrer le backend MySQL pour exécuter les requêtes correctes sur le serveur. Et pour faire ça, il faut qu'une base de données soit prête pour contenir toutes les informations nécessaires. Appelons (et créons) cette base serverconf :

mysqladmin -p create serverconf

Comme le schéma de la base est assez simple, je ne vais pas le décrire ici. Vous pouvez simplement télécharger le fichier de création.
Ce fichier créé aussi l'utilisateur associé et son mot de passe. A vous de modifier... Exécutons simplement ce script :

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

Enfin, éditons le fichier /etc/powerdns/pdns.d/pdns.local pour paramétrer la connexion et toutes les requêtes du serveur DNS :

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

Et on finit par recharger les deux démons :

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


Prêt pour passer au plus gros, le serveur de mail ?

Retour au sommaire.

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

UPDATE : voir la version à jour pour Debian Squeeze.

 

On installe le serveur :

apt-get 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. Pour ce faire, on édite le fichier /etc/mysql/my.cnf pour y ajouter dans la section [mysqld] :

innodb_file_per_table=1


On déplace les fichiers de la base de données sur /home 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.

Serveur FTP : vsftpd (Serveur Web sur Debian Lenny)

UPDATE : voir la version à jour pour Debian Squeeze.

 

On installe le paquet simplement :

apt-get install vsftpd


Puis on modifier le fichier de configuration /etc/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
force_dot_files=YES

De cette façon, chaque utilisateur de notre serveur (un utilisateur étant associé à un site) pourra se connecter par FTP et n'avoir accès qu'à son répertoire.

On recharge la configuration :

/etc/init.d/vsftpd force-reload


Et on passe au serveur de base de données, MySQL.

Retour au sommaire.

Apache et PHP (Serveur Web sur Debian Lenny)

UPDATE : voir la version à jour pour Debian Squeeze.

 

Et c'est là qu'on découvre les joies de Debian :

apt-get install apache2 apache2-dev libapache2-mod-gnutls php5 php5-mysql php5-dev php-pear php5-gd php5-mcrypt

Nous installes tout le nécessaire pour apache avec PHP5.

Un peu ce paramétrage s'impose quand même : dans le fichier /etc/apache2/mods-available/userdir.conf, remplacer public_html par www.
En effet, sur notre serveur, chaque site aura un utilisateur associé avec un dossier www où les fichiers web seront déposés.

Activons quelques modules Apache :

a2enmod userdir
a2enmod rewrite
a2enmod gnutls
a2enmod expires


J'ai décider d'utiliser gnutls plutôt que ssl car il permet de définir un certificat SSL par domaine. Malheureusement, ça marche qu'à partir de IE7 sur Windows Vista. Pour les autres navigateurs, pas de problèmes sur les autres systèmes d'exploitation.

D'ailleurs Apache doit écouter sur le port 443 (https) pour que gnutls puisse entrer en jeu. On modifie le fichier /etc/apache2/ports.conf pour y ajouter :

NameVirtualHost *:443
Listen 443

(Attention, pas dans la section puisque nous n'utilisons pas ce module)

Puis paramétrons le temps de cache des certifications, dans le fichier /etc/apache2/mods-available/gnutls.conf on ajoute :

GnuTLSCacheTimeout 300


La configuration debian d'apache donne beaucoup d'informations sur le serveur. On enlève tout ça dans le fichier /etc/apache2/conf.d/security :

ServerTokens Prod
ServerSignature Off
TraceEnable Off


De la même façon, la configuration de base pour les optimisations concernant le cache utilisateur des fichiers n'est pas optimales. Pour l'améliorer, on ajoute le fichier /etc/apache2/conf.d/optimisations :

ExpiresActive On
ExpiresDefault "access plus 31 days"
FileETag none


Toujours dans l'idée de mettre un maximum de fichier dans /home, déplaçons le dossier /var/www :

mv /var/www/ /home/var/
ln -s /home/var/www/ /var/www


Enfin, Apache arrive avec un fichier html de base affichant simplement "It works". Plutôt que cela, je préfère définir un fichier php qui
redirige sur mon nom de domaine principale :

echo " /home/var/www/index.php
echo "header('location: http://domain.tld');" >> /home/var/www/index.php
rm /home/var/www/index.html


On a finit de jouer avec Apache, on recharge la configuration pour appliquer les changements :

/etc/init.d/apache2 force-reload


Passons à la suite, le serveur FTP.

Retour au sommaire.

Préparation (Serveur Web sur Debian Lenny)

UPDATE : voir la version à jour pour Debian Squeeze.

 

Ce premier billet va permettre de mettre en place notre espace de travail.

Sur debian, il existe vi et vim. Vim est beaucoup plus simple d'utilisation selon moi. Afin de pas s'embêter à taper toujours son nom complet, nous allons ajouter un alias de commande pour celui-ci. Profitons-en aussi pour ajouter d'autres alias utiles dans /root/.bashrc :

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'

Toutes les lignes sauf la dernière devrait déjà exister, mais commenter. Elles permettent juste d'avoir de jolis listing de fichiers.

Lorsque vous vous connaitrez pour la première fois à votre serveur web, ce sera sûrement en root. Les administrateurs n'aiment pas ça. Ca m'est un peu égal, mais j'ai quand même décidé de créer un nouvel utilisateur (toto) qui n'est en fait ni plus ni moins qu'un alias de root, puis de n'autoriser que lui.

echo "toto::0:0:root:/root:/bin/bash" >>
/etc/passwd echo "toto:*:14293:0:99999:7:::"
>> /etc/shadow passwd toto
shadowconfig on


Pas très commode pour ajouter un utilisateur, je vous l'accorde, mais de cette façon, aucun répertoire de créé, et l'utilisateur toto est tout de suite un alias de root.

Puis nous allons n'autoriser que ce nouvel utilisateur toto à se connecter en SSH sur notre serveur :

echo "" >> /etc/ssh/sshd_config
echo "AllowUsers toto" >> /etc/ssh/sshd_config


Et on redémarre SSH :

/etc/init.d/ssh force-reload


Si vous êtes sûr de ce que vous avez fait, vous pouvez vous déconnecter et vous reconnecter, avec toto cette fois-ci.

Sur Debian, les mises à jour sont automatisés par le système APT. Il suffit de renseigner les URLs où il doit récupérer les paquets. Il s'agit du fichier /etc/apt/sources.list. Il faut généralement y ajouté les backport, les volatile et les mises à jour de sécurité. Il peut ressembler à :

deb http://mir1.ovh.net/debian/ lenny main contrib non-free
deb-src http://mir1.ovh.net/debian/ lenny main contrib non-free

deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free

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

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


Pour pouvoir utiliser le backport, il faut la clé GPG du dépôt. Pour ce faire, il suffit d'installer debian-backports-keyring avec la commande :

apt-get install debian-backports-keyring


Comme on est sur Debian, commençons par une mise à jour de notre système, ça ne fera pas de mal :

apt-get update
apt-get dist-upgrade


Enfin, le serveur fourni par ovh est partitionné avec le / de 5 Go, et le reste sur le /home. Pour éviter tout problème dû à un grand nombre de fichiers, beaucoup de fichiers du serveur seront, dans notre installation, déposé dans /home/var. Commençons par y mettre les logs :

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

Remarquez que l'on garde évidemment un lien symbolique pour ne pas avoir à modifier tous les fichiers de configuration...

S'en est fini pour la préparation du terrain, passons au serveur web.

Retour au sommaire.