Installer un serveur web complet (Apache/PHP/MySQL/phpmyadmin)

Installer un serveur web complet (Apache/PHP/MySQL/phpmyadmin)

30/03/2016 0 Par Vincent

Tutoriel tout simple que je vous propose ici. Il s’agit de monter, toujours sous Debian, un serveur web fonctionnel relativement complet. Ici, nous ne parlerons pas de serveur mail, c’est une autre histoire et c’est clairement beaucoup plus compliqué. Je ne vais pas prendre le temps de vous expliquer pourquoi, mais je vous recommande d’utiliser un serveur mail fourni par une société connue et fiable (Gmail/Yahoo/FAI…). Sans cela, ça va être très dur de créer un serveur mail fiable ou vous ne risquerez pas de voir vos mails atterrir constamment dans la boite « Spam/Courriers indésirables » de votre interlocuteur.

Pour ce qui est du choix du serveur mail, je me suis tourné vers Apache2. C’est un vieux moteur web très efficace et désormais très stable. Il est pour l’instant majoritaire sur la marché, devant ses gros concurrents : Nginx ou Microsoft IIS.

On fait une petite mise à jour du système pour commencer (sauf si votre serveur est en production et que certains paquets nécessite d’être maintenu à certaines versions) :

apt-get update && apt-get upgrade

Installation d’Apache

On installe le serveur apache2 :

apt-get install apache2

On modifie le dossier d’apache pour que le serveur puisse accéder sans mal aux données web (surtout pour php) :

chown -R www-data:pi /var/www/html/
chmod -R 770 /var/www/html/

Lancer un navigateur web et essayer comme adresse : http://ip_du_serveur/ . Si ça fonctionne, vous êtes éligible au HTML/CSS.

Installation de PHP

Maintenant, on va ajouter le support du PHP(v5). C’est un peu la base d’internet avec l’HTML et le CSS.

# Installation de php5
apt-get install php5

# On redémarre apache
/etc/init.d/apache2 restart

Maintenant, on met en ligne sur le serveur une page de test php :

# Direction le répertoire d'apache
cd /var/www/html/

# Création de la page phpinfo.php
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

Si vous vous connectez sur cette adresse http://ip_du_serveur/phpinfo.php et que la page s’affiche, PHP est correctement installé.

Installation de MySQL

Un serveur web sans base de données, c’est cool mais quand même limité. On passe à l’installation de mysql :

apt-get install mysql-server php5-mysql

On vous demandera de mettre un mot de passe pour l’utilisateur root. C’est très important alors mettez quelque chose de performant. Ensuite on test sur notre serveur répond :

mysql -u root -p

Tapez votre mot de passe. Si vous arrivez sur un prompt : mysql; avec un message de bienvenue, vous êtes connecté et le serveur fonctionne correctement.

Installation de phpmyadmin

On installe maintenant phpmyadmin afin de faciliter l’administration de la base de données, on installe un outil web très pratique pour simplifier les choses :

apt-get install phpmyadmin

L’installeur vous demandera deux mots de passe :

  • le premier correspond au password root de mysql (le même que saisie dans le paragraphe d’avant)
  • le second pour l’utilisateur principal (root encore une fois dont la confusion) pour l’accès de phpmyadmin.

Essayez : http://ip_serveur/phpmyadmin/ et connectez-vous. Si ça fonctionne, tout est ok.

A ce stade, on est arrivé au stade ou l’on a un serveur web complet. Reste à activer le SSL.

Activation du SSL

Pour activer ou désactiver des sites, apache est livré avec deux commandes : a2ensite et a2dissite.
Pour activer ou désactiver des modules, apache propose aussi deux commandes : a2enmod et a2dismod.

On installe openssl :

apt-get install openssl

On active le support du SSL :

a2enmod ssl

Maintenant on passe à la configuration d’apache. Dans /etc/apache2/ports.conf, décommettez la section suivante :

<IfModule mod_ssl>
 Listen 443
</IfModule>

On va générer un certificat pour sécuriser la connexion. Bien sur, pour un site fiable, il faut non pas générer mais plutôt acheter un certificat auprès d’un vendeur fiable (entre 50€ et 500€ /an). Les certificats auto-signés (comme nous allons réalisés) permettent de crypter les données (c’est déjà ça), mais n’authentifient pas le site (donc à proscrire pour un site marchand avec paiement par CB par exemple).

openssl req -new -x509 -days 3650 -nodes -newkey rsa:4096 -out /etc/ssl/certs/webserver.crt -keyout /etc/ssl/private/webserver.key
## Garder en tête ceci : -x509 permet d'auto-signé vos certificats
# Vous générez donc deux fichiers,
#  - le certificat .crt
#  - la clé .key
#
# Si maintenant vous voulez un certificat signé par une authoritée agréée, vous
# aller réaliser un csr (certificat de request) sans l'option -x509 :
openssl req -new -days 3650 -nodes -newkey rsa:4096 -out /etc/ssl/certs/webserver.csr -keyout /etc/ssl/private/webserver.key
## et donc vous aurez :
#  - le certificat temporaire .csr
#  - la clé .key
# C'est à partir du .csr que l'authorité (appelée CA) va générer votre certificat 
# final .crt que vous utiliserez avec votre site.

Maintenant on modifie la configuration default-ssl et activer le site https :

## On modifie /etc/apache2/site-available/default-ssl
SSLEngine On
SSLCertificateFile /etc/ssl/certs/webserver.crt
SSLCertificateKeyFile /etc/ssl/private/webserver.key
# Les CA délivrent également un RootCA.crt que l'on utilise ici :
SSLCACertificateFile /etc/ssl/certs/rootca.crt

# Après sauvegarde du fichier ;
## On active
a2ensite default-ssl

## On reboot apache2
/etc/init.d/apache2 restart

Voilà, le site est maintenant disponible en https. Plus qu’à tester : https://ip_serveur/.

Attention : il est vrai que pour augmenter la sécurité (surtout si d’autres personnes ont un accès à la machine), la clé avec votre certificat doit contenir un mot de passe. Cela dit, cela impose de la taper à chaque fois que vous souhaiterez redémarrer votre apache. Une solution consiste à retirer ce mot de passe (mais à ne faire que si vous êtes sur des personnes qui accèdent à votre serveur) :

openssl rsa -in /etc/ssl/private/webserver.key -out /etc/ssl/private/webserver.key

Un poil de sécurité en plus ?

Pour améliorer un petit peu la sécurité, j’ai l’habitude de restreindre l’accès au /phpmyadmin (et tout autre système avec un accès aux bases de données seulement pour mon réseau local (192.168.1.0/24) ou pour un accès depuis un VPN(dans mon cas 10.8.0.0/24) : http://blog.vincentcharles.ovh/2016/02/29/installer-un-serveur-openvpn/ ).

Pour cela, il suffit d’éditer la configuration apache de chacun des accès. Exemple pour phpmyadmin ->

On remplace ça :

<Directory /usr/share/phpmyadmin>

    Options FollowSymLinks
    DirectoryIndex index.php
    ...
</Directory>

par ça :

<Directory /usr/share/phpmyadmin>
    Order Deny,Allow
    Deny from All
    Allow from 192.168.1.0/24
    Allow from 10.8.0.0/24

    Options FollowSymLinks
    DirectoryIndex index.php
    ...
</Directory>

Bravo, votre serveur web est fonctionnel et sécurisé (http / https / accès limité à phpmyadmin)

EDIT 01/04/2016 -> J’ai trouvé ce site qui permet de récupérer des certificats SSL signés gratuitement, de catégorie 1 (c’est à dire les plus faibles, certifiant juste votre nom  de domaine). C’est suffisant pour la majorité des utilisations privées. Bien sur, vous pouvez acheter des certificats plus lourds (certificat de l’organisation…) pour plus de sécurité si comme je l’ai déjà dit, votre site compte couvrir des activités commerciales ou associatives avec un espace de paiement -> https://startssl.com/ Je ne peux plus conseiller cette méthode puisque StartCom (l’autorité qui génère les certificats) n’est plus reconnue comme autorité de confiance pour les navigateurs Mozilla Firefox, Google Chrome ou encore Opera.

EDIT 24/02/2017 > La meilleure solution pour protégé votre site est l’utilisation de certificats SSL autogénéré par Let’s Encrypt. C’est 100% gratuit malgré quelques limitations. Il ne permet pas de confirmer l’identité du détenteur du certificat ni de l’entreprise ou association l’exploitant mais c’est une première étape vers la sécurisation des données utilisateurs sur votre serveur web. La seule grosse contrainte est la validité de 90 jours de certificats ce qui nécessite de faire un renouvellement de ceux-ci tous les 3 mois donc.