Installation & Configuration d'un serveur dédié

Ce guide a pour but de présenter l'installation et la configuration d'apache afin d'héberger plusieurs sites (domaines et/ou sous-domaines) sur le même serveur. Nous prendrons l'exemple d'un domaine (http://test.fr) et d'un sous-domaine (http://guide.test.fr).

Nous vous conseillons de suivre le guide sur la sécurité. En effet nous n'aborderons qu'une partie de la sécurité d'Apache2. Les autres paramètres de sécurités sont abordés dans le guide sur la sécurité. Par ailleurs, nous vous recommandons vivement d'utiliser sudo afin d'exécuter les commandes depuis un compte autre que root.

Prérequis

Il vous sera nécessaire d'avoir préalablement configuré les dépôts selon ce guide.

Nous vous recommandons également d'utiliser pwgen afin de générer les différents mots de passes nécessaires. Celui-ci est très simple à utiliser : pwgen -1sB 14 1 (génère 1 mot de passe de 14 caractères et sans ambiguïté.)

Installation du serveur web

On va commencer par installer Apache2, PHP 5.4, MySQL et phpMyAdmin, ainsi qu'une extension pour Apache2 (mod-itk).

Ce dernier va nous servir à modifier les droits avec lesquels s'exécutent les scripts PHP. Cela peut vous parraître un peu étrange, mais il faut savoir que par défaut, Apache2 s'exécute avec l'utilisateur www-data. Or on va ici essayer de créer plusieurs hébergements distincts, avec des utilisateurs distincts. Il ne faut donc pas que chacun des utilisateurs puissent aller voir ou modifier les autres sites. Par ailleurs, ce cloisonnement permet d'éviter qu'une attaque implique plusieurs sites.

On se lance :

apt-get install apache2 mysql-server phpmyadmin apache2-mod-itk

Une fois terminé, vous devriez pouvoir accéder à votre serveur depuis votre naviguateur. Vous devriez ainsi voir un message "It Works !".

Activation de phpMyAdmin

Nous allons maintenant inclure le fichier de configuration de phpMyAdmin dans la config d'Apache :

ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf.d/phpmyadmin

Puis on va ouvrir le fichier de config /etc/phpmyadmin/apache.conf afin de modifier le chemin d'accès de phpMyAdmin :

Alias /PHPMADM /usr/share/phpmyadmin

Cela évitera que n'importe qui (en principe) accède à votre phpMyAdmin, et sera relativemen utile avec des solutions tel que fail2ban.

On va recharger la config d'apache2. Commençons de suite par prendre une bonne habitude : vérifier la configuration d'apache avant de recharger la configuration. Cela évitera de planter les sites qui tourneraient déjà :

apache2ctl -t # Doit afficher : "Syntax OK", sinon vérifiez l'erreur indiqué
service apache2 reload

Configuration d'Apache2 et de PHP5

Apache2

Nous allons modifier certains paramètres de config d'apache et de php afin de sécuriser un peu plus notre installation. On va commencer par modifier le fichier /etc/apache2/conf.d/security afin de laisser passer moins d'informations concernant notre système :

# Décommentez ces lignes (supprimer les #)
<Directory />
    AllowOverride None
    Order Deny,Allow
    Deny from all
</Directory>
# Puis modifiez la ligne non commentée "ServerTokens", en remplaçant le OS/Full/Minimal par Prod :
ServerTokens Prod
# Enfin, commentez la valeur on et décommentez la valeur off :
ServerSignature Off
#ServerSignature On

PHP5

Puis nous continuons avec la configuration de PHP. On va donc désormais modifier le fichier /etc/php5/apache2/php.ini.

Vérifiez que les deux lignes suivantes ont bien la valeur Off :

allow_url_fopen = Off
allow_url_include = Off

Vérifiez également que le paramètre ̀disable_functions correspondant à la valeur suivante :

disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,

Vous n'avez plus qu'a recharger la configuration d'apache (comme on l'a vu précédemment) :

apache2ctl -t # "Syntax OK", sinon vérifiez l'erreur indiqué
service apache2 restart

Créer des domaines/sous-domaines séparés

On rentre içi dans le coeur du sujet. À ce stade, PHP et Apache sont normalement installés et configurés de sorte à créer plusieurs espaces distincts.

On va içi voir comment créer un premier espace. La méthode est la même pour les autres espaces qui doivent être créé.

Faites attention aux droits d'accès sur les fichiers/dossiers. Ceux-ci sont importants, et si ils sont mal configurés vous pourriez ne pas pouvoir utiliser votre espace fraichement créé.

Compte utilisateur

On commence donc par créer le compte utilisateur qui sera utilisé par Apache pour s'exécuter, et pour se connecter au serveur en SFTP. En effet, l'utilisateur ne sera utilisable que par SFTP. Il sera impossible de l'utiliser pour se connecter en SSH.

adduser --no-create-home --shell=/bin/false guide
mkdir -p /var/www/guide.test.fr/website/
mkdir /var/www/guide.test.fr/logs/
chown -R guide:guide /var/www/guide.test.fr/website/
chown -R guide:guide /var/www/guide.test.fr/tmp/
chown -R root:root /var/www/guide.test.fr/logs/
chown root:root /var/www/guide.test.fr/ # L'utilisateur ne pourra pas se connecter si le dossier racine de votre "chroot" n'appartient pas au root
chmod 755 /var/www/guide.test.fr/
chmod -R 644 /var/www/guide.test.fr/logs
chmod -R 740 /var/www/guide.test.fr/tmp/
chmod -R 700 /var/www/guide.test.fr/website

Configuration du serveur SSH

Afin de restreindre l'utilisateur à son répertoire personnel, vous devrez ajouter les lignes suivantes au fichier /etc/ssh/sshd_config :

Match User guide
    ChrootDirectory /var/www/guide.test.fr/
    AllowTCPForwarding no
    X11Forwarding no
    ForceCommand internal-sftp

Configuration d'Apache2

Enfin, nous allons créer la configuration au niveau d'Apache afin qu'il réponde au nom de domaine, et que celui-ci pointe sur le bon dossier. Pour cela , créez le fichier /etc/apache2/sites-available/guide.test.fr̀ pour y mettre le contenu suivant :

<VirtualHost *:80>
    ServerAdmin webmaster@test.fr
    DocumentRoot "/var/www/guide.test.fr/website/"
    AssignUserID guide guide
 
    ServerName guide.test.fr
    # ServerAlias www.guide.test.fr
 
    <Directory "/var/www/guide.test.fr/website">
        php_admin_value open_basedir ".:/var/www/guide.test.fr/website/:/var/www/guide.test.fr/tmp/"
        php_admin_value include_path ".:/var/www/guide.test.fr/website/"
        php_admin_value upload_tmp_dir "/var/www/guide.test.fr/tmp/"
 
        Order allow,deny
        Allow from all
 
        AllowOverride None
        Options -Indexes -MultiViews +Includes
    </Directory>
 
    ErrorLog "/var/www/guide.test.fr/logs/error.log"
    CustomLog "/var/www/guide.test.fr/logs/access.log" common
</VirtualHost>

N'hésitez pas à aller voir la documentation d'Apache.

Il ne vous reste plus qu'à activer le nouveau site fraichement déclaré auprès d'Apache :

a2ensite guide.test.fr

Configuration des logrotate

Il vous faudra ensuite configurer la rotation des logs. Attention, selon votre pays ces fichiers doivent être obligatoirement conservés pendant une certaine durée (1 an en France). D'où l'intérêt de les compressés régulièrement, afin que ceux-ci ne prènent pas trop de place.

Nous allons donc utiliser logrotate afin de mettre cela en place. Nous créerons un fichier nommé /etc/logrotate.d/apache2-vhosts. Vous pourrez ajouter les chemins de vos différents sites, sur la première ligne (avant l'accolade), en les séparant par un simple espace :

/var/www/guide.test.fr/logs/*.log /var/www/test.fr/logs/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 644 root root
    sharedscripts
    postrotate
        /etc/init.d/apache2 reload > /dev/null
    endscript
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi; \
    endscript
}

Une fois que vous aurrez appliquer cette procédure pour les différents sites que vous voulez hébergez, il ne vous restera plus qu'à relancer le serveur apache, ainsi que le serveur ssh :

apache2ctl -t
service apache2 reload
service ssh restart

Voilà, vous devriez désormais avoir plusieurs espaces d'hébergements de configurés (et de cloisonnés) !