| Avant de commencer | |||||||||||||||
Prérequis matériel |
|||||||||||||||
| Serveur Intel Core i3 - RAM 2Go - HDD 500Go - Ethernet Gigabit | |||||||||||||||
|
CDROM ou clé USB d’installation de la
dernière version de Debian (la version utilisée ici est la 11.6.0 Bullseye) |
|||||||||||||||
| Liaison Internet à haut débit (fibre fortement conseillée) | |||||||||||||||
Conventions |
|||||||||||||||
| Nous considérons que le réseau local est configuré comme suit : | |||||||||||||||
|
|||||||||||||||
| Il vous appartient d'adapter ces paramètres selon votre environnement. | |||||||||||||||
|
En ce qui concerne le nom de domaine public, nous prendrons pour exemple un abonnement DNS Dynamique chez No-IP. Le routeur, ici une LiveBox 5, devrait donc être configuré d'une façon similaire à celle-ci : |
|||||||||||||||
Dans la partie NAT / PAT![]() |
Dans la partie DynDNS![]() |
||||||||||||||
Administration |
|||||||||||||||
|
Nous administrerons le serveur à distance et j'utilise pour cela un poste client Microsoft doté du sous-système Windows pour Linux. Vous trouverez ici comment installer Debian sous Windows 10 ainsi que les deux excellents outils Windows Terminal et WinSCP. (passez cette étape si vous préférez utiliser une autre méthode). |
|||||||||||||||
| 1 - Montage du serveur Debian | |||||||||||||||||||||||||||||||||||
Bootez sur le support d’installation |
|||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
Retirez le support d’installation et redémarrez le serveur. |
|||||||||||||||||||||||||||||||||||
| (1) Utilisez un nom court mais explicite, en minuscules et sans espaces. | |||||||||||||||||||||||||||||||||||
| (2) Créez des mots de passe robustes : 12 caractères minimum, majuscules, minuscules, chiffres et caractères spéciaux. | |||||||||||||||||||||||||||||||||||
| (3) Le disque sera intégralement effacé et alloué à Debian. | |||||||||||||||||||||||||||||||||||
|
(4) Créez une seule partition, car en optant pour des partitions séparées la totalité de l'espace disponible serait réservé à /home. Or le répertoire HTTP se trouvera dans /var alors que /home restera inutilisé. |
|||||||||||||||||||||||||||||||||||
| (5) Pas de bureau ni de logiciels, nous sommes sur un serveur et nous n'installons que le strict nécessaire. | |||||||||||||||||||||||||||||||||||
| 2 - Configuration de base du serveur | |
Connectez-vous en local en tant que root |
|
Installez les paquets requis pour la suite des opérations |
|
|
apt-get update apt-get -y install sudo apt-get -y install wget apt-get -y install openssh-server |
|
Configurez SUDO pour votre compte d'utilisateur |
|
|
nano /etc/sudoers # User privilege specification root ALL=(ALL :ALL) ALL <utilisateur> ALL=(ALL :ALL) ALL |
|
Configurez TCP/IP |
|
|
nano /etc/network/interfaces source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eno1 auto eno1 iface eno1 inet static address 192.168.1.254 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1 /etc/init.d/networking restart |
|
Configurez SSH |
|
|
nano /etc/ssh/sshd_config # Authentication: PermitRootLogin yes systemctl restart sshd |
|
Déconnectez-vous et redémarrez le serveur (facultatif mais conseillé) |
|
|
exit reboot |
| 3 - Installation et configuration des services web | |||||||||||||||||
|
Il est plus pratique de poursuivre les opérations depuis un poste client. Initiez une connexion SSH en tant que root depuis le poste client |
|||||||||||||||||
| ssh root@192.168.1.254 | |||||||||||||||||
Installez Apache |
|||||||||||||||||
|
apt-get -y install apache2 |
|||||||||||||||||
Installez PHP et ses extensions |
|||||||||||||||||
|
apt-get -y install php apt-get -y install php-gd apt-get -y install php-cgi apt-get -y install php-mysqli apt-get -y install php-pear apt-get -y install php-mbstring apt-get -y install php-php-gettext apt-get -y install php-common apt-get -y install php-phpseclib apt-get -y install php-mysql apt-get -y install libapache2-mod-php |
|||||||||||||||||
Installez MariaDB (version libre de MySQL) |
|||||||||||||||||
|
apt-get -y install mariadb-server apt-get -y install mariadb-client |
|||||||||||||||||
Vérifiez le fonctionnement des services |
|||||||||||||||||
|
systemctl status apache2 systemctl status mariadb |
|||||||||||||||||
Configurez MySQL |
|||||||||||||||||
|
|||||||||||||||||
|
Créez un utilisateur MySQL disposant de tous les privilèges. Remplacez new_user et new_password par le nom d'utilisateur et le mot de passe que vous souhaitez pour MySQL. Placez toujours les mots de passe entre quotes et mettez un point-virgule en fin de chaque commande. Chaque commande doit recevoir une réponse Query OK |
|||||||||||||||||
|
mysql -u root > create user new_user@localhost identified by 'new_password'; > grant all privileges on *.* to new_user@localhost; > flush privileges; > show grants for new_user@localhost; > exit |
|||||||||||||||||
Installez et configurez phpMyAdmin |
|||||||||||||||||
|
wget -P Downloads https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz mkdir /var/www/html/phpmyadmin cd /root/Downloads tar xvf phpMyAdmin-latest-all-languages.tar.gz --strip-components=1 -C /var/www/html/phpmyadmin cp /var/www/html/phpmyadmin/config.sample.inc.php /var/www/html/phpmyadmin/config.inc.php chmod 660 /var/www/html/phpmyadmin/config.inc.php chown -R www-data:www-data /var/www/html/phpmyadmin systemctl restart apache2 |
|||||||||||||||||
|
Créez le fichier /var/www/html/phpinfo.php contenant le code suivant : |
|||||||||||||||||
| <?php phpinfo(); ?> |
|||||||||||||||||
Vérifiez le fonctionnement des services depuis un navigateur |
|||||||||||||||||
|
http://192.168.1.254/ http://192.168.1.254/phpinfo.php http://192.168.1.254/phpmyadmin |
|||||||||||||||||
|
Notez qu'à des fins d'administration, le répertoire phpmyadmin pourra être recopié et exploité dans les répertoires des sites. Les commandes et chemins courants sont répertoriés en fin de ce document. |
|||||||||||||||||
| 4 - Mise en place d'un certificat SSL auto-signé | |
|
Bien que terme SSL soit toujours largement employé, ce protocole est devenu obsolète et il est aujourd'hui remplacé par TLS.
Un certificat auto signé est une solution gratuite et fiable sans pour autant être approuvée par une autorité de certification (CA). |
|
| Installez les paquets requis pour la suite des opérations | |
|
dpkg --list apt-get update apt-get -y install openssl apt-get -y install net-tools |
|
Activez les modules SSL |
|
|
a2enmod ssl a2enmod headers |
|
| Pour info la commande inverse est a2dismod | |
Vérifiez que le serveur Apache écoute sur le port 443 (HTTPS) |
|
|
netstat -tanpu | grep "LISTEN" | grep "443" |
|
|
Si aucun processus Apache n’est en écoute sur le port 443 (si la commande ne donne aucun résultat) : Identifiez le fichier qui permet de configurer les ports en écoute et éditez celui qui correspond à Listen 80 Il s'agit généralement de /etc/apache2/ports.conf et ajoutez-lui le code qui indique à Apache d’écouter sur le port 443 |
|
|
grep -R "Listen" /etc/apache2 nano /etc/apache2/ports.conf Listen 80 <IfModule ssl_module> Listen 443 </IfModule> <IfModule mod_gnutls.c> Listen 443 </IfModule> |
|
|
On peut ajouter d’autres ports d’écoute HTTP sous Listen 80 (ex. Listen 8080) Redémarrez Apache et vérifiez à nouveau |
|
|
systemctl restart apache2 netstat -tanpu | grep "LISTEN" | grep "443" tcp6 0 0 :::443 :::*  LISTEN 96371/apache2 |
|
|
Générez le certificat auto signé dans un répertoire portant le nom du site afin de bien le différencier. Il est important que Common Name soit le FQDN du site concerné. |
|
|
mkdir /etc/ssl/site.com openssl req -new -newkey rsa:2048 -nodes -keyout /etc/ssl/site.com/server.key -out /etc/ssl/site.com/server.csr Country Name (2 letter code) [AU]: FR State or Province Name (full name) [Some-State]: France Locality Name (eg, city) []: votre_ville Organization Name (eg, company) [Internet Widgits Pty Ltd]: votre_nom Organizational Unit Name (eg, section) []: IT Common Name (eg, server FQDN or YOUR name) []: site.com Email Address []: votre_email A challenge password []: (laisser vide) An optional company name []: (laisser vide) |
|
|
La procédure a créé deux fichiers : server.key qui contient la clé privée à ne jamais communiquer et à sauvegarder car il n'y a aucun moyen de la récupérer en cas de perte. Elle est utilisée pour générer toute demande de signature de certificat CSR. server.csr qui contient la clé publique et les informations de demande de certificat. Par défaut, sa durée de validité est de 1 an. |
| 5 - Activation du CSR chez le registrar | |
|
Pour exemple le cas d'un DNS dynamique enregistré chez No-IP |
|
|
Dans le formulaire Web du processus d'inscription de No-IP : My Services / SSL Certificates / Add CSR ![]() |
|
|
Server : sélectionnez Apache 2 Enter your CSR : collez le contenu du fichier server.csr puis validez. ![]() Fin de la procédure après avoir renseigné les champs demandés tels que nom, prénom, téléphone, adresse et code postal. ![]() |
|
|
Téléchargement des certificats. |
|
La mise à jour et la réception de l’email sont quasi instantanées.![]() Le cadenas apparaît maintenant fermé pour l’hôte concerné. ![]() Téléchargez les quatre fichiers (bien que nous n'utiliserons que le fichier PEM Chain) et placez-les dans le répertoire /etc/ssl/site.com ![]() Attention : les fichiers PEM Chain et PEM portent la même extension (.pem) Téléchargez tout d'abord le fichier PEM Chain et recommez-le avec l'extension .pem-chain |
| 6 - Configuration des hôtes virtuels | |
|
Les hôtes virtuels sont décrits dans un fichier indiquant au serveur les routes à prendre pour atteindre les données des différents sites hébergés selon leur nom de domaine et le port utilisé. Un chemin par défaut doit également être défini pour traiter les requêtes qui ne correspondent à aucune des entrées présentes. |
|
| Créez un fichier par défaut | |
|
nano /etc/apache2/sites-available/default.conf |
|
Dans un premier temps déclarez une unique écoute HTTPS |
|
|
<VirtualHost *:443> # Active le SSL SSLEngine On # Active tous les protocoles (TLS v1.0, TLS v1.1, TLS v1.2 et TLS v1.3) # et désactive SSL v2 et v3 (obsolètes et remplacés par TLS) SSLProtocol All -SSLv3 -SSLv2 # Active les méthodes de chiffrement et désactive les méthodes de chiffrement non sécurisés SSLCipherSuite HIGH:!aNULL:!MD5:!ADH:!RC4:!DH # Demande au navigateur de sélectionner une méthode de chiffrement # en respectant l'ordre envoyée par le serveur (HIGH uniquement) SSLHonorCipherOrder on # Renseigne le chemin vers le certificat SSL de l'adresse à sécuriser (fichier téléchargé) SSLCertificateFile "/etc/ssl/cmclub.ddns.net/cmclub_ddns_net.pem-chain" # Renseigne le chemin vers la clé privée correspondant au certificat SSL de l'adresse à sécuriser SSLCertificateKeyFile "/etc/ssl/cmclub.ddns.net/server.key" # Renseigne le chemin vers le certificat SSL racine, puis vers le ou les certificats SSL intermédiaires # Il est possible d’ajouter d'autres directives SSLCACertificateFile # SSLCACertificateFile "/etc/ssl/cmclub.ddns.net/certificat-racine.cer" # SSLCACertificateFile "/etc/ssl/cmclub.ddns.net/certificat-intermediaire.cer" # L’utilisation de certificats racine et intermédiaires est optionnelle # Spécifie que le serveur requiert toujours des connexions HTTPS durant 1 an Header always set Strict-Transport-Security "max-age=31536000" </VirtualHost> |
|
Activez le fichier VirtualHost |
|
|
a2ensite /etc/apache2/sites-available/default.conf |
|
| Pour info la commande inverse est a2dissite | |
|
Rechargez la configuration d’Apache et effectuez un test. Vous devez obtenir le message Syntax Ok et ne tenez pas compte de l'erreur de directive globale 'ServerName'. |
|
|
systemctl reload apache2 apache2ctl configtest AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK |
|
Redémarrez Apache |
|
|
systemctl restart apache2 |
|
|
Rendez vous sur www.sslshopper.com pour vérifier le bon fonctionnement du certificat et le niveau de sécurité du site. Cette capture est l'exemple d'un résultat correct : ![]() |
|
Voici à présent l'exemple commenté d'une version plus complète du fichier default.conf |
|
|
Le premier <VirtualHost> est appliqué par défaut si aucun des sites ne correspond aux autres directives ServerName. Il est judicieux d’y définir le localhost et de le placer en tête de liste. Les <VirtualHost> suivants sont évalués et exécutés selon la correspondance de leur directive ServerName et du port d'écoute. Dans cet exemple, site1.com reste en http (port 80) et site2.com est redirigé en https (port 443). A retenir : • La directive ServerName est toujours le FQDN du site. • La directive DocumentRoot est le chemin absolu vers le répertoire du site. • La directive Redirect permanent est une redirection permanente de type 301 (mise en cache par les robots et les navigateurs). • Sans l'option permanent, la directive Redirect est une redirection temporaire de type 302 (à réserver pour les tests). Plusieurs fichiers VirtualHost peuvent être créés et activés mais cela rend la gestion plus complexe. Consultez la documentation Apache pour l'intégration d'autres directives dans le code. Important : • Rechargez la configuration d’Apache après chaque modification : systemctl reload apache2 • Lors de tests il peut être nécessaire d’effacer l’historique du navigateur pour confirmer le résultat. • Veillez à ce que le fichier soit bien actif : a2ensite default.conf |
|
|
<VirtualHost *:80> ServerName localhost DocumentRoot /var/www/html # autres directives... </VirtualHost> <VirtualHost *:80> ServerName site1.com DocumentRoot /var/www/html/site1 # autres directives... </VirtualHost> <VirtualHost *:80> ServerName site2.com DocumentRoot /var/www/html/site2 Redirect permanent "/" "https://site2.com/" # autres directives... </VirtualHost> <VirtualHost *:443> ServerName site2.com DocumentRoot /var/www/html/site2 SSLEngine On SSLProtocol All -SSLv3 -SSLv2 SSLCipherSuite HIGH:!aNULL:!MD5:!ADH:!RC4:!DH SSLHonorCipherOrder on SSLCertificateFile "/etc/ssl/site2/site2.pem-chain" SSLCertificateKeyFile "/etc/ssl/site2/server.key" Header always set Strict-Transport-Security "max-age=31536000" # autres directives... </VirtualHost> |
| 7 - Outils d'administration | |||||||||||||||||||||||||||
Installez les paquets additionnels |
|||||||||||||||||||||||||||
|
# commande man pour l'aide apt-get install -y man-db # gestionnaire d'instantanés apt-get install -y timeshift |
|||||||||||||||||||||||||||
|
Créez les snapshots à des moments où le serveur est inactif, les principales options de la commande sont détaillées ici |
|||||||||||||||||||||||||||
|
timeshift --create --comments "Snapshot Debian" --tags O |
|||||||||||||||||||||||||||
Chemins courants |
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
Commandes courantes |
|||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||