Installation d’un serveur web sous Debian

J’avais lors d’un précédent post, expliqué comment installer WordPress sur son serveur Web mais je n’avais pas expliqué comment installer ce serveur.

On partira donc du principe que l’on a besoin de mettre en place un serveur HTTP, un interpréteur PHP, un SGBD (Système de Gestion de Base de Données) et un serveur FTP. De plus pour le contrôler facilement à distance on utilisera le protocole SSH.

Tout d’abord le choix de la distribution. Ayant toujours utilisé des distributions basées sur Debian et Debian étant réputé pour sa stabilité, il m’a semblé évident de prendre cette distribution comme base. De plus les installations sont facilitées grâce à des dépôts bien remplis (pas toujours à jour, mais fournis).

Ainsi, après une installation standard de cette distribution, enfin, en tout cas sans gestionnaire de fenêtre vu que c’est pour un serveur, nous allons passer à la phase d’installation.

Les logiciels que j’ai choisis d’utiliser pour combler tous nos besoins sont :

  • Serveur HTTP : Apache
  • Serveur FTP : vsFTPd
  • Serveur SSH : openSSH
  • interpréteur PHP : PHP5
  • SGBD : MySQL

Nous allons commencer par installer openSSH afin de pouvoir administrer le serveur à distance par la suite à l’aide de la commande :

apt-get install ssh

Nous verrons les configurations à apporter à chaque logiciel par la suite. Installons maintenant le serveur Apache à l’aide de la commande :

apt-get install apache2

Puis PHP et son module pour apache en tapant :

apt-get install php5 libapache2-mod-php5

Pour MySQL, Debian se charge normalement tout seul de récupérer les paquets qui permettent les interactions avec PHP. Dans le cas contraire il faudra les rajouter en plus (paquet php5-mysql). On tapera donc :

apt-get install mysql-server

Un mot de passe root est demandé à ce moment là. Bien penser à en mettre un fort.

Nous allons enfin installer vsFTPd en tapant :

apt-get install vsftpd

Maintenant que tous les logiciels dont nous avons besoin sont installés, il va nous falloir les configurer. Toujours garder en tête cependant que les configurations sont la partie la plus personnelle de ce genre de mise en place car elles dépendent principalement de ce que l’on désire faire. Je ne détaillerais pas les configurations d’SSH car j’ai déjà mis un exemple détaillé dans ce post ci.

Commençons donc avec la configuration d’Apache. Un fichier de configuration extrêmement important est le fichier /etc/apache2/conf.d/security. C’est ce fichier qui déterminera le niveau de détail des messages d’erreur. Pour un serveur en production, afin d’éviter toute fuite d’information sensible en cas de faille, on mettra les lignes :

ServerTokens Prod
ServerSignature Off
TraceEnable Off

Pour un serveur de développement, le but étant d’obtenir un maximum d’informations, on mettra :

ServerTokens Full
ServerSignature On
TraceEnable Extended

La configuration de base d’Apache donne le dossier /var/www/ comme dossier du site principal. On peut héberger plusieurs sites sur un seul serveur en rajoutant des fichiers de configuration dans le dossier /etc/apache2/sites-available/ (De manière globale, tout fichier présent dans ce dossier est inclus dans le fichier de configuration au lancement d’Apache). Une configuration minimale de site possible est :

<VirtualHost <ADRESSE_DU_SERVEUR>:<PORT_DE_CONNEXION>>
ServerName <NOM_DU_SERVEUR>
ServerAdmin <ADRESSE_DU_WEBMASTER>

DocumentRoot <DOSSIER_DU_SITE>
<Directory <DOSSIER_DU_SITE>>
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

CustomLog <URI_DU_FICHIER_DE_LOG> combined
LogLevel warn
</VirtualHost>

Pour plus de détail on peut aller sur la documentation officielle d’Apache sans oublier les conseils sur la sécurité. On pourra, selon la distinction que l’on voudra faire entre les différents sites web (différentes adresses IP, différents ports de connexion), utiliser cette page de documentation ou celle ci pour choisir ses options.
Vous remarquerez le -Indexes qui permet de ne pas lister le contenu d’un dossier lorsque le fichier index.html ou index.php n’existe pas. Pour d’autres options de sécurités on peut aller voir par là.

Il ne reste alors plus qu’à activer le site nouvellement configuré à l’aide de la commande

a2ensite <NOM_DU_FICHIER_DE_CONFIGURATION>

et à redémarrer apache (nous ferons ceci à la fin).

En ce qui concerne PHP, je ne rentrerais pas dans les détails de la configuration car ils sont beaucoup trop dépendants de ce que l’on souhaite mettre en place. De plus, ceux de base conviendront la plupart du temps.

La configuration de MySQL étant plus une configuration par base de données que dans sa globalité, les paramètres originaux feront largement l’affaire. Cependant, il ne faudra pas oublier de créer un nouvel utilisateur pour chaque base afin d’améliorer la sécurité et de ne pas laisser traîner le mot de passe root quelque part. J’avais détaillé le script de création dans mon post sur la mise en place de mon blog.

Il nous reste enfin à configurer vsFTPd. Mon choix s’est porté sur ce logiciel plutôt que sur ProFTP, qui est le plus souvent cité lorsque l’on cherche un serveur FTP, car, notamment, il a été conçu en étant orienté sécurité. Le fichier de configuration est /etc/vsftpd.conf. Il est bien détaillé et facile à paramétrer. On peut choisir de chrooter les utilisateurs, utiliser le serveur en IPv4/IPv6, autoriser l’accès anonyme, etc … J’ai détaillé une des configuration que j’utilise sur l’un de mes serveurs dans ce post.

Il suffit ensuite soit de redémarrer la machine (le plus simple), soit de redémarrer tous les services, après configuration. On peut les relancer un par un à l’aide des commandes :

/etc/init.d/apache restart
/etc/init.d/ssh restart
/etc/init.d/vsftpd restart

On a alors un serveur HTTP/FTP/MySQL/SSH prêt à être utilisé.

Configuration de subversion et lancement automatique

Depuis quelques temps, j’ai pris l’habitude de gérer mes projets de développement à l’aide d’un gestionnaire de versions, en l’occurrence, subversion. Je n’ai encore jamais eu l’occasion de tester git donc ce choix est simplement basé sur mes préférences actuelles et elles peuvent être amenées à changer. J’utilise subversion car il est libre, facile à mettre en place, agréable à utiliser et surtout, je sais m’en servir.

On peut installer subversion assez simplement soit en passant par les dépôts de paquets des différentes distributions, soit en le compilant soit même (ayant eu besoin de la version 1.7.4 récemment et vu que la version disponible sous xubuntu était la 1.6.17, j’ai été amené à le faire sur mon poste client et cela se fait sans encombre) en installant préalablement ses dépendances (pour ma part zlib, apr et sqlite).

La première chose à faire lorsque subversion est installé est de créer le dépôt qui accueillera le projet. Pour ma part, j’ai créé un dossier /home/SVN dans lequel je créé chacun de mes dépôts à l’aide de la commande :

svnadmin create <nom_du_depot>

Nous allons maintenant configurer le dépôt pour rajouter des utilisateurs et gérer les droits sur les différents dépôts. Pour ce faire, nous allons nous rendre dans le dossier du dépôt, puis dans conf. Dans ce dossier, il y a 3 fichiers qui sont authz, passwd et svnserve.conf. Nous allons tout d’abord modifier le fichier passwd pour rajouter à la fin de nouveaux utilisateurs en suivant ce format :

login = motdepasse

Une fois les utilisateurs et leurs mots de passes ajoutés, nous allons modifier le fichier svnserve.conf. A part lorsque je ne souhaite pas que qui que ce soit puisse lire mon code source si il n’est pas authentifié, je dé-commente les lignes

anon-access = read
auth-access = write
password-db = passwd

Ceci a pour effet d’autoriser la lecture lors d’un accès anonyme et l’écriture pour les utilisateurs authentifiés dont les identifiants sont inscrits dans passwd.

Afin de ne pas laisser ces mots de passes qui sont en clair à la vue de tout le monde, je met les droits des 3 fichiers à 0600.

Il ne reste plus qu’à lancer le serveur à l’aide de la commande suivante :

svnserve -d -r <dossier_contenant_les_depots>

Ici, <dossier_contenant_les_depots> est /home/SVN/.

L’un des problèmes de subversion est que cette action est à répéter à chaque démarrage de la machine. Afin de pallier à ce problème, on peut créer un script de lancement et l’exécuter au démarrage de la machine. Voici le script que j’ai créé (ATTENTION : ce script est adapté à la position de mon dossier subversion mais est à adapter en fonction de la localisation de ce dernier) :

#!/bin/sh
#
### BEGIN INIT INFO
# Provides: svnserve
# Required-Start: $syslog
# Required-Stop: $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop svnserve daemon at boot time
# Description: Controls the main subversion server \svnserve\ with /home/svn
### END INIT INFO

ECHO_BIN=/bin/echo

usage()
{
	$ECHO_BIN "Usage : $0 (stop|start|restart)"
}

SVN_stop()
{
	/sbin/start-stop-daemon --stop --exec /usr/local/bin/svnserve
	$ECHO_BIN "[+] Server stopped"
}

SVN_start()
{
	/usr/local/bin/svnserve -d -r /home/svn
	$ECHO_BIN "[+] Server launched on /home/svn"
}

if [ -x /usr/local/bin/svnserve ]
then
	if [ -z $1 ]
	then
		usage
	else
		case $1 in
			stop)
				SVN_stop
			;;
			start)
				SVN_start
			;;
			restart)
				SVN_stop
				SVN_start
			;;
			*)
				usage
				exit 1
		esac
	fi
else
	$ECHO_BIN "Svnserve not installed."
	exit 1
fi

exit 0

Il faut placer ce script dans /etc/init.d/ et bien penser à lui donner les droits 0755. Une fois à sa place, il ne reste plus qu’à l’activer au lancement de la machine en l’ajoutant aux différents /etc/rcx.d/ à l’aide la commande :

update-rc.d <nom du script> defaults

On peut vérifier à ce moment, après un redémarrage de la machine à l’aide de la commande

ps -e | grep svnserve

que tout est fonctionnel. On pourra alors accéder aux dépots en se connectant à :

svn://<nom_de_domaine_ou_IP>/<nom_du_depot>