Published on

Sécuriser son serveur et ses services pour les nuls

 15 mins
Authors
  • avatar
    Name
    Léo Delpon
    Twitter

Comment sécuriser son VPS en 12 étapes

On a tous déjà voulu configurer et deployer un service dans un serveur que l'on possède (ou pas). Mais vient la phase de déploiement et une petite goutte de sueur commence à apparaître sur le côté de notre visage. C'est normal, le serveur que l'on possède (ou pas) n'est pas ou peu sécurisé. A tout moment, des bots venus du monde entier (Russie ou Chine) peuvent essayer de nous attaquer et prendre le contrôle de notre serveur si notre défense n'est pas à la hauteur (dédicace à mon pote Thomas avec son Raspberry 3 😉).

Pour éviter cela, je vous propose de sécuriser votre serveur en 12 étapes. Avec ça, bien évidemment cela ne suffira surement pas mais c'est déjà ça !

Avant de commencer, je vous conseille d'aller voir mon article sur le déploiement de Portainer sur un VPS et d'avoir quelques connaissances sur Docker ainsi que sur la cybersécurité notammment sur la mise en place de service tels que des IPS/IDS ou encore des firewalls.

0. Prérequis

Avant d'installer votre serveur et d'ouvrir des ports pour y accéder depuis l'extérieur, il est important de prendre quelques précautions. Il est recommandé de désactiver le port forwarding jusqu'à ce que votre système soit opérationnel et sécurisé. Assurez-vous également que SSH fonctionne pour permettre un accès à distance. Pensez à maintenir votre système à jour en effectuant régulièrement des mises à jour.

Il est également important de réaliser certaines tâches spécifiques à votre installation telles que:

  • la configuration du réseau,
  • la configuration des points de montage dans /etc/fstab,
  • la création des comptes utilisateurs initiaux et l'installation des logiciels de base.

Il est recommandé de configurer votre serveur pour envoyer des courriels afin de recevoir des alertes de sécurité importantes.

Il est conseillé de lire les repères du CIS ainsi que les les recommandations de l'ANSSI avant de commencer le guide pour comprendre leurs recommandations.

1. Monitorer son service grâce à portainer

Bien, maintenant que l'on a mis tout au clair, il est temps de passer à la pratique. En considérant que les services que l'on souhaite déployés soient conteneurisés, je vous propose un système de monitoring simple, rapide et efficace : portainer. En effet, il offre plusieurs avantages :

  1. Simplicité : Portainer est facile à utiliser et à configurer, ce qui en fait un choix populaire pour les utilisateurs débutants ou pour les entreprises qui cherchent une solution de gestion de conteneurs simple et efficace.
  2. Flexibilité : Portainer est compatible avec plusieurs environnements, y compris les environnements locaux, les environnements hébergés et les environnements multi-nœuds, ce qui en fait un choix flexible pour les entreprises de toutes tailles.
  3. Interface graphique : Portainer offre une interface graphique conviviale pour la gestion des conteneurs, ce qui permet aux utilisateurs de visualiser et de gérer facilement les conteneurs en cours d'exécution, les images et les réseaux.
  4. Monitoring en temps réel : Portainer permet un monitoring en temps réel des conteneurs, ce qui permet aux utilisateurs de surveiller les performances et la disponibilité des conteneurs.
  5. Automatisation : Portainer permet l'automatisation de certaines tâches, ce qui peut aider les entreprises à gagner du temps et à améliorer l'efficacité.

Si vous ne savez pas comment le configurer, je vous conseille de lire mon article sur comment installer portainer avec https en utilisant le service nginx qui sera lui aussi conteneurisé !

2. Sécuriser ses conteneurs

Passons à l'étape suivante, il est possible de créer des scripts que l’on pourra lancer en crontab permettant d’analyser les différents conteneurs lancés dans la machine physique. Plusieurs types de scripts peuvent être intéressants à mettre en place :

  1. Un script qui utilise le scanneur Clair qui permet une analyse statique. Il va analyser les images Docker pour trouver les vulnérabilités de sécurités dans des paquets utilisées par le microservice. Il peut être utilisé dans du CI/CD par exemple.

Il produit un rapport de vulnérabilité qui décrit les problèmes de sécurité trouvés dans l'image Docker analysée. Ce rapport peut inclure les informations suivantes :

  • La gravité de la vulnérabilité (par exemple, critique, élevé, modéré, faible, etc.)
  • La description de la vulnérabilité
  • Les informations de version du paquet ou de la bibliothèque vulnérable
  • Lesréférences vers les sources d'information supplémentaires (par exemple, le NIST National Vulnerability Database)
  • Des instructions sur la façon de corriger la vulnérabilité

Cela contribue à améliorer la sécurité de l'ensemble du système, en réduisant les risques d'attaques exploitant des vulnérabilités connues dans les images de conteneurs.

  1. Un script qui peut récupérer les logs du service qui est exécuté, nous pourrons voir les adresses IP sources qui semblent être suspectes. D'autres personnes ont déjà écrit des articles sur ce sujet mais si vous souhaitez aller plus loin, je vous invite à aller directement sur la documentation de docker

3. Réduire les accès du conteneur

Maintenant que l'on a quelques scripts pour monitorer les technologies qui permettent l'exécution de nos services, nous pouvons commencer à avoir une vision un peu plus micro. La plupart des conteneurs sont construits avec un accès root par défaut. Du point de vue de la sécurité, il s'agit bien évidemment d'une pratique discutable. Oui, le moteur d'exécution Docker nécessite des privilèges root pour fonctionner, mais pas les conteneurs. Certes, il est plus facile pour les développeurs d'exécuter les conteneurs en tant que root, mais l'accès root comporte toujours d'énormes risques. Nous pouvons ajouter par exemple dans notre Dockerfile que le conteneur s’exécutera en tant qu’utilisateur particulier :

FROM <base image> RUN groupadd -g 100 appuser && \ useradd -r -u 100 -g appuser appuser USER appuser #Rest of Dockerfile

Voici un article qui permet d'aller beaucoup plus loin, bien évidemment vous n'êtes pas obligé d'aller le voir mais ne vous plaignez pas si un jour une privilege escalation se passe dans un de vos conteneurs 😉.

4. Sécurisation de la machine physique (dans le cas où ce n'est pas un serveur dans le cloud 🙂 )

Chez les vrais cracks de la cybersécurité que j'ai pu rencontrer, ils avaient tous chiffrés leur disques durs. C'est quelque chose d'important dans le cas où on perd son ordinateur, on se le fait voler, on essaye de récupérer des données. De plus, il est très facile d'avoir accès à un ordinateur si le disque dur n'est pas chiffré. Si vous ne me croyez pas, je vous invite à lire ce petit tutoriel ainsi que celui-ci qui sont des tutoriels fait par moi-même et un ami pentester RJSOG

En cybersécurité le chiffrement DD d’une machine physique est une base fondamentale car permet d’éviter tout type de problèmes. Notamment les attaques physiques qui sont très simple à réaliser.

Il existe énormément d’utilitaires, projets pour chiffrer les données et disques.Chacun ne fonctionne pas au même niveau et ne permettent pas de chiffrer le même type de données. Ainsi on distingue :

  • Les solutions de chiffrement d’application comme DBMS, PGP, OpenSSL et Themis. Ces derniers chiffrent les flux de fichiers. L’application gère l’algorithme de chiffrement (AES, RSA) et l’utilisateur doit chiffrer l’accès au fichier.
  • Le chiffrement du système de fichiers ou Filesystem-level encryption (FBE) comme eCryptfs, ext4 encryption, fscrypt pour Linux. C’est le système de fichiers qui chiffrent les données quelque soit le type d’application utilisée.
  • Le chiffrement de disque ou par bloc comme LUKS/dm-crypt, BitLocker ou FileVault. C’est le niveau en dessous du système puisqu’il chiffre le disque au complet.
  • Enfin le chiffrement matérielle comme SED ou OPAL.
Untitled

5. Sécuriser le NTP client

De nombreux protocoles de sécurité tirent parti de l'heure. Si l'heure de votre système est incorrecte, cela peut avoir des répercussions négatives sur votre serveur. Un client NTP peut résoudre ce problème en maintenant l'heure de votre système en synchronisation avec les serveurs NTP mondiaux.

Comment ça fonctionne ?

NTP est l'abréviation de Network Time Protocol. Dans le contexte de ce guide, un client NTP sur le serveur est utilisé pour mettre à jour l'heure du serveur avec l'heure officielle tirée des serveurs officiels.

Objectifs

  • Client NTP installé et synchronisation de l'heure du serveur

Configuration d’un logger système

Nous pouvons utiliser rsyslog qui est un système de journalisation pour les systèmes d'exploitation Linux et Unix. Il peut collecter les journaux d'événements générés par différents éléments du système, tels que les applications, les services et le noyau, et les acheminer vers différentes destinations telles que des fichiers de journaux, des bases de données ou des serveurs de journaux distants. rsyslog offre une grande flexibilité et une richesse de fonctionnalités pour la gestion des journaux, ce qui en fait un outil couramment utilisé pour la gestion des journaux sur les systèmes Linux et Unix.

6. Mise en place d'un firewall

Les firewalls sont des dispositifs de sécurité pour protéger les systèmes informatiques contre les attaques malveillantes en contrôlant le trafic réseau entrant et sortant. Les règles de filtrage définissent les connexions autorisées ou bloquées. Il existe différents types de firewalls, chacun ayant ses avantages et inconvénients. Voici un schéma très simple du fonctionnement d'un firewall.

Untitled

Utilisation du firewall UFW (Uncomplicated Firewall)

Le noyau Linux fournit des capacités pour surveiller et contrôler le trafic réseau. Ces capacités sont exposées à l'utilisateur final par le biais d'utilitaires de pare-feu. Sous Linux, le pare-feu le plus courant est iptables. Cependant, iptables est plutôt compliqué et déroutant. C'est là que l'UFW intervient. Considérez UFW comme un frontal d'iptables. Il simplifie le processus de gestion des règles iptables qui indiquent au noyau Linux ce qu'il doit faire avec le trafic réseau.

UFW fonctionne en vous permettant de configurer des règles qui :

  • autorisent ou refusent
  • le trafic d'entrée ou de sortie vers ou depuis des ports
  • Vous pouvez créer des règles en spécifiant explicitement les ports ou avec des configurations d'applications qui spécifient les ports.

Objectifs

  • tout le trafic réseau, entrée et sortie, est bloqué sauf ceux que nous autorisons explicitement.

Notes

  • Lorsque vous installez d'autres programmes, vous devez activer les ports/applications nécessaires.

Si vous souhaitez configurer UFW de façon assez complète, je vous conseille cet article. Sinon, il existe une autre alternative appelée fiewalld je vous laisse vous renseigner pour les curieux !

7. Utilisation de PSAD

On va commencer à parler de choses un peu technique, PSAD c'est un IPS (Intrusion prevention system). Il va permettre plusieurs choses. Imagine que tu as un gardien de sécurité nommé PSAD pour protéger ta maison. PSAD est très vigilant et aiguise constamment ses sens pour détecter les intrus potentiels. Il observe attentivement toutes les entrées et sorties de ta maison pour s'assurer que personne ne rentre sans ton autorisation.

Mais PSAD ne se contente pas d'être vigilant. Il est également très intelligent et a la capacité de reconnaître les schémas d'activité suspects. Par exemple, s'il voit une personne qui essaie plusieurs fois d'ouvrir la porte d'entrée de ta maison, il sait que quelque chose ne va pas. Il peut alors prendre des mesures pour bloquer l'accès à cette personne et alerter la police si nécessaire.

C'est exactement ce que fait l'IPS PSAD dans le monde informatique ! PSAD est un système de détection d'intrusion basé sur des signatures qui surveille le trafic réseau entrant et sortant pour détecter les activités suspectes. Il analyse les journaux de connexion pour identifier les tentatives d'intrusion et les attaques réseau.

Lorsqu'il détecte une activité suspecte, PSAD peut prendre des mesures pour bloquer l'accès à l'attaquant et alerter l'administrateur système de la menace potentielle. Il utilise des règles de détection basées sur des signatures pour identifier les attaques connues, mais peut également détecter les attaques inconnues en analysant les modèles d'activité suspecte.

PSAD, analyse les messages des journaux d'iptables et d'ip6tables (généralement /var/log/messages) pour détecter et éventuellement bloquer les scans et d'autres types de trafic suspect tels que les tentatives de DDoS ou d'empreintes d'OS. Il est possible d'utiliser les deux programmes en même temps car ils fonctionnent à des niveaux différents.

Voilà comment ça fonctionne, on va activer le logging de ufw

ufw logging on

On va ensuite modifier ces fichiers

  /etc/ufw/before.rules
  /etc/ufw/before6.rules

On ajoute ces lignes avant la ligne de COMMIT

# log all traffic so psad can analyze
-A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
-A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "

Une fois fait, nous pouvons relancer ufw et lancer psad

ufw reload
psad -R

On vérifie que tout fonctionne

root@xxx:~# psad --fw-analyze
[+] Parsing INPUT chain rules.
[+] Parsing INPUT chain rules.
[+] Firewall config looks good.
[+] Completed check of firewall ruleset.
[+] Results in /var/log/psad/fw_check
[+] Exiting.

Pour mettre à jour la configuration, comme réhausser le niveau de danger avant l'envoi d'un mail, on fait ceci

sudo psad --sig-update

Dans notre cas, je ne vous site que PSAD, mais il en existe beaucoup d'autres ! ! Je vous laisse voir par vous même.

8. Utilisation de Fail2Ban

UFW indique à votre serveur les portes à barricader pour que personne ne puisse les voir, et les portes à laisser passer les utilisateurs autorisés. Le PSAD surveille l'activité du réseau pour détecter et prévenir les intrusions potentielles, c'est-à-dire les tentatives répétées de pénétration.

Mais qu'en est-il des applications/services que votre serveur exécute, comme SSH et Apache, pour lesquels votre pare-feu est configuré pour autoriser l'accès. Même si l'accès est autorisé, cela ne signifie pas que toutes les tentatives d'accès sont valides et inoffensives. Que se passe-t-il si quelqu'un essaie d'accéder par force brute à une application web que vous exécutez sur votre serveur ? C'est là que Fail2ban entre en jeu.

Fail2Ban est comme un agent de sécurité grincheux pour ta maison informatique. Il ne laisse entrer personne sans vérifier leur identité et prend des mesures immédiates contre les intrus.

Imaginons que tu organises une fête chez toi, mais tu ne veux pas que des inconnus viennent s'incruster. Fail2Ban est donc là pour vérifier l'identité de chaque invité. S'ils ne sont pas sur la liste des invités autorisés, Fail2Ban les bloque automatiquement et les empêche d'entrer. Si quelqu'un essaie de passer par une fenêtre ou une porte dérobée, Fail2Ban détecte cela et prend des mesures pour les bloquer.

Par exemple, si quelqu'un essaie de se connecter à ton serveur avec un nom d'utilisateur ou un mot de passe incorrect plusieurs fois de suite, Fail2Ban bloquera automatiquement l'adresse IP de l'attaquant. Cela réduit considérablement les risques d'attaques par force brute et protège ta maison informatique contre les intrus.

En termes de complémentarité avec PSAD, Fail2Ban agit comme une première ligne de défense contre les intrus. Il bloque automatiquement les adresses IP des attaquants connus, réduisant ainsi la charge de travail de PSAD. PSAD peut ensuite se concentrer sur la détection des attaques plus sophistiquées et inconnues, en utilisant des règles de détection basées sur des signatures et des modèles d'activité suspecte.

Pour la configuration complète, je te conseille plutôt de lire cette documentation qui sera beaucoup plus pertinente que si je refaisais un tuto dessus !

9. Sécurisation du SSH

On peut commencer par changer le port par défault du SSH en faisant du port forwarding

Il est possible d’utiliser le principe des clés publiques et privées SSH

L'utilisation de clés publiques/privées SSH est plus sûre que l'utilisation d'un mot de passe. Il est également plus facile et plus rapide de se connecter à notre serveur car vous n'avez pas à saisir de mot de passe.

Vous pouvez également définir une phrase de passe pour les clés, ce qui vous obligerait à entrer la phrase de passe de la clé lors de la connexion à l'aide de clés publiques/privées.

Gardez à l'esprit que cela signifie que vous ne pouvez pas utiliser la clé pour l'automatisation car vous n'aurez aucun moyen d'envoyer la phrase de passe dans vos scripts. ssh-agent est un programme fourni avec de nombreuses distributions Linux (et généralement déjà en cours d'exécution) qui vous permettra de conserver votre clé privée non cryptée en mémoire pendant une durée configurable. Exécutez simplement ssh-add et il vous demandera votre phrase de passe. Vous ne serez plus invité à saisir votre phrase de passe jusqu'à ce que la durée configurable soit écoulée.

Nous utiliserons les clés Ed25519:

Il utilise un schéma de signature à courbe elliptique, qui offre une meilleure sécurité que ECDSA et DSA. En même temps, il a également de bonnes performances.

Si tu veux savoir comment désactiver le mot passe, rien de compliqué, il suffit d'aller dans /etc/ssh/sshd_config et de changer le champ PasswordAuthentication à no

# To disable tunneled clear text passwords both PasswordAuthentication and
# ChallengeResponseAuthentication must be set to "no".
PasswordAuthentication no

On redémarre ensuite le service : service ssh restart

Note

  • Vous devrez effectuer cette étape pour chaque ordinateur et chaque compte à partir duquel vous vous connecterez à votre serveur.

10. Modification des configurations de base de votre serveur

Le fichier /etc/sysctl.conf est un fichier de configuration utilisé par le programme sysctl sur les systèmes d'exploitation Linux. Il définit des valeurs pour les paramètres du noyau du système d'exploitation, tels que les réglages de performance du réseau, la sécurité du système, la gestion de la mémoire et bien plus encore.

Les modifications apportées au fichier /etc/sysctl.conf sont appliquées lors du démarrage du système et peuvent être rechargées en temps réel sans redémarrer le système en utilisant la commande sysctl -p.

Ce fichier est important car il permet de configurer le comportement du noyau et d'optimiser les performances du système. Les administrateurs système peuvent utiliser ce fichier pour améliorer la sécurité et les performances de leur système en modifiant les valeurs des paramètres appropriés.

# Turn on execshield
kernel.exec-shield=1
kernel.randomize_va_space=1
# Enable IP spoofing protection
net.ipv4.conf.all.rp_filter=1
# Disable IP source routing
net.ipv4.conf.all.accept_source_route=0
# Ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_messages=1
# Make sure spoofed packets get logged
net.ipv4.conf.all.log_martians = 1

11. Configuration d'un WAF

ModSecurity est un pare-feu web application open source conçu pour protéger les sites web contre les attaques telles que les attaques XSS, SQL Injection, RCE, etc. Il s'exécute en tant que module Apache ou en tant que bibliothèque autonome et analyse les requêtes HTTP en temps réel pour détecter des anomalies et des comportements malveillants.

ModSecurity utilise une règle de sécurité basée sur une expression régulière pour définir les comportements malveillants à détecter. Les administrateurs peuvent également définir des actions à entreprendre lorsque des comportements malveillants sont détectés, telles que le blocage de la requête ou l'envoi d'une alerte.

ModSecurity est considéré comme un outil puissant et flexible pour améliorer la sécurité des applications web, mais il peut également affecter les performances de la plate-forme si les règles de sécurité sont mal configurées ou si le traitement en temps réel des requêtes HTTP est trop lourd.

J'écrirais peut-être un jour un article sur comment configurer un WAF de façon simple avec un reverse proxy nginx. Si cela vous intéresse, je t'invite à m'envouer un message privé sur linkedIn !

12. Mise en place de backup régulière via crontab

Pour réaliser des backups automatiques via crontab, vous pouvez suivre les étapes suivantes :

Ouvrez votre fichier crontab en utilisant la commande suivante :

crontab -e

Si vous n'avez pas encore configuré de crontab, vous pouvez suivre les instructions pour le faire.

Ajoutez une nouvelle entrée de crontab pour la sauvegarde. Par exemple, si vous souhaitez sauvegarder votre base de données MySQL tous les jours à 3 heures du matin, vous pouvez ajouter l'entrée suivante :

0 3 * * * docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > /chemin/vers/fichier/backup.sql

Cela exécutera la commande de sauvegarde de votre base de données MySQL tous les jours à 3 heures du matin et stockera la sortie dans le fichier "backup.sql" dans le répertoire "/chemin/vers/fichier".

Enregistrez et fermez votre fichier crontab. La nouvelle entrée sera prise en compte automatiquement par le système.

Si vous souhaitez restaurer la sauvegarde, vous pouvez utiliser la commande suivante :

cat /chemin/vers/fichier/backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE

Cette commande permet de restaurer la base de données MySQL à partir du fichier de sauvegarde "backup.sql".

Et voilà, je vous ai fourni mes 12 petits tips pour que vous puissez sécuriser un minimum votre serveur. J'espère qu'aucun hacker n'essayera de votre détruire votre serveur. Que la force soit avec vous. Peace !