DOCUMENTATION TECHNIQUE RX-TECHPRO — Configuration Serveur
← Retour au site démo
00 — Introduction

Présentation du projet

Ce site est un projet de démonstration réalisé par RX-TECHPRO pour illustrer concrètement les compétences en administration serveur Linux. Il s'agit d'un site vitrine fictif — la Clinique Lumière — déployé sur un vrai serveur VPS en production, avec une configuration identique à ce qui serait mis en place pour un client réel.

L'objectif de cette documentation est de détailler chaque couche de configuration utilisée : sécurité réseau, serveur web, base de données, monitoring et backup. Chaque choix technique est expliqué et justifié.

Environnement
VPS Contabo — Ubuntu 24.04 LTS — Apache 2.4 — PHP 8.3 — MySQL 8.0
Avertissement
Certains outils utilisés ici sont des outils de démonstration (Mailtrap, etc.). La section correspondante précise ce qui serait utilisé en production réelle.
01 — Nom de domaine

Nom de domaine & DNS

Le nom de domaine rx-techpro.com a été acheté sur Namecheap. Deux sous-domaines sont configurés : rx-techpro.com pour le site principal et demo.rx-techpro.com pour ce site de démonstration.

La configuration DNS consiste à créer des enregistrements A qui pointent chaque domaine vers l'adresse IP publique du VPS. Sans cet enregistrement, aucun visiteur ne peut trouver le serveur depuis internet.

DNS — Enregistrements A
# Enregistrement principal
@    A    157.xxx.xxx.xxx

# Sous-domaine www
www  A    157.xxx.xxx.xxx

# Sous-domaine démo
demo A    157.xxx.xxx.xxx
        
En production
Même configuration. Le domaine appartient au client — il est simplement configuré pour pointer vers le VPS fourni dans le cadre de la prestation.
02 — SSH

Accès SSH sécurisé

SSH est le protocole qui permet d'administrer le serveur à distance depuis un terminal. Par défaut, SSH écoute sur le port 22 — un port connu de tous les bots qui scannent internet en permanence à la recherche de serveurs vulnérables.

Sur ce serveur, SSH a été déplacé sur le port 2222. Ce simple changement élimine la quasi-totalité des tentatives de connexion automatisées, car les bots ciblent le port 22 par défaut et ne testent pas les ports non standards.

Pourquoi pas le port 22 ?
En laissant SSH sur le port 22, les logs du serveur se remplissent de centaines de tentatives de connexion par heure. Ce bruit rend la détection d'une vraie intrusion plus difficile et sollicite inutilement Fail2ban.

L'authentification par mot de passe est désactivée. Seule l'authentification par clé cryptographique ed25519 est acceptée. Une clé ed25519 est mathématiquement impossible à deviner — même avec des milliards de tentatives par seconde, il faudrait des millions d'années pour la trouver par force brute.

/etc/ssh/sshd_config — Directives clés
Port                    2222
PermitRootLogin         no
PasswordAuthentication  no
PubkeyAuthentication    yes
AuthorizedKeysFile      .ssh/authorized_keys
        
En production
Même configuration. La clé publique du client peut être ajoutée si celui-ci souhaite avoir accès à son propre serveur.
03 — Pare-feu

Pare-feu UFW

UFW (Uncomplicated Firewall) est le pare-feu configuré sur ce serveur. Son rôle est simple : bloquer tout trafic entrant par défaut, et n'autoriser que les ports strictement nécessaires au fonctionnement du serveur.

Trois ports sont ouverts uniquement : 2222 pour l'administration SSH, 80 pour le trafic HTTP (redirigé automatiquement vers HTTPS), et 443 pour le trafic HTTPS sécurisé. Tout autre port est bloqué — base de données, services internes, etc.

UFW status
sudo ufw status — Seuls les ports 2222, 80 et 443 sont ouverts
Principe du moindre privilège réseau
Un serveur bien configuré n'expose que ce qui est strictement nécessaire. MySQL par exemple écoute uniquement en local (localhost) — il n'est jamais accessible depuis internet, ce qui empêche toute tentative d'attaque directe sur la base de données.
En production
Même configuration. Si le client utilise un service supplémentaire (email, FTP sécurisé), le port correspondant est ouvert uniquement si nécessaire.
04 — Intrusions

Fail2ban

Fail2ban surveille les logs du serveur en temps réel. Dès qu'une adresse IP échoue plusieurs fois à se connecter en SSH, Fail2ban la bannit automatiquement en ajoutant une règle de blocage dans UFW pour une durée configurable.

Ce mécanisme est indispensable car internet est constamment scanné par des bots qui testent des millions de combinaisons identifiant/mot de passe chaque jour. Sans Fail2ban, ces tentatives continuent indéfiniment.

Fail2ban status
fail2ban-client status sshd — 68 tentatives détectées, 2 IPs bannies
Ce que montrent les chiffres
68 tentatives de connexion SSH enregistrées sur ce serveur depuis sa mise en ligne. 2 adresses IP ont été automatiquement bannies après avoir dépassé le seuil de tentatives. Ce serveur est donc activement ciblé — comme tous les serveurs exposés sur internet.
En production
En plus du jail SSH, des jails supplémentaires sont configurés pour Apache (tentatives de scan de fichiers sensibles) et pour la page de connexion WordPress.
05 — SSL

Certificat SSL & HTTPS

Le certificat SSL est ce qui permet au cadenas vert d'apparaître dans le navigateur et au site d'être accessible en HTTPS. Sans certificat SSL, toutes les données échangées entre le visiteur et le serveur transitent en clair sur internet — lisibles par n'importe qui.

Le certificat utilisé ici est fourni gratuitement par Let's Encrypt via l'outil Certbot. Il est valide 90 jours et se renouvelle automatiquement via une tâche cron — aucune intervention manuelle n'est nécessaire.

Un seul certificat couvre les deux domaines : rx-techpro.com et demo.rx-techpro.com. Le trafic HTTP (port 80) est automatiquement redirigé vers HTTPS (port 443) — un visiteur qui tape l'adresse sans "https://" est redirigé sans s'en rendre compte.

En production
Même configuration avec le domaine du client. Le certificat est gratuit — aucun coût supplémentaire pour le client.
06 — Apache

VirtualHost Apache

Apache est le serveur web installé sur ce VPS. Son rôle est de recevoir les requêtes HTTP/HTTPS des visiteurs et de leur renvoyer les pages du site. Activer Apache ne suffit pas — sans VirtualHost, aucun site ne peut s'afficher.

Un VirtualHost est un fichier de configuration dans /etc/apache2/sites-available/ qui dit à Apache : "pour ce nom de domaine, sers les fichiers qui se trouvent dans ce dossier". C'est ce qui permet d'héberger plusieurs sites sur un seul serveur.

Apache vs Nginx
Nginx est une alternative à Apache, réputée plus rapide pour servir des fichiers statiques et gérer un grand nombre de connexions simultanées. Cependant, pour un site vitrine avec un trafic modéré, Apache est largement suffisant et plus simple à configurer. Une combinaison Apache + Nginx (Nginx en reverse proxy devant Apache) est possible mais inutilement complexe pour ce type de projet.

Le VirtualHost configuré ici inclut plusieurs couches de sécurité directement dans la configuration Apache :

/etc/apache2/sites-available/demo.rx-tech-le-ssl.conf
# Headers de sécurité HTTP
Header always set X-Content-Type-Options    "nosniff"
Header always set X-Frame-Options           "SAMEORIGIN"
Header always set X-XSS-Protection          "1; mode=block"
Header always set Referrer-Policy           "strict-origin-when-cross-origin"
Header always set Strict-Transport-Security "max-age=31536000"
Header always set Content-Security-Policy   "default-src 'self'..."

# Cache navigateur
ExpiresActive On
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css  "access plus 1 month"

# Blocage des fichiers sensibles
FilesMatch "(\.env|\.git|wp-config\.php)"
    Require all denied
        
En production
Même structure. Le DocumentRoot et le ServerName sont adaptés au domaine du client.
07 — Permissions

Permissions fichiers & dossiers

Sous Linux, chaque fichier et dossier a des permissions qui définissent qui peut lire, modifier ou exécuter ce fichier. Ces permissions sont représentées par des chiffres : 7 = lire + écrire + exécuter, 5 = lire + exécuter, 0 = aucun accès.

Les trois chiffres correspondent à trois niveaux : le propriétaire, le groupe, et les autres (tout le monde).

Permissions appliquées sur ce serveur
# Dossiers
chmod 750 /var/www/demo.rx-tech/

# Fichiers
chmod 640 /var/www/demo.rx-tech/fichier.php

# Propriétaire Apache
chown -R www-data:www-data /var/www/demo.rx-tech/
        
Pourquoi www-data ?
Apache s'exécute sous l'utilisateur www-data. Si les fichiers appartiennent à un autre utilisateur, Apache ne peut pas les lire et le site affiche une erreur 403. Si les permissions sont trop ouvertes (777), n'importe quel processus sur le serveur peut modifier les fichiers du site.
En production
Même configuration. Les fichiers sensibles (config base de données, .env) ont des permissions encore plus restrictives : 640 ou 600.
08 — PHP

Configuration PHP.ini

PHP est le langage utilisé par WordPress et la majorité des sites dynamiques. Le fichier php.ini contrôle le comportement de PHP sur le serveur. Par défaut, certaines options sont activées et peuvent représenter des risques de sécurité.

/etc/php/8.3/apache2/php.ini — Directives de sécurité
# Masquer la version PHP
expose_php          = Off

# Désactiver l'affichage des erreurs
display_errors      = Off
log_errors          = On

# Limiter les uploads
upload_max_filesize = 10M
post_max_size       = 12M

# Limiter l'exécution
max_execution_time  = 30
memory_limit        = 256M
        
Pourquoi masquer la version PHP ?
Si un attaquant connaît la version exacte de PHP utilisée, il peut chercher les vulnérabilités connues de cette version et les exploiter. Masquer la version ne protège pas contre une faille, mais rend le ciblage plus difficile.
En production
Même configuration. PHP 8.3 est utilisé — la version la plus récente et la plus sécurisée.
09 — Base de données

MySQL — Base de données

La base de données stocke tout le contenu du site WordPress : articles, pages, utilisateurs, options de configuration. Elle est gérée par MySQL 8.0.

Plutôt que de donner tous les droits à un seul utilisateur administrateur, un utilisateur dédié est créé pour chaque site avec uniquement les privilèges nécessaires à son fonctionnement.

MySQL — Création base et utilisateur dédié
# Créer la base avec encodage UTF-8
CREATE DATABASE clinique_db
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

# Créer un utilisateur dédié
CREATE USER 'clinique_user'@'localhost'
  IDENTIFIED BY 'mot_de_passe_fort';

# Privilèges minimaux uniquement
GRANT SELECT, INSERT, UPDATE, DELETE
  ON clinique_db.*
  TO 'clinique_user'@'localhost';
        
Pourquoi des privilèges minimaux ?
Si le site est compromis, l'attaquant qui récupère les identifiants de base de données ne peut faire que SELECT/INSERT/UPDATE/DELETE. Il ne peut pas supprimer les tables, créer de nouveaux utilisateurs ou accéder aux autres bases de données du serveur. C'est le principe du moindre privilège.
En production
Même approche. Un utilisateur MySQL dédié par site hébergé sur le serveur.
10 — Monitoring

Monitoring & Alertes email

Un serveur sans monitoring est un serveur aveugle. Le monitoring surveille en permanence l'état du serveur et envoie une alerte email dès qu'un seuil critique est atteint ou qu'un service tombe.

Un script bash personnalisé rxtech-monitor.sh vérifie régulièrement : l'utilisation du CPU, de la RAM, de l'espace disque, et l'état des services critiques (Apache, MySQL, Fail2ban). Si un seuil est dépassé ou qu'un service est arrêté, une alerte est envoyée par email.

Alertes Mailtrap
Mailtrap — Alertes reçues : avertissement d'altération de fichier et confirmation de backup réussi
Mailtrap — Outil de démonstration
Sur ce serveur de démonstration, les emails sont interceptés par Mailtrap, un service qui simule une vraie boîte de réception email sans envoyer réellement les messages.
En production
Les alertes seraient envoyées vers une vraie adresse email via Postfix ou un service SMTP professionnel. Le client reçoit les alertes directement dans sa boîte email.
11 — Backup

Backup automatique

Le backup est la dernière ligne de défense. En cas de piratage, de fausse manipulation ou de panne matérielle, un backup récent permet de restaurer le site en quelques minutes. Sans backup, la perte de données est définitive.

Un script bash backup-system.sh effectue automatiquement une sauvegarde complète des fichiers du site et de la base de données. Les backups sont compressés en archives .tar.gz et uploadés vers Google Drive via l'outil rclone. Une rotation automatique supprime les anciens backups pour éviter la saturation du disque.

Google Drive backup
Google Drive — Fichiers backup : www, letsencrypt, php, fail2ban, ssh, apache2 et backup WordPress
Ce qui est sauvegardé
Fichiers du site (/var/www), configuration Apache, configuration SSH, configuration Fail2ban, certificats SSL Let's Encrypt, configuration PHP, et dump complet de la base de données MySQL.
Google Drive — Outil de démonstration
Google Drive est utilisé ici pour sa simplicité de configuration.
En production
Pour les projets professionnels, un stockage dédié de type Hetzner Storage Box ou Amazon S3 est préférable — plus fiable, sans limite de quota.
12 — WordPress

WordPress — Hardening

WordPress est le CMS le plus utilisé au monde — et donc le plus ciblé par les attaquants. Une installation WordPress par défaut comporte plusieurs vulnérabilités facilement exploitables si elle n'est pas correctement configurée.

wp-config.php — Constantes de sécurité
# Préfixe de tables personnalisé
$table_prefix = 'rxtech_';

# Désactiver l'éditeur de fichiers
define('DISALLOW_FILE_EDIT', true);

# Désactiver WP-Cron natif
define('DISABLE_WP_CRON', true);

# Limiter les révisions
define('WP_POST_REVISIONS', 3);
        
Pourquoi remplacer WP-Cron ?
WP-Cron ne s'exécute que lorsqu'un visiteur charge une page. Si personne ne visite le site la nuit, les backups automatiques ne s'exécutent pas. Le cron système Linux s'exécute à l'heure exacte configurée, indépendamment du trafic.

L'URL de connexion WordPress par défaut /wp-admin est connue de tous les bots. Elle a été remplacée par une URL personnalisée configurée via Kadence Security, rendant la page de connexion invisible aux scanners automatiques.

En production
Même configuration appliquée sur chaque installation WordPress. L'URL de connexion personnalisée est communiquée uniquement au client.
13 — Extensions

WordPress — Extensions installées

Seules 4 extensions sont installées sur ce site — le strict minimum nécessaire. Chaque plugin supplémentaire est une surface d'attaque potentielle et ralentit le site.

Extensions WordPress
Extensions installées — 4 plugins uniquement, tous activés et à jour

Kadence Security Basic — Sécurité WordPress. Gère la protection contre le brute force, l'authentification à deux facteurs (2FA), l'URL de connexion personnalisée, et la surveillance de l'intégrité des fichiers.

UpdraftPlus — Backup et restauration WordPress. Sauvegarde automatiquement la base de données et les fichiers WordPress vers Google Drive.

WP Super Cache — Cache WordPress. Génère des fichiers HTML statiques à partir des pages WordPress dynamiques, ce qui améliore considérablement la vitesse d'affichage.

Yoast SEO — Référencement naturel. Permet de configurer les métadonnées, générer le sitemap XML et optimiser le contenu pour les moteurs de recherche.

Yoast SEO non configuré sur ce site
Ce site étant fictif, il n'a pas vocation à être indexé par Google. Yoast SEO est installé pour illustrer une configuration type. En production, il serait paramétré avec les métadonnées et le sitemap adaptés au client.
En production
Pour les gros sites à fort trafic, WP Super Cache peut être remplacé par Redis ou Varnish. Pour un site vitrine standard, WP Super Cache est suffisant.
14 — Récapitulatif

Démo vs Production

Récapitulatif des différences entre ce site de démonstration et une configuration de production réelle pour un client.

Composant Démonstration Production réelle
Serveur mail Mailtrap (sandbox) Postfix / SMTP réel
Formulaires Non fonctionnels Fonctionnels avec vrai SMTP
Stockage backup Google Drive Hetzner Storage Box / S3
Cache WP Super Cache WP Super Cache / Redis
SEO Yoast non configuré Yoast configuré + sitemap
Domaine demo.rx-techpro.com Domaine du client
Fail2ban jails SSH uniquement SSH + Apache + WordPress
Alertes email Mailtrap inbox Email client en temps réel