Voici les étapes que je suis pour configurer un VPS acheté sur OVH.

Acheter un VPS

La plupart du temps, le premier tier me suffit. Il me donne accès à un serveur doté de 8Go de RAM et 75Go de disque pour moins de 8€/mois.

Je n’ajoute aucune option supplémentaire et installe toujours la dernière LTS d’Ubuntu en date.

Une fois l’achat effectué, OVH envoie un mail avec le mot de passe pour la première connexion, qui devra être changé immédiatement.

Accès root

Contrairement à beaucoup de fournisseurs, OVH désactive dès l’installation la connexion en tant que root.

Le système génère à la place un utilisateur portant le nom de la distribution choisie et ayant des autorisations élevées.

C’est une bonne chose et c’est une étape de moins à suivre pour la sécurisation de notre serveur.

Première connexion

Il est temps d’accéder à notre serveur.

ssh ubuntu@ip_du_serveur

Mise à jour du système

La priorité est de mettre à jour le système afin de profiter des derniers patchs de sécurité.

sudo apt update && sudo apt upgrade

Activer la connexion via SSH

L’utilisation d’une clé SSH pour accéder à notre serveur est bien plus sécurisée qu’une approche par mot de passe. Nous allons donc générer une paire de clés pour accéder au serveur depuis notre machine locale.

Générer une nouvelle paire de clé

Sur les machines Linux, l’utilitaire ssh-keygen permet de générer des clés. Il accepte plusieurs paramètre ayant leur importance.

-t ed25519 # permet de spécifier le type de clé à créer. ed25519 est considéré comme le plus sûr et doit donc être privilégié.
-a 100 # ajoute de l'entropie à la génération de la clé privée, ce qui rend le crackage par brute-force plus long si la clé été volée, au prix d'un temps également plus long pour vérifier la passphrase. La valeur est 16 par défaut.
-f ~/.ssh/output_file # beaucoup de personnes génèrent une clé par machine qu'elles utilisent pour tout. Je préfère pour ma part générer une clé pour chaque machine distante. Je spécifie donc un fichier de sortie.
-C commentaire # permet d'ajouter un commentaire à la fin de la clé publique, ce qui est pratique pour savoir à quoi correspond la clé. 

La commande finale est donc la suivante.

ssh-keygen -t ed25519 -a 100 -f ~/.ssh/ovhcloud -C PC_PERSO_OVHCLOUD

Copier la clé nouvellement générée sur le serveur distant.

ssh-copy-id -i ~/.ssh/ovhcloud.pub ubuntu@ip_du_serveur

Vérifier que tout s’est bien passé en tentant une nouvelle connexion.

ssh  ubuntu@ip_du_serveur

Un prompt demandant la passphrase de la clé devrait apparaître. Une fois sur le serveur, nous pouvons vérifier que notre clé publique est bien présente dans ~/.ssh/authorized_keys.

Renforcer la sécurité de la connexion SSH

Maintenant que nous pouvons accéder à de façon sécurisée à notre serveur via notre clé SSH, nous pouvons désactiver l’authentification par mot de passe pour encore plus de sécurité. Nous allons également modifier le port utilisé par SSH sur le serveur, pour éviter d’utiliser le port par défaut (22).

Attention

Une fois l’authentification par mot de passe désactivée, le seule moyen d’accéder au serveur depuis de nouvelles machines sera de copier la clé public de la machine sur le serveur depuis un poste y ayant déjà accès.

Nous allons éditer le fichier de configuration SSH du serveur.

sudo vim /etc/ssh/sshd_config

Rechercher les lignes suivantes.

#PasswordAuthentication yes

Et la remplacer par

PasswordAuthentication no

Redémarrer le service pour appliquer la nouvelle configuration.

sudo systemctl restart ssh.service

Il faut à présent changer le port utilisé par SSH.

Pour Ubuntu 24.04 et ultérieures

Les commandes ci-dessous s’appliquent pour les versions récentes d’Ubuntu. Pour les versions plus anciennes, la configuration du port se modifie également dans /etc/ssh/sshd_config.

sudo vim /lib/systemd/system/ssh.socket

Rechercher la ligne suivante et remplacer par un port entre 49152 et 65535.

[Socket]
ListenStream=0.0.0.0:22

Enregistrer puis lancer les commandes suivantes pour appliquer la nouvelle configuration.

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

Depuis un nouveau terminal, vérifier que la connexion passe bien par le nouveau port

ssh ubuntu@ip_du_serveur -p nouveau_port

Pare-feu et fail2ban

Configurer iptables avec ufw

Il est temps de verrouiller un peu plus notre serveur en protégeant les ports inutilisés. Pour cela, j’utilise ufw. Cet utilitaire est déjà installé sur les distributions Ubuntu.

Les commandes à lancer sont les suivantes.

sudo ufw default deny incoming # interdire tout le trafic entrant
sudo ufw default allow outgoing # autoriser tout le trafic sortant
sudo ufw allow *mon_port_ssh*/tcp # autoriser les connexions sur le port SSH configuré précédemment
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp # autoriser les connexions sur le serveur web (à venir)
sudo ufw enable # activer la configuration

Port SSH

Assurez-vous de bien autoriser le port SSH et de ne pas vous tromper dans celui-ci, ou vous risqueriez de vous enfermer hors de votre serveur.

Installer fail2ban

fail2ban a pour objectif d’augmenter notre pare-feu, en lui ajoutant dynamiquement des règles lorsqu’il détecte des anomalies, comme des attaques brute-force sur un port spécifique.

Commençons par l’installer et créer un fichier de configuration.

sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local

La configuration suivante est un bon point de départ.

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
 
banaction = ufw
 
[sshd]
enabled = true
port = 50555
logpath = /var/log/auth.log

Activer la configuration en lançant les commandes suivantes.

sudo systemctl enable fail2ban  
sudo systemctl start fail2ban

Déployer un site statique

Maintenant que la sécurité de base est en place, passons au déploiement de notre site. Je documente ici le déploiement d’un site statique simple, similaire à celui affichant cette page. Le déploiement de sites dynamiques sera documenté sur d’autres pages, selon mes besoins.

Nom de domaine

Si ce n’est pas déjà fait, c’est un bon moment pour acheter un nom de domaine et ajouter un enregistrement DNS pointant vers l’IP de notre VPS.

J’achète mes domaines auprès d’OVH, pour les mêmes raisons que pour la location de serveur.

Installer et configurer nginx

Commençons par installer notre serveur web : nginx

sudo apt install nginx  

Créons un fichier de configuration, avec les informations minimum

sudo vim /etc/nginx/sites-available/mon-domaine.fr
mon-domaine.fr
server {
    listen 80;
    server_name mon-domaine.fr www.mon-domaine.fr;
    root /var/www/mon-domaine.fr;
    index index.html;
    error_page 404 /404.html;
    
    location / {
        try_files $uri $uri.html $uri/ =404;
    }
}

Il faut maintenant activer le site

sudo ln -s /etc/nginx/sites-available/mon-domaine.fr /etc/nginx/sites-enabled/  
sudo nginx -t  
sudo systemctl reload nginx

Déployer le site

Pas besoin de CI/CD complexe dans notre cas, le processus de déploiement de mon site sera un simple git clone sur le serveur.

La première étape est de générer une pair de clés SSH sur le serveur afin de s’identifier auprès de GitHub. Les étapes sont les mêmes qu’ici. Il suffit ensuite d’ajouter la clé publique dans GitHub.

Nous allons à présent cloner le projet sur le serveur.

cd /var/www
mkdir mon-domaine.fr
sudo chown $USER:$USER mon-domaine.fr
git clone git@github.com:your_username/mon-domaine.fr.git

Et voilà notre site est normalement accessible. Mais il reste encore beaucoup à faire.

HTTPS avec Certbot et Let’s Encrypt

Certbot est un outil qui va se charger de générer et maintenir à jour nos certificats SSL automatiquement.

sudo apt update
sudo apt install python3 python3-dev python3-venv libaugeas-dev gcc
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
sudo /opt/certbot/bin/pip install certbot certbot-nginx
sudo ln -s /opt/certbot/bin/certbot /usr/local/bin/certbot
sudo certbot --nginx

Un prompt va apparaître avec une série de questions. Une fois répondue, votre certificat est délivré et automatique configuré. Consultez /etc/nginx/sites-available/mon-domaine.fr pour voir la configuration ajoutée par Certbot.

Renouveler automatiquement les certificats

echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null