Administrer un serveur dédié – part 5 : Serveur Web

Dans cet article nous allons voir comment déployer un serveur web, pour cela nous avons besoin de plusieurs briques :

  • Apache : c’est le serveur web par excellence qui reste encore majoritaire sur le web. Avec lui on va pouvoir servir des pages web statiques HTML/CSS
  • Php : Le langage que j’utilises le plus pour mes sites web.
  • MySQL : La base de données qui est aussi prédominante (WordPress, Prestashop, …)
  • SFTP : je n’utilise pas de serveur FTP car je n’en vois pas l’intérêt quand on a déjà SSH sur la machine autant activer SFTP.

Voilà bien sur on aurait pu prendre Nginx à la place d’Apache, MariaDB à la plase de MySQL, vsFTPd à la place de sftp … mais il faut faire un choix et on pourra toujours revenir dessus dans un prochain article.

 

Je vous conseil de rien n’installer sur le host pour le laisser le plus propre possible et d’utiliser un container. Nous souhaitons héberger nos sites sur CT101 que nous venons de créer donc c’est partit.

Serveur Web – Apache

aptitude install apache2
Installer Apache

Il va installer plusieurs packages car apache2 est un metapaquet.

A la fin de l’installation le serveur web est lancé et fonctionnel. On peut le voir rapidement en saisissant dans votre navigateur l’adresse IP Failover de votre container qui affichera une page web. Avant on avait connexion refusée.

Il y a aussi après le lancement un petit warning que nous allons corriger : « apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.0.1 for ServerName »

C’est très simple pour ne plus avoir les erreurs vous devez modifier le fichier suivant et ajouter cette ligne à la fin du fichier :

ServerName localhost
vi /etc/apache2/apache2.conf

 

Vérifions aussi quelques configurations d’Apache pour voir si tout est en ordre :

Vérifier que la configuration d’Apache (normalement c’est celle par défaut) écoute bien sur le port 80. Et aussi sur le port 443 un peu plus bas dans le cas ou on voudrait déployer du SSL ce que nous ferons bientôt pour notre cloud.

NameVirtualHost *:80
Listen 80
vi /etc/apache2/ports.conf

Modifier en décommentant la ligne (supprimer le #) pour passer Apache2 en UTF-8 c’est la norme sur le web depuis quelques années maintenant et vous ne rencontrerez aucun problème en encodant tous les fichiers en UTF-8.

AddDefaultCharset UTF-8
vi /etc/apache2/conf.d/charset

Pour personnaliser un peu apache je vous conseil 2 modules qui sont presque indispensable pour moi :

  • rewrite : permet la réécriture d’URL, tous les sites l’utilisent de nos jours (au lieu d’avoir http://vincent.dauce.fr/index.php?article=1 nous avons http://vincent.dauce.fr/mon-premier-article)
  • userdir : celui là est moins évident ça permet de créer un hébergement web par utilisateur. Pour chaque site hébergé sur ce serveur je vais créer un compte avec un mot de passe pour lui donner accès aux fichiers et avoir un espace web. Pour sécuriser le tout c’est moi qui l’activerait ou non par compte donc par exemple compte root n’a pas d’espace web 🙂

Pour activer les 2 modules ci-dessus nous utilisons :

a2enmod rewrite
a2enmod userdir
Activer les modules principaux sur Apache

Comme vu plus haut nous allons sécuriser le module userdir avec la configuration suivante (ajouter les lignes à la fin du fichier après ServerName) :

# Configuration du module UserDir
UserDir disabled
UserDir /home/*/www
vi /etc/apache2/apache2.conf

Le module userdir est ainsi désactivé et sera activé au cas par cas selon nos besoins. Et nous définissons que les pages web seront dans le répertoire /home/*/www avec * le login du compte.

Pour vous donner une idée, si je veux héberger le site « toto.com » je vais créer un compte toto qui aura donc un répertoire personnel dans /home/toto. Si j’active pour ce compte l’espace web il pourra déposer des fichiers dans /home/toto/www et consultable via le lien CT101_IP_PUBLIC/~toto.

Justement pour éviter d’avoir à créer à chaque fois le dossier www nous allons automatiser la création et créer un dossier logs pour stocker les fichier log d’Apache par compte.

mkdir /etc/skel/www
mkdir /etc/skel/logs
echo " <strong>Nouvel espace web</strong> " > /etc/skel/www/index.html
Automatiser la création du dossier www

Puis recharger la configuration et admirer que vous n’avez plus le message d’erreur :

service apache2 reload
Recharger apache2

 

Serveur SQL – MySQL

Pour installer MySQL c’est très simple voir trop simple 🙂

aptitude install mysql-server
Installer MySQL

On est encore dans le cas d’un metapaquet, on valide et c’est tout.

Je vous conseil de choisir un mot de passe complexe pour le root de MySQL, moi j’utilise 50 caractères avec majuscules, minuscules et chiffres (Pas de caractères spéciaux car j’ai souvent eu des problèmes après pour me connecter avec).

Il existe plein de générateur de mot de passe en ligne, je vous laisse choisir votre préféré moi j’ai pas trouvé. Surement une idée d’application à faire 🙂

Voilà le mien : a4HBSwpwdlF3LafNsPswKM6uZQWGIqrjnUGXkNcoYX3XGE5lZV

à conserver précieusement car c’est le compte root.

 

Serveur App – PHP

Pour PHP aussi pas beaucoup de chose à faire (PHP 5.4) :

aptitude install php5
Installer PHP

Après comme pour Apache il y a des modules plus ou moins importants, voici les principaux :

  • php5-mysql : plutôt indispensable celui là sinon comment vous connecter à MySQL que vous venez d’installer ? permet d’activer les fonctions mysql_* (ne plus les utiliser svp c’est trop horrible et obsolète depuis la version 5.5 de PHP), mysqli_* (c’est mieux mais bon) et enfin PDO (ça c’est la classe)
  • php5-curl : pour récupérer des fichiers via HTTP ou FTP
  • php5-gd : pour traiter des images (resize, traitements, …)
  • php5-mcrypt : pour crypter des données sensibles
  • libssh2-php : pour utiliser SSH dans les scripts PHP

Prestashop la boutique en ligne et open source que je vous conseil a besoin de php5-curl pour activer Paypal, php5-gd pour retailler les images, php5-mcrypt pour crypter les données sensibles et bien évidemment php5-mysql.

WordPress le blog open source qui fait aussi CMS a besoin de libssh2-php pour pouvoir faire les mise à jour en automatique

Pour les installer tous il suffit de lancer :

aptitude install php5-mysql php5-gd php5-mcrypt php5-curl libssh2-php
Installer les modules PHP

Juste après ca vous n’avez rien à faire tout est déjà fonctionnel.

 

Serveur Fichier – SFTP

Pour le serveur de fichier j’utilisais il y a très longtemps des serveurs FTP plus ou moins sécurisés jusqu’au jour ou j’ai découvert que SSH le faisait déjà très bien. Alors pourquoi installer un nouveau service alors qu’on en a déjà un installé et qui tourne ? en plus il y avait la gestion des comptes qui était complexe là c’est le même login et mot de passe.

Vous allez me dire mais j’ai pas envie de donner un accès SSH à mes utilisateurs et bien non on leur donne uniquement le SFTP ils peuvent rien faire de plus c’est donc totalement sécurisé.

Pour celà il faut juste configurer SSH pour permettre de rendre le service que l’on veut c’est à dire offrir aux utilisateurs un accès aux fichiers via un client FTP comme filezilla ou un partage de fichiers.

Il faut donc changer la ligne « Subsystem … » (avant on avait « Subsystem sftp /usr/lib/openssh/sftp-server ») : On indique autoriser le faux shell « internal-sftp » qui va permettre d’interdire l’accès au shell pour les utilisateurs.

Et rajouter quelques lignes  après « UserPAM yes ». Pour autoriser le groupe www-data qui est celui d’Apache donc de nos sites.

  • ChrootDirectory : les utilisateurs ne pourront pas remonter à la racine du serveur et explorer notre serveur. Ils sont bloqués dans leur dossier personnel
  • X11Forwarding : on n’autorise pas le partage de bureau (application graphique à distance)
  • AllowTcpForwarding : interdire aussi les tunnels SSH
  • ForceCommand : pour forcer l’utilisation d’un faux shell et interdire donc un accès SSH
Subsystem sftp internal-sftp

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes
	AllowGroups www-data
	Match Group www-data
	        ChrootDirectory /home/%u
	        X11Forwarding no
	        AllowTcpForwarding no
	        ForceCommand internal-sftp
vi /etc/ssh/sshd_config

Reste à recharger la configuration de notre service :

service ssh reload
Recharger SSH

Et voilà nous avons un SFTP sécurisé accessible uniquement aux utilisateurs appartenant au groupe www-data. Pour rappel le fichier de conf a déjà été modifié pour interdire au root de pouvoir se connecter et nous avons déjà changé le port par défaut qui était à 22 pour plus de sécurité.

Reste à rajouter des droits car sinon le SFTP interdira de se connecter.

chown -R root:www-data /home/
chmod -R 750 /home/
Droits pour SFTP

 

 

Un commentaire

  1. Bonjour Vincent,

    j’aimerai savoir si avec ta configuration tu arrives à faire les mises à jour de WordPress depuis son interface.
    J’ai appliqué ta méthode sur mon site et j’ai attribué les droits comme tu l’as décrit.
    Mais j’ai un problème ; avec cette configuration, si je me connecte en SFTP avec mon utilisateur j’ai bien les droits sur les fichiers/dossiers mais je ne peux pas faire les mises à jour depuis l’interface WP.
    Si je diffuse les droits en faisant chown -R www-data:www-data /home/ alors je peux faire les maj de WP mais mon utilisateur n’a plus les droits de modifier les fichiers et les dossiers…
    Comment puis-je m’en sortir, stp 🙂 ?…

    D’avance merci.

    Amicalement,

    Pierre.

    Reply
    • Bonjour,

      Oui bien sur que j’arrive à faire les maj en utilisant le sftp via l’interface admin de WordPress.
      Les paramètres à mettre sont localhost:xxxx (xxxx étant ton port sftp); l’identifiant est ton compte utilisateur (celui ou tu as mis ton site dans le home) et le mot de passe en SSH2.

      Il faut installer la librairie aptitude install libssh2-php

      Voilà en espérant t’avoir aidé.

      Reply
  2. Merci Vincent 🙂 !!

    En fait comme c’était « bloquant » pour moi depuis un bon bout de temps j’ai investigué un peu plus et j’ai fini par trouver la solution que tu viens de me soumettre :)…
    De toute façon, un très grand merci pour tout ton tutoriel qui m’a bien aidé pour appréhender mon premier dédié 🙂 !!

    Passes un très bon week-end !!

    Amicalement,

    Pierre

    Reply

Leave a Comment.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.