Comment sécuriser votre serveur : un guide en 5 étapes
Il y a plusieurs raisons pour lesquelles un développeur souhaiterait gérer ses propres serveurs. Les serveurs, en particulier les VPS (Virtual Private Server), sont des ressources devenues très abordables. Ils nous permettent de tester, builder, héberger nos projets et de faire encore plein d'autres choses.
Quelle que soit l'utilisation que l'on fait d'un serveur, celui-ci doit être protégé, car une intrusion malhonnête pourrait avoir de graves répercussions. Dans cet article, je vous explique comment sécuriser un VPS simplement en 5 étapes.
1/ Mettre votre système à jour
Cela peut vous sembler basique, mais l'une des premières raisons pour lesquelles on trouve des failles sur les serveurs web est l'obsolescence du système. Ne pas mettre à jour son système régulièrement est un vrai danger pour notre business.
Même si vous venez de demander l'installation de votre VPS à votre hébergeur, vous gagnerez à actualiser votre système avant de passer à la suite de cet article. En effet, les hébergeurs utilisent souvent des sauvegardes ou des snapshots pour créer de nouveaux serveurs. Il y a donc de fortes chances pour que les paquets de votre système aient besoin de mise à jour.
Exécuter les commandes suivantes :
$ sudo apt update
$ sudo apt upgrade -y
2/ Changer le mot de passe root
Je ne suis pas sûr que cela soit utile de l'expliquer. Changez votre mot de passe root
.
$ sudo su
$ passwd
New password:
Retype new password:
passwd: password updated successfully
$ exit
Le compte root
est le compte du « super-administrateur ». Il a tous les droits. S'il y a un compte que l'on refuse de laisser aux mains des hackers, c'est bien celui-là.
Mais changer le mot de passe du compte root
n'est pas suffisant. Vous verrez que nous allons un peu plus loin dans la suite de l'article.
3/ Créer un nouvel utilisateur
Une autre astuce pour éviter les problèmes sur votre serveur : n'utilisez pas root
. Il y a au moins deux raisons à cela :
- tout le monde à un utilisateur
root
sur sa machine par défaut. C'est facile à trouver pour un hackeur root
possède tous les droits sur la machine. Si une personne trouve le mot de passe du compteroot
, il peut tout faire sur la machine
La meilleure solution pour contrer ce problème reste donc d'utiliser un compte différent pour la gestion de votre machine. Pour ce faire, utilisez la commande suivante :
$ adduser nomDeVotreUser
Adding user `nomDeVotreUser' ...
Adding new group `nomDeVotreUser' (1001) ...
Adding new user `nomDeVotreUser' (1001) with group `nomDeVotreUser' ...
Creating home directory `/home/nomDeVotreUser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for nomDeVotreUser
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
Après avoir répondu à toutes les questions de l'utilitaire, indiquons au système que ce nouvel utilisateur pourra effectuer des actions dédiées au super utilisateur sans en être un.
L'idée est de pouvoir dire « je ne suis pas super utilisateur, ne me donne aucun droit » mais temporairement, lorsque la situation l'exige, dire au système « en fait, c'est moi le super utilisateur, laisse-moi effectuer cette action ».
$ adduser nomDeVotreUser sudo
sudo adduser nomDeVotreUser sudo
Adding user `nomDeVotreUser' to group `sudo' ...
Adding user nomDeVotreUser to group sudo
Done.
Maintenant, vous pourrez taper sudo command
depuis votre nouveau compte utilisateur sans recevoir un refus du système. Vous pouvez aussi vous connecter en SSH directement avec cet utilisateur.
4/ Modifier les accès SSH
À présent que seul vous connaissez le mot de passe du compte root
et que vous ne l'utilisez plus pour vous connecter au serveur, il est temps d'aller un peu plus loin.
Quels sont les problèmes que l'on pourrait rencontrer ? Le brut force. Vous n'utilisez plus le compte root
mais il est toujours utilisable. Utiliser des mots de passe générés aléatoirement jusqu'à ce qu'il y en ait un qui marche, est une méthode qui fonctionne encore aujourd'hui.
La méthode fonctionnerait d'ailleurs tout autant sur le second compte que nous avons créé plus haut.
Pour remédier à cela, nous allons modifier quelque peu la configuration SSH pour nous connecter avec une clé RSA plutôt qu'un mot de passe. Pour pouvoir vous connecter avec une clé, il vous faut tout d'abord une clé.
Générons donc la nôtre sur notre ordinateur local (pas le serveur).
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t
permet d'indiquer le type de clé que l'on veut créer. Nous voulons une clé RSA-b
permet d'indiquer la taille de la clé. J'ai l'habitude de mettre 4 096 pour qu'elle soit deux fois plus longue, complexe et solide que celles de 2 048 bites par défaut. Mais, vous pouvez mettre la taille que vous voulez. Dites-vous juste que selon la puissance de votre ordinateur, plus vous demanderez une clé longue plus ça prendra du temps de la générer.-C
permet d'y ajouter un commentaire pour faciliter votre organisation
La commande vous demandera une passphrase. C'est-a-dire une phrase qu'il faudra indiquer pour pouvoir utiliser la clé. Un genre de mot de passe pour protéger la clé. Vous pouvez ne pas en mettre, mais il est fortement recommandé d'en mettre une.
Une fois la clé générée, vous retrouverez deux nouveaux fichiers sur votre machine locale.
$ ls ~/.ssh
id_rsa id_rsa.pub
id_rsa
est votre clé privée. À ne communiquer sous aucun prétexte. Elle ne doit pas sortir de votre machine et vous permet de déchiffrer les données que l'on vous envoie.id_rsa.pub
est la version publique de votre clé. À communiquer à ceux avec qui vous souhaitez communiquer. Elle ne permet pas de déchiffrer les données, mais seulement de les chiffrer. En d'autres termes, elle permet d'écrire des messages que seule votre clé privée peut déchiffrer.
Comme je viens de le dire, la clé privée ne bougera pas de votre machine. Toutefois, pour pouvoir communiquer avec le serveur, il faut que le serveur ait votre clé publique. Il faut donc que nous lui envoyions.
Pas besoin d'ouvrir le fichier et de copier-coller quoi que ce soit, il y a une commande pour ça :
$ ssh-copy-id -i ~/.ssh/id_rsa nomDeVotreUser@ipDuServeur
Cette commande va créer le dossier ~/.ssh
dans le compte de votre utilisateur sur le serveur. Ensuite, il va créer le fichier ~/ssh/authorized_keys
dans lequel il ajoutera la clé publique liée à la clé privée id_rsa
.
Normalement, cette commande envoie toutes les clés publiques de votre machine locale sur le serveur. Pour éviter cela, nous utilisons -i
afin de lui indiquer quelle clé envoyer.
Vous pouvez maintenant vous connecter sans mots de passe au serveur en faisant ssh nomDeVotreUser@ipDuServeur
. Seule la passphrase vous sera demandée si vous en avez indiqué une.
Comme il est possible de se connecter sans mots de passe, il ne nous reste plus qu'à désactiver la connexion avec mots de passe. Ainsi, le risque de brute force sera éliminé. Pour cela, sur le serveur, modifiez les lignes suivantes du fichier /etc/ssh/sshd_config
pour qu'elles aient ces valeurs :
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
Avec ces réglages, il sera impossible de se connecter avec le compte root
que l'on connaisse son mot de passe ou pas. Tous les autres comptes seront inaccessibles avec un mot de passe, mais accessibles si l'on possède la bonne clé RSA.
Dernier détail, le port standard utilisé par SSH est le 22. C'est-à-dire que tout le monde connait ce port. Pour rendre l'accès un peu plus compliqué, une bonne pratique consiste à change ce port pour une valeur entre 1 024 et 6 665.
Dans le même fichier /etc/ssh/sshd_config
, modifier la ligne suivante avec la valeur de votre choix :
Port 5489
Pour valider ces changements, il faut relancer l'agent SSH comme suit :
$ sudo systemctl restart ssh
Votre serveur ressemble maintenant un peu plus à une forteresse. ssh nomDeVotreUser@ipDuServeur
ne fonctionnera plus. Vous devrez, en plus de l'utilisateur et de l'IP, indiquer le port que vous avez choisi précédemment. Le mot de passe ne sera pas demandé, il faudra la clé RSA pour pouvoir se connecter.
$ ssh nomDeVotreUser@ipDuServeur -p 2345 -i ~/.ssh/id_rsa
Enter passphrase for key '~/.ssh/id_rsa':
5/ Activer un firewall
Le firewall permet de contrôler qui peut se connecter à votre serveur et comment. L'idée est d'éviter de laisser des fenêtres ouvertes dans notre forteresse. Nous allons donc spécifier explicitement ce que nous autorisons comme connexion à notre serveur.
La plupart des distributions Linux possèdent iptables
et ufw
installés par défaut. Moi, j'utilise UFW. Je vais donc vous expliquer les règles de base que j'applique pour la sécurité de mes serveurs. Pour en savoir plus sur le fonctionnement de cet outil, je vous conseille cet article de DigitalOcean.
On commence par désactiver le firewall le temps de faire nos modifications :
$ sudo ufw disable
Ensuite, je change les règles par défaut pour que toutes les connexions entrantes soient refusées et toutes les connexions sortantes autorisées :
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
Ensuite, nous allons autoriser les connexions SSH. Sinon, nous n'aurons plus moyen de nous connecter au serveur.
$ sudo ufw allow 2345/tcp
Changez 2345
par le port que vous avez choisi pour SSH à l'étape précédente.
Maintenant, nous pouvons activer le firewall.
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Comme nous n'utilisons plus le port par défaut de SSH, si vous avez encore des connexions utilisant le port 22 (sur un autre terminal par exemple), UFW vous prévient que vous risquez de perdre votre connexion.
Désormais, vous avez toutes les bases pour sécuriser vos serveurs. Il y a bien sûr beaucoup d'autres choses que l'on peut implémenter pour sécuriser un serveur, mais avec les 5 étapes de cet article, vous aurez un serveur beaucoup moins vulnérable aux attaques.
J'ai également préparé pour ceux qui le souhaitent un print qui reprend toutes les commandes de cet article, un glossaire et une explication des changements du fichier sshd_config
. Rien de plus que ce qu'il y a dans cet article, mais l'idée est d'avoir un résumé des commandes (cheatsheet) pour rapidement sécuriser votre serveur.
Si vous êtes membre premium du blog, connectez-vous et téléchargez-le ci-dessous. Sinon, vous pouvez retrouver « VPS/serveur security cheatsheet » sur la boutique pour l'acheter sans devenir membre premium :
La version anglaise du PDF est à retrouver directement sur la boutique ou sur le site du club.