Sécuriser son serveur Linux sous Ubuntu

Linux juin 01, 2020

Cet article traite d'un sujet nécessitant de bonnes connaissances en informatique.

Vous venez d'acquérir un serveur VPS ou dédié Linux ? Se pose maintenant la question de la sécurisation. Les serveurs sont une cible très facile s'ils ne sont pas sécurisés, et l'on ne sait souvent pas par où commencer pour le sécuriser. Ayant moi aussi été dans le flou il y a quelques mois, je vais vous donner mes astuces pour sécuriser votre serveur un minimum !

Attention, avant de débuter, quelques points à avoir en tête. Tout d'abord, vous devez avoir un minimum de connaissances sur l'utilisation de Linux, et devez comprendre tout ce que vous faites. Ne recopiez surtout pas ce que j'explique sans comprendre. Notez également que je ne suis pas expert en cybersécurité - et loin de là. N'hésitez pas à me corriger via les commentaires si nécessaire :)

Prérequis

Tout d'abord, les solutions présentées dans cet article ont été testées sur Ubuntu Server 18.04. Elles devraient normalement fonctionner sur les autres versions de ce système d'exploitation, ainsi que les autres distributions Linux Debian-like, et peuvent être adaptés aux autres distributions. Vous devez donc disposer d'un serveur Linux avec une connexion SSH active et un accès root. Je vous recommande l'utilisation de Termius comme client SSH.

Termius
The #1 cross-platform terminal with built-in ssh client which works as your own portable server management system in any situation.

Sécurisation basique des accès à son serveur

Lorsque vous recevez un nouveau serveur, il est souvent associé à un accès au compte root, ayant les droits d'administration. Dans cette première partie, nous allons nous occuper des comptes utilisateurs de votre serveur, ainsi que de l'accès à ce dernier.

Sécurisation du compte root

L'utilisateur root est le compte "super-administrateur" de votre serveur : il a toutes les permissions. Ce compte est donc logiquement celui à sécuriser en priorité. Pour commencer, nous allons lui définir un mot de passe fort, c'est-à-dire d'une vingtaine de caractères, avec lettres, chiffres et caractères spéciaux "aléatoires" (par exemple [email protected]?$S8CM6v=2h-*kDx). Je vous recommande d'utiliser un gestionnaire de mots de passe pour le stocker. Pour changer le mot de passe, effectuez la commande suivante :

$ passwd

Création d'un nouvel utilisateur

Tout adepte de Linux vous le dira : il ne faut jamais se connecter directement en root. Dans le cas d'un serveur, ce compte est aussi celui privilégié par les attaquants pour tenter de prendre son contrôle, à cause de ses permissions avancées. Pour résoudre cela, créons un nouvel utilisateur !

$ adduser username

La commande adduser, suivie d'un nom d'utilisateur, permet de créer un nouvel utilisateur. Il vous sera demandé de choisir un mot de passe solide: chiffres, lettres et caractères spéciaux. Concernant les autres valeurs (nom, adresse, ...), laissez les vides. Une fois ceci fait, donnons les droits d'administration à notre utilisateur.

$ usermod -aG sudo username

Désormais, l'utilisateur a les droits d'administration. Pour effectuer une commande en administrateur, précédez-la de l'instruction sudo. Nous allons désormais nous connecter à cet utilisateur: su username.

Configuration du SSH

L'accès à votre serveur se fait par le protocole SSH. Nous allons donc améliorer la sécurité de cet accès en changeant le port d'écoute et en interdisant la connexion directe au compte root. La configuration du ssh est située dans le fichier /etc/ssh/sshd_config. Nous allons pour cela utiliser l'éditeur de texte nano (mais tout autre ferait l'affaire) : nano /etc/ssh/sshd_config.

Nano, l’éditeur de texte du débutant
Linux est un système d’exploitation qui fait tourner les programmes de votre machine, à l’instar de Windows et Mac OS X. Créé par des communautés de passionnés d’informatique, il vous donne un contrôle sans précédent sur votre machine... et il est gratuit !

Vous devriez trouver une ligne Port 22. Remplacez ce nombre par celui que vous voulez, en prenant garde de ne pas choisir un port utilisé par un autre service (80, 443, et j'en passe). Si la ligne est précédée d'un hashtag (#), supprimez-le. Passez également la valeur de PermitRootLogin à no pour empêcher de se connecter directement en root.

Redémarrez le service SSH avec la commande service ssh restart, puis vérifier que la configuration marche en ouvrant une nouvelle connexion à votre serveur. Ne fermez surtout pas la connexion active, en cas de mauvaise configuration, vous risquez de perdre l'accès à votre serveur.

Mise en place d'un pare-feu

La configuration d'un pare-feu est quelque chose de très important pour bloquer les attaques extérieures sur votre serveur. Heureusement, il existe quelques outils pour vous faciliter la tache !

ufw: le pare-feu simplifié

Le pare-feu de référence se nomme iptables, mais sa configuration peut être un peu austère pour un débutant. Heureusement, il existe ufw, une alternative très simple pour mettre en place son pare-feu (ufw signifie "Uncomplicated Firewall"). Voyons comment ça fonctionne !

Nous allons configurer le pare-feu pour bloquer toutes les connexions, sauf sur le port du ssh (j'utiliserai le port 22, à vous de l'adapter avec votre configuration). Lorsque vous souhaiterez ouvrir un port, il faudra refaire la même commande, mais n'ouvrez que le strict minimum pour améliorer la sécurité de votre serveur.

# Par défaut, tout est bloqué. Autorisons le port 22.
$ ufw allow 22

# Maintenant, activons le pare-feu.
$ ufw enable

Voilà, c'est fait ! Vous pouvez afficher la liste des règles du pare-feu avec la commande ufw status. Ce pare-feu peut faire des choses bien plus complexes, consultez cette page du wiki Ubuntu pour apprendre à l'exploiter entièrement.

fail2ban: bloquez les attaques bruteforce

Une fois votre serveur lâché dans la nature, votre serveur risque de se faire attaquer par des robots tentant de percer ses défenses. En effet, certaines personnes malintentionnées tentent de rentrer dans les serveurs mal sécurisés de manière automatique en testant tous les mots de passe possibles : cette technique s'appelle la bruteforce.

Afin de contrer ces menaces, un outil très simple existe : fail2ban. Le fonctionnement est (en partie) dans le nom : au bout d'un certain nombre de tentatives de connexions infructueuses de connexion, l'adresse IP de l'attaquant est bloquée.

fail2ban/fail2ban
Daemon to ban hosts that cause multiple authentication errors - fail2ban/fail2ban

Tout d'abord, installons fail2ban : apt install fail2ban. Vous pouvez vérifier son bon fonctionnement à l'aide de la commande service fail2ban status.

La configuration de fail2ban est contenue dans le dossier /etc/fail2ban/. Nous pouvons d'ores et déjà créer un fichier jail.local qui correspondra à la configuration locale des "prisons" (combinaison de règles de détection et d'actions pour un service donné).

# Structure de /etc/fail2ban/

fail2ban.conf  # Fichier de configuration global
filter.d/
    └─ *.conf  # Règles de détection des erreurs d'authentification
action.d/
    └─ *.conf  # Actions à affectuer pour bannir une IP
jail.conf      # Configuration par défaut des "prisons"
jail.local     # Configuration locale des "prisons"

Je vous incite très fortement à jeter un coup d'œil à tous ces fichiers, principalement à jail.conf. Ce dernier contient plein d'informations sur la configuration des prisons. Vous remarquerez que fail2ban contient par défaut de nombreuses règles de détection pour différents services, et un grand nombre d'actions de bannissement différentes.

Exemple de configuration de jail.local

Nous allons désormais configurer le fichier jail.local. Prenons l'exemple ci-dessus. La section [DEFAULT] contient les règles s'appliquant à toutes les prisons. Dans ce cas, l'ip 127.0.0.1 est ignorée, et les attaquants sont bannis pendant 12h (bantime) après 3 tentatives de connexion échouées (maxretry) en moins de 20 min (findtime).

Vous remarquerez aussi que la "prison" sshd (correspondant au ssh) a été activée avec enlabed = true. La configuration de cette dernière est contenue dans jail.conf (je vous recommande d'aller la lire), mais dans l'exemple certains paramètres ont été modifiés : le port concerné est 2222 et le bannissement se fait au bout de 5 tentatives infructueuses de connexion.

Afin de valider la configuration, sauvegardez le fichier et relancez fail2ban avec la commande service fail2ban restart. Vérifiez que la configuration a bien été prise en compte en effectuant fail2ban-client status.

N'oubliez pas de regarder tous les services pré-configurés disponibles, il y en a pour tous les usages courants (apache, nginx, ftp et j'en passe) ! Je vous recommande la lecture de la page consacrée à fail2ban sur le wiki Ubuntu-FR pour plus d'informations sur ce logiciel : https://doc.ubuntu-fr.org/fail2ban

Les mises à jour automatiques

L'un des principaux fléau en matière de sécurité informatique, ce sont les failles de sécurité. Aucun logiciel n'est épargné. Heureusement, la plupart sont maintenus par leurs créateurs ou la communauté, et des correctifs sont régulièrement déployés. D'où l'importance de garder ses paquets à jour !

unattended-upgrades, la solution clé-en-main

La manière la plus simple de mettre à jour automatiquement ses paquets est probablement unattended-upgrades. Ce petit programme se chargera d'installer la dernière version de vos logiciels chaque jour sans intervention.

Pour l'installer, rien de plus simple : apt install unattended-upgrades. La configuration par défaut convient à la plupart des installations, mais vous pouvez la modifier si nécessaire (cet article explique l'utilisation de ce logiciel plus en détail).

mvo5/unattended-upgrades
Automatic installation of security upgrades on apt based systems - mvo5/unattended-upgrades

livepatch, les mises à jour de sécurité sans redémarrage

Quoi de pire que de devoir redémarrer son serveur pour installer les mises à jour de sécurité d'Ubuntu, pourtant nécessaires ? Canonical Livepatch, un outil édité par la société mère d'Ubuntu, permet d'installer automatiquement les mises à jour de sécurité sans avoir à redémarrer votre machine.

Canonical Livepatch Service | Ubuntu
Automatic Linux kernel updates for Ubuntu 16.04, 18.04 and 20.04 LTS. Apply critical patches without rebooting and keep your systems secure and compliant.

Le service est commercial, mais est disponible gratuitement jusqu'à trois machines. Il vous suffit de vous créer un compte Ubuntu One, d'obtenir votre token d'accès et d'installer livepatch en suivant les (simples) instructions. C'est fait !

Un audit de votre système avec Lynis

Pour avoir un serveur le plus sécurisé possible, il faut prendre en compte de nombreux éléments, que je ne saurait détailler dans un article de ce type. C'est pour cela qu'a été créé le logiciel Lynis, qui permet de réaliser un audit de votre système et de détecter les problèmes de sécurités les plus courants (plus de 200 tests réalisés tout de même !).

Lynis - Security auditing and hardening tool for Linux/Unix
Security auditing tool for Linux, macOS, and other Unix-based systems.

L'installation de Lynis se fait comme tout autre paquet, avec la commande apt install lynis. Une fois installé, lancez simplement la commande lynis audit system pour réaliser un audit du système.

Résumé d'un audit Lynis

Une fois l'audit terminé, un score de sécurité de votre serveur s'affichera, avec le nombre de problèmes critiques et de suggestions. Remontez pour consulter les problèmes, et corrigez-les !

Et ensuite ?

Cet article arrive à sa fin, mais ne croyez pas qu'il en va de même pour la sécurisation de votre serveur ! En effet, la gestion d'un serveur est quelque chose à faire en continu, notamment lors de l'installation de nouveaux logiciels. A chaque installation, respectez scrupuleusement les consignes de sécurité, et adaptez la configuration de vos pare-feux.

Bien évidemment, la sécurité est quelque chose de très complexe, et cet article ne constitue qu'une introduction à ce sujet. Ci-dessous, je vous ai sélectionné quelques ressources complémentaires sur le sujet. J'écrirais peut-être des articles moins généralistes ci-cela est demandé !


N'hésitez pas à me faire part de vos remarques sur cet article via les commentaires (ci-dessous) ou en m'envoyant un message sur mon Twitter.

Super ! Vous vous êtes inscrit avec succès.
Super ! Effectuez le paiement pour obtenir l'accès complet.
Bon retour parmi nous ! Vous vous êtes connecté avec succès.
Parfait ! Votre compte est entièrement activé, vous avez désormais accès à tout le contenu.