Une fois n'est pas coutume, je vais commencer par un avertissement.
Je pratique GNU/Linux depuis plusieurs décénies, mais j'ai toujours été coiffé d'un Fedora. Bref, je suis très expérimenté avec les systèmes RedHat/CentOS/Fedora, mais j'ai très peu de pratique avec les systèmes Debian/Ubuntu. Donc cet article est plus un aide mémoire pour mes futures installations qu'un cours théorique sur les bonnes pratiques dans cet environnement. Aussi j'invite les lecteurs plus expérimentés que moi à me laisser des commentaires pour corriger les éventuelles inexactitudes ou tout simplement me conseiller là où je n'ai pas été assez précis.
Dans cet article, nous allons donc voir comment configurer son VPS fraichement installé.
Introduction
Une fois le VPS prêt chez OVH, vous recevez un mail qui vous donne son nom, son adresse IP ainsi que le mot de passe administrateur.
Vous avez donc tout ce qu'il faut pour vous connecter en ssh au serveur VPS.
Il est à noter qu'à la création du VPS vous pouvez opter pour une connexion à l'aide d'une clé publique préalablement stockée dans votre tableau de bord OVH.
Changement du mot de passe root
Nous allons commencer par changer le mot de passe du root pour plus de sécurité.
Je vous conseille d'utiliser un gestionnaire de mots de passe comme BitWarden pour vous éviter d'avoir à le retenir.
Pour changer le mot de passe root, il suffit d'utiliser la commande suivante :
passwd
Le système vous demandera alors de saisir le mot de passe deux fois de suite afin d'éliminer tout risque d'erreur.
Réglage des locales
Lorsque le VPS est livré, du moins au moment où j'écris l'article, la configuration des locales n'est pas complète.
Voici comment y remédier. La commande suivante ouvre une interface qui permet de sélectionner le jeux de caractères régionaux.
dpkg-reconfigure locales
Nous devons sélectionner fr_FR.UTF-8 UTF-8 pour la France. Mais il peut-être utile de conserver également en_US.UTF-8 UTF-8. Avant de valider il faudra sélectionner fr_FR.UTF-8 UTF-8 comme locale par défaut.
Il faut noter que l'on peut aussi le faire manuellement en éditant le fichier de configuration /etc/locale.gen
Création d'un utilisateur
Il n'est pas question d'autoriser la connexion de l'utilisateur root par ssh, pour des raison évidentes de sécurité.
Nous allons donc créer un nouvel utilisateur qui nous permettra d'initier la connexion au serveur depuis notre machine personnelle.
Commençons par créer un groupe au nom de l'utilisateur :
addgroup --gid <id_groupe> <nom_groupe>
Dans l'exemple ci-dessus, outre le nom du groupe, nous précisions aussi le numéro du groupe.
Ce n'est pas obligatoire, mais ça peut se révéler pratique dans certains contextes.
Nous allons ensuite créer l'utilisateur :
adduser --uid <id_utilisateur> --gid <id_groupe> <nom_utilisateur>
Une fois la commande lancée, le système nous demande de saisir immédiatement un mot de passe pour le nouvel utilisateur, puis nous demande de rentrer des renseignements complémentaires, comme le nom complêt. Les renseignements complémentaires ne sont pas obligatoires, vous pouvez donc simplement appuyer sur [Entrée] à chaque nouvelle question.
Ajout de l'utilisateur « <nom_utilisateur> » ...
Ajout du nouvel utilisateur « <nom_utilisateur> » (<id_utilisateur>) avec le groupe « <nom_groupe> » ...
Création du répertoire personnel « /home/<nom_utilisateur> »...
Copie des fichiers depuis « /etc/skel »...
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd: password updated successfully
Changing the user information for <nom_utilisateur>
Enter the new value, or press ENTER for the default
Full Name []: <nom_complet>
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Cette information est-elle correcte ? [O/n]o
L'utilisateur est désormais créé. Mais il reste une étape importante avant de se connecter à son compte.
Il faut que notre utilisateur soit capable d'effectuer des taches d'administration sur la machine.
La commande suivante permet de l'ajouter au groupe des administrateurs :
adduser <nom_utilisateur> sudo
Nom de machine
Au stade où nous en sommes, le nom de la machine doit toujours être vpsxxxxxx.
J'imagine que vous avez une zone DNS à disposition et que nous allons changer le nom de la machine.
Nous allons commencer par afficher le nom actuel de la machine à l'aide de la commande suivante :
hostnamectl
Le résultat se présente de la manière suivante :
Static hostname: vpsxxxxxx
Icon name: computer-vm
Chassis: vm
Machine ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Boot ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Virtualization: kvm
Operating System: Debian GNU/Linux 9 (stretch)
Kernel: Linux 4.9.0-12-amd64
Architecture: x86-64
Pour changer le nom de la machine, il suffit de lancer la commande suivante :
sudo hostnamectl set-hostname <fqdn>
Il faut ensuite éditer le fichier /etc/hosts pour ajouter la ligne suivante :
127.0.0.1 <fqdn> <hostname>
Bien entendu, il faut remplacer <fqdn> par le nom complet de la machine en y incluant le domaine.
Et <hostname> par le nom de la machine sans le domaine.
Mise à jour de la distribution
Une des premières choses à faire est de mettre à jour la distribution, car nous ignorons à quel stade est l'image qui a servi à créer notre VPS.
Pour ce faire, nous devons lancer les deux commandes suivantes :
sudo apt update
sudo apt dist-upgrade
Si le noyau Linux ou l'image de démarrage a été mise à jour, il est temps de redémarrer le VPS.
sudo reboot
Installation du Firewall
Afin de commencer à sécuriser notre serveur, la première étape consiste à installer un pare-feu.
Nous allons utiliser Uncomplicated Firewall qui va nous simplifier le travail.
sudo apt install ufw
Avant d'activer le firewall, nous devons le configurer, car dans le cas contraire nous risquons de nous bloquer nous même en dehors de notre serveur et ne plus pouvoir communiquer avec lui.
Nous allons autoriser le ssh et les accès web en http et https.
Le ssh sera limité en nombre de connexions afin de limiter les attaques de type brute force.
sudo ufw limit 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Une fois le firewall configuré, nous pouvons l'activé et vérifier son status :
sudo ufw enable
sudo ufw status
La commande doit vous renvoyer la sortie suivante :
Status: active
To Action From
-- ------ ----
22/tcp LIMIT Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
22/tcp (v6) LIMIT Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
Nous devons ensuite définir le comportement par défaut du firewall.
En résumé, nous voulons limiter le trafic entrant aux ports que nous avons autorisé et accepter tout le trafic sortant sans restriction.
sudo ufw default deny incoming
sudo ufw default allow outgoing
Il faut ensuite recharger les règles du firewall.
sudo ufw reload
Configurer SSH
Nous allons sécuriser la connexion SSH en modifiant la configuration par défaut.
Notre choix se porte sur une méthode de connexion par clé RSA et nous allons configurer le daemon SSH afin de limiter strictement les connexion à ce mode. De plus nous allons refuser la connexion de l'utilisateur root.
Nous allons changer les paramètres suivants dans le fichier /etc/ssh/sshd_config
PermitRootLogin no
MaxAuthTries 3
PubkeyAuthentication yes
AllowUsers <nom_utilisateur>
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
Remplacez <nom_utilisateur> par le nom de votre utilisateur si vous souhaitez restreindre l'accès SSH à lui seul.
On peut également, pour des raisons de sécurité, changer le port sur lequel le serveur SSH va écouter. Mais dans ce cas, il faut prendre garde de configurer le firewall pour autoriser le trafic car, dans le cas contraire, on se ferme la porte au nez.
Configuration du Système
Nous allons maintenant modifier des paramètres dans le fichier /etc/sysctl.conf qui permet de modifier les paramètres du système d'exploitation.
Nous allons commencer par enlever les commentaires sur les lignes suivantes dans le but d'activer la protection contre l'usurpation d'adresse IP.
# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
Nous allons ensuite empêcher le ping sur notre serveur, désactiver les redirections, et toutes les fonctions réseaux réservées aux routeurs afin de nous protéger contre les attaques de type Man in the Middle.
# Do not accept ICMP redirects (prevent MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0
# Do not accept IP source route packets (we are not a router)
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# Log Martian Packets
net.ipv4.conf.all.log_martians = 1
Pour prendre en compte les nouveaux paramètres système, nous devons lancer la commande suivante :
sudo sysctl -p
Pour renforcer la protection contre l'usurpation d'adresse IP, nous allons maintenant éditer le fichier /etc/host.conf.
Il ne devra contenir que la ligne suivante :
nospoof on
Installation de Fail2Ban
Cet article date un peu... De nos jours, on préférera installer CrowdSec qui est un dispositif de ban d'IP basé sur une communauté d'utilisateurs qui s'échangent des informations sur les adresses à bannir.
Nous allons installer Fail2ban qui est un outil permettant de lutter contre les tentatives d'intrusion sur un serveur.
Fail2ban agit en banissant les adresses IP responsables des attaques sur le système. Nous pouvons définir le nombre de tentatives, et la durée de banissement pour l'ensemble des méthodes employées par les pirates.
Fail2Ban repose sur la lecture et l'analyse des journaux systèmes à la recherche d'erreurs d'authentification. Si un certain nombre de tentatives infructueuses émanent de la même adresse IP dans un lapse de temps donné, Fail2Ban ajoutera une règle iptable afin de mettre en quarantaine l'adresse en question.
Avec une telle protection sur notre serveur, on se protège des attaques de type force brute, et, dans une certaine mesure, des attaques par déni de service.
Pour installer Fail2Ban, il faut lancer la commande suivante :
sudo apt install fail2ban
Il faut ensuite activer le service et le lancer par la commande :
sudo systemctl --now enable fail2ban
Nous allons nous contenter de la configuration par défaut de Fail2Ban dans un premier temps.
Le paramétrage plus fin de Fail2Ban fera l'objet d'un autre article.
Redémarrage du serveur
A ce stade, nous pouvons redémarrer le serveur.