Guide complet pour configurer et sécuriser un serveur VPS depuis zéro.
---
## 📋 Table des matières
1. [Prérequis](#prérequis)
2. [Première connexion](#première-connexion)
3. [Sécurisation de base](#sécurisation-de-base)
4. [Installation d'un serveur web](#installation-dun-serveur-web)
5. [Déploiement](#déploiement)
6. [Maintenance](#maintenance)
7. [Ressources](#ressources)
---
## Prérequis
### Ce dont vous avez besoin
- Un VPS chez un hébergeur (OVH, Hetzner, DigitalOcean, Infomaniak, etc.)
- Une adresse IP publique (fournie par l'hébergeur)
- Un terminal (macOS/Linux)
- 1h-2h devant vous
**📝 Note sur Vim :** Ce guide utilise **vim** pour éditer les fichiers de configuration. Vim est l'éditeur standard présent sur tous les serveurs Linux.
**Débutant avec Vim ?** → Consultez [vim-guide-essentiel.md](linux-essentials/vim-guide-essentiel.md) (15 min de lecture)
**Commandes minimales pour suivre ce guide :**
-`i` : Passer en mode édition
-`Esc` : Sortir du mode édition
-`:wq` : Sauvegarder et quitter
-`:q!` : Quitter sans sauvegarder
### Informations à noter
Avant de commencer, notez ces informations fournies par votre hébergeur :
```
IP du VPS : _______________
Utilisateur initial : _______ (root, ubuntu, admin, ou autre)
Mot de passe/clé SSH : _______________
Distribution : Debian / Ubuntu (recommandé)
```
### ⚠️ Deux types d'accès VPS
Votre configuration initiale dépend de votre hébergeur :
**Type A - Accès root direct** (OVH, Hetzner, DigitalOcean)
- Connexion : `ssh root@IP`
- Vous devez créer vous-même un utilisateur non-root
- Suivez toutes les étapes ci-dessous
**Type B - Utilisateur sudo pré-configuré** (Infomaniak, hébergeurs managed)
- Connexion : `ssh ubuntu@IP` (ou autre utilisateur fourni)
- L'utilisateur a déjà les droits sudo
- **Sautez l'étape 3** (création d'utilisateur)
- Pour les commandes root, utilisez `sudo` devant chaque commande
---
## Première connexion
### Étape 1 : Se connecter au VPS
**Pourquoi ?** Établir la première connexion sécurisée à votre serveur et vérifier que tout fonctionne.
**Type A - Connexion root :**
```bash
ssh root@<adresse-IP>
# Entrez le mot de passe fourni par l'hébergeur
```
**Type B - Connexion utilisateur sudo (Infomaniak, etc.) :**
```bash
ssh ubuntu@<adresse-IP>
# Ou : ssh admin@<adresse-IP>
# Selon l'utilisateur fourni par votre hébergeur
```
**Première connexion :**
```bash
# Le serveur vous demande de confirmer son empreinte SSH
The authenticity of host 'xxx.xxx.xxx.xxx' can't be established.
ED25519 key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no)?
# Tapez "yes" et Entrée
# Ceci enregistre le serveur comme connu et évite les attaques MITM
```
**Si vous êtes connecté en root (Type A), changez le mot de passe :**
```bash
passwd
# Entrez un mot de passe FORT (20+ caractères, complexe)
# Pourquoi ? Le mot de passe initial est souvent simple ou envoyé par email (non sécurisé)
```
**Si vous avez un utilisateur sudo (Type B), vérifiez vos droits :**
```bash
sudo -v
# Doit répondre sans erreur
# Si demandé, entrez le mot de passe sudo fourni par l'hébergeur
```
### Étape 2 : Mettre à jour le système
**Pourquoi ?** Les images serveur contiennent souvent des paquets obsolètes avec des failles de sécurité. La première chose à faire est de tout mettre à jour.
**Type A (root) :**
```bash
# Mettre à jour la liste des paquets disponibles
apt update
# Installer toutes les mises à jour de sécurité et correctifs
apt upgrade -y
# Supprimer les paquets obsolètes qui ne sont plus nécessaires
apt autoremove -y
```
**Type B (sudo) :**
```bash
# Même chose mais avec sudo devant chaque commande
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y
```
**💡 Astuce :** Combinez les commandes pour gagner du temps :
**⚠️ Type B (Infomaniak, etc.) : SAUTEZ CETTE ÉTAPE** - vous avez déjà un utilisateur sudo
**Type A uniquement (accès root direct) :**
**Pourquoi ?** Le compte root a tous les privilèges sans restriction. Une simple erreur de commande (ex: `rm -rf /`) peut détruire tout le système. Un utilisateur non-root avec sudo est plus sûr :
- Vous devez taper `sudo` avant chaque commande sensible (temps de réflexion)
- Les logs montrent qui a fait quoi (traçabilité)
- Les scripts ne peuvent pas accidentellement tout casser
**Création de l'utilisateur :**
```bash
# Créer un utilisateur (remplacez "monuser" par votre nom)
adduser monuser
# Le système vous demande :
# - Un mot de passe (FORT, 20+ caractères)
# - Des infos optionnelles (nom complet, etc.) - appuyez sur Entrée pour ignorer
# Ajouter l'utilisateur au groupe sudo (droits administrateur)
usermod -aG sudo monuser
# Vérifier que l'utilisateur est bien dans le groupe sudo
groups monuser
# Sortie attendue : monuser : monuser sudo
```
**💡 Note :** Choisissez un nom d'utilisateur :
- Simple et court (ex: votre prénom)
- Pas "admin" ou "user" (trop prévisible pour les attaquants)
- Sans caractères spéciaux
### Étape 4 : Configurer l'authentification par clé SSH
**Pourquoi ?** Les mots de passe peuvent être :
- Devinés par force brute (des milliers de tentatives par jour)
- Interceptés sur un réseau compromis
- Oubliés ou réutilisés
Les clés SSH sont :
- Mathématiquement impossibles à deviner (256 bits d'entropie)
- Jamais transmises sur le réseau (seule une signature l'est)
- Uniques par machine (pas de réutilisation)
**⚠️ Si votre hébergeur (Type B) a déjà configuré une clé SSH à la création du VPS, SAUTEZ CETTE ÉTAPE**
---
**1️⃣ Sur votre machine locale (pas le VPS) : Créer ou vérifier votre clé SSH**
```bash
# Vérifier si vous avez déjà une clé SSH
ls -la ~/.ssh/id_*.pub
# Si vous voyez "id_ed25519.pub" ou "id_rsa.pub", vous avez déjà une clé ✅
- Installe automatiquement les mises à jour de sécurité
- Redémarre si nécessaire à 3h du matin
**⚠️ Important pour les sites critiques :**
Si vous avez un site haute disponibilité, configurez plutôt `Automatic-Reboot "false"` et faites les redémarrages manuellement pendant les maintenances planifiées.
---
## Installation d'un serveur web
### Étape 9 : Installer Apache
**Pourquoi Apache ?**
- **Robuste** : Utilisé depuis 1995, tourne sur 30% des sites web mondiaux
- **Mature** : Énormément de documentation et tutoriels
systemctl enable apache2 # Active au démarrage du serveur
systemctl status apache2 # Vérifie que tout fonctionne
# Type B
sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl status apache2
# Résultat attendu :
# ● apache2.service - The Apache HTTP Server
# Loaded: loaded
# Active: active (running)
```
---
**3️⃣ Tester Apache**
**Depuis votre navigateur :**
- Allez sur `http://<adresse-IP-du-VPS>`
- Vous devriez voir la page "Apache2 Debian Default Page"
**✅ Ça fonctionne ?** Parfait, Apache écoute sur le port 80 !
**❌ Erreur de connexion ?** Vérifiez :
```bash
# Le pare-feu autorise-t-il le port 80 ?
sudo ufw status | grep 80
# Apache est-il bien démarré ?
sudo systemctl status apache2
# Apache écoute-t-il sur le port 80 ?
sudo netstat -tlnp | grep :80
```
---
### Étape 10 : Configurer un nom de domaine
**Pourquoi ?** Une adresse IP (`185.123.45.67`) c'est difficile à retenir et peu professionnel. Un nom de domaine (`monsite.com`) :
- Est mémorable pour vos visiteurs
- Permet d'obtenir un certificat SSL
- Donne une image professionnelle
- Facilite les migrations de serveur (changez l'IP sans changer l'URL)
**Prérequis :** Avoir acheté un nom de domaine chez un registrar (OVH, Infomaniak, Namecheap, Gandi, etc.)
---
**1️⃣ Configurer les DNS chez votre registrar**
Connectez-vous à votre registrar et créez ces enregistrements DNS :
```
Type Nom Valeur TTL
A @ <adresse-IP-du-VPS> 3600
A www <adresse-IP-du-VPS> 3600
```
**Explications :**
- **Type A** : Associe un nom de domaine à une adresse IPv4
- **@** : Représente le domaine racine (example.com)
- **www** : Sous-domaine (www.example.com)
- **TTL** : Durée de cache (3600 = 1 heure)
**💡 Astuce :** Certains registrars proposent un enregistrement CNAME pour `www` qui pointe vers `@`. Ça fonctionne aussi !
---
**2️⃣ Attendre la propagation DNS**
**Pourquoi attendre ?** Les DNS sont distribués mondialement. Votre modification doit :
- Se propager aux serveurs DNS racine
- Se propager aux serveurs DNS de votre FAI
- Se propager aux DNS publics (Google, Cloudflare, etc.)
**Durée :** 5 minutes à 24 heures (généralement 30 min)
**Vérifier la propagation depuis votre machine locale :**
```bash
# Vérifier que le domaine pointe vers votre VPS
nslookup example.com
# Résultat attendu :
# Address: <IP-de-votre-VPS>
# Alternative avec dig (plus détaillé)
dig example.com +short
# Doit afficher : <IP-de-votre-VPS>
# Vérifier www aussi
nslookup www.example.com
```
**✅ Ça affiche votre IP ?** Vous pouvez passer à l'étape suivante
**❌ Ça affiche une autre IP ou rien ?** Attendez encore un peu ou vérifiez votre configuration DNS
### Étape 11 : Configurer un site avec Apache
**Pourquoi un VirtualHost ?** Apache peut héberger plusieurs sites sur le même serveur. Chaque site a son propre VirtualHost (configuration séparée). C'est comme avoir plusieurs appartements dans un immeuble.
---
**1️⃣ Créer le dossier du site**
```bash
# Type A (root)
mkdir -p /var/www/monsite
chown -R monuser:monuser /var/www/monsite
echo "<h1>Mon site fonctionne !</h1>" > /var/www/monsite/index.html
# Type B (sudo) - Remplacez "ubuntu" par votre utilisateur
sudo mkdir -p /var/www/monsite
sudo chown -R ubuntu:ubuntu /var/www/monsite
echo "<h1>Mon site fonctionne !</h1>" > /var/www/monsite/index.html
```
**Pourquoi chown ?** Par défaut, les fichiers créés par root appartiennent à root. `chown` change le propriétaire pour que VOTRE utilisateur puisse modifier les fichiers sans sudo.
---
**2️⃣ Créer la configuration Apache (VirtualHost)**
```bash
# Type A
vim /etc/apache2/sites-available/monsite.conf
# Type B
sudo vim /etc/apache2/sites-available/monsite.conf
```
**Copiez-collez cette configuration :**
```apache
<VirtualHost*:80>
# Nom de domaine principal
ServerName example.com
# Alias (www.example.com pointe vers le même site)
ServerAlias www.example.com
# Dossier racine du site
DocumentRoot /var/www/monsite
# Configuration du dossier
<Directory/var/www/monsite>
# Options :
# -Indexes : NE PAS lister les fichiers si pas d'index.html (sécurité)
# +FollowSymLinks : Autoriser les liens symboliques
Options -Indexes +FollowSymLinks
# AllowOverride All : Permet l'utilisation de fichiers .htaccess
# (utile pour WordPress, Laravel, etc.)
AllowOverride All
# Require all granted : Autoriser l'accès public
Require all granted
</Directory>
# Fichiers de logs séparés par site (facilite le debug)