Rocky Linux est un système d'exploitation open source de niveau enterprise. Sa principale particularité est d'être conçu et maintenu en parallèle de Red Hat Enterprise Linux, c'est-à-dire d'être 100 % compatible bug pour bug. Dans ce guide, nous allons effectuer une première sécurisation, élémentaire, d'un VPS Rocky Linux fraîchement installé. Ces premières étapes simples devront ensuite être complétées par d'éventuels autres mécanismes de sécurité, selon les services que vous voudrez installer.
Vu l'origine commune (Red Hat), ce guide vaut également pour les systèmes d'exploitation CentOS 7 et 8.
Prérequis
- Un VPS Rocky Linux
- Un utilisateur avec des privilèges adéquats, c'est-à-dire root
- Un éditeur de texte, dans notre exemple nous utiliserons nano
- Le gestionnaire de paquets dnf, normalement inclus dans le système d'exploitation
- [Recommandé] Un pare-feu, dans notre exemple nous utiliserons firewalld
Vérifions quel système d'exploitation est installé
S'agissant d'une distribution Linux qui suit Red Hat EL, en cas de problème il est bon d'être certain de la version sur laquelle on travaille. Pour ce faire, nous pouvons lancer la commande :
# cat /etc/os-release
NAME="Rocky Linux"
VERSION="9.0 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.0"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.0 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.0"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.0"
Dans notre exemple, la version est la 9.0, dénommée Blue Onyx.
Mettez à jour votre système d'exploitation
Pour vérifier la présence de mises à jour, utilisons la commande dnf avec le paramètre check-update :
# dnf check-update
Cette commande affichera la liste de tous les paquets à mettre à jour. À ce stade, il est possible de choisir entre tout mettre à jour comme suggéré ou, de manière sélective, seulement certains paquets. Dans le premier cas, il suffira de lancer la commande :
# dnf -y update
Le paramètre -y sert uniquement à préconfirmer la volonté de mettre à jour tous les paquets, sans demander aucune confirmation. Si en revanche nous voulons procéder à une mise à jour sélective, en mettant donc à jour un paquet déterminé, il suffira de lancer la commande :
# dnf update cockpit.x86_64
Dans notre exemple, nous mettons à jour le paquet cockpit, en laissant les autres de côté.
Création d'un utilisateur aux privilèges limités
Comme règle générale de sécurité, il est bon de ne pas utiliser l'utilisateur root pour les activités quotidiennes sur le VPS. À cette fin, nous allons créer un utilisateur aux privilèges limités, mais qui, en cas de besoin, pourra endosser temporairement le rôle de l'utilisateur root. Pour créer un nouvel utilisateur, on utilise la commande useradd :
# useradd mio_utente
Une fois l'utilisateur créé, attribuons-lui un mot de passe à l'aide de la commande passwd :
# passwd mio_utente
Changing password for user mio_utente
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Même si l'utilisateur qui vient d'être créé n'aura pas vraiment la possibilité de faire des dégâts sur le système, évitons d'utiliser des mots de passe faibles (au moins 8 caractères alphanumériques, caractères spéciaux compris). À ce stade, nous pouvons utiliser l'utilisateur nouvellement créé pour nous connecter au VPS, mais pour l'instant nous ne serons pas en mesure d'exécuter des commandes qui requièrent les privilèges de l'utilisateur root.
Pour exécuter des commandes qui requièrent les privilèges de root, deux méthodes sont possibles :
- utiliser la commande
$ su root, pour endosser le rôle de l'utilisateur root; - ajouter l'utilisateur nouvellement créé au groupe des sudoers (les utilisateurs qui peuvent exécuter des commandes avec les privilèges de root) : le moment venu, il suffira d'écrire
$ sudo comando_con_privilegi(exemple$ sudo dnf update).
Si dans le premier cas l'utilisateur non privilégié devra connaître le mot de passe de root pour pouvoir opérer, dans le second il sera au contraire préautorisé — raison de plus pour ne pas sous-estimer la qualité du mot de passe choisi. Mieux vaudrait éviter d'exposer SSH sur le port standard et, mieux encore, utiliser des clés chiffrées pour se connecter plutôt que le simple système utilisateur/mot de passe.
Pour ajouter l'utilisateur créé au groupe des sudoers, connectons-nous au VPS en tant qu'utilisateur root et utilisons la commande :
# usermod -aG wheel mio_utente
Le groupe « wheel » est un groupe spécial, utilisé sur certains systèmes Linux pour contrôler quels utilisateurs peuvent utiliser la commande sudo. Désormais, si nous accédons au VPS en SSH avec l'utilisateur sans privilèges, en utilisant sudo suivi de la commande qui requiert des privilèges, nous pourrons exécuter des activités qui exigent normalement les permissions de root, par exemple :
$ sudo dnf check-update
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for mio_utente:
Le mot de passe demandé est évidemment celui de l'utilisateur créé précédemment, pas celui de root. Nous pourrons ainsi créer des utilisateurs pour des collaborateurs externes sans divulguer le mot de passe de root.
Gestion du pare-feu
Un aspect important pour la sécurité du VPS est la gestion du pare-feu. Sur Rocky Linux, le pare-feu est actif par défaut et dispose d'une configuration de base qui permet de se connecter en SSH (port standard TCP 22) et à la console web Cockpit (port TCP 9090); ce dernier service n'est pas actif, donc si vous essayez de vous connecter à l'adresse https://ip_vps:9090 vous ne recevrez aucune réponse. Contrairement aux systèmes d'exploitation dérivés de Debian (par exemple Ubuntu Server), Rocky Linux utilise firewalld : par conséquent, les commandes pour sa configuration diffèrent de celles d'ufw (ceux qui utilisent habituellement Ubuntu savent de quoi nous parlons).
Comme première étape, assurons-nous que le pare-feu est en cours d'exécution :
$ sudo firewall-cmd --state
Puisque vous utilisez un utilisateur non root, le mot de passe vous sera demandé. Si tout se passe comme prévu, la sortie sera un simple « running ».
Pour vérifier la configuration actuelle du pare-feu, utilisons la commande :
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Nous pouvons voir ici que la zone active s'appelle public (active), que l'interface réseau eth0 est affectée à cette zone, que les communications entrantes sont autorisées pour les services cockpit, dhcpv6-client et ssh et que les réponses ICMP sont autorisées — icmp-block-inversion: no (exemple : les réponses à la commande ping).
La zone public bloque par défaut toute communication entrante, sauf indication contraire. Un concept fondamental de firewalld est que toutes les modifications apportées à la configuration sont temporaires, à moins d'utiliser le paramètre --permanent avant la commande. Cela signifie que si, par exemple, nous voulions ouvrir le port 443 pour permettre l'accès en HTTPS avec la commande suivante :
$ sudo firewall-cmd --zone=public --add-service=https
au premier redémarrage du VPS cette règle ne serait plus présente. Si en revanche nous voulions la rendre permanente, il suffira — comme indiqué :
$ sudo firewall-cmd --permanent --zone=public --add-service=https
Modifier le port du service SSH
Comme le dirait le génial écrivain contemporain Ken Follett à propos de la confiance : « Faire confiance à quelqu'un, c'est comme tenir de l'eau dans le creux de ses mains fermées… »; si nous parlons de sécurité informatique, imaginez tenir l'eau dans vos mains, les doigts complètement ouverts. Puisque nous ne pouvons pas connaître le « quelqu'un » qui tentera de se connecter à votre VPS, ne lui accordons aucune confiance. Un conseil déjà donné dans d'autres articles est de modifier le port standard du service SSH : cette simple opération réduit les tentatives d'accès non autorisées de la part de scripts qui, automatiquement, essaient de se connecter sur le port 22.
Avant de commencer la configuration, décidons quel port utiliser : dans cet exemple, nous avons choisi le port 4322/TCP.
Étape 1 — Configurons le pare-feu. Ajoutons à la configuration du pare-feu le port 4322/TCP :
$ sudo firewall-cmd --permanent --zone=public --add-port=4322/tcp
Comme vous pouvez le remarquer, nous avons utilisé le paramètre qui rend la configuration permanente. Rechargeons maintenant tous les paramètres et assurons-nous qu'il n'y a pas d'erreurs :
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-ports
Notre port 4322/tcp apparaîtra dans la sortie.
Étape 2 — Configurons le service SSH. La procédure pour modifier le port par défaut est assez simple : il suffit de modifier le fichier /etc/ssh/sshd_config en changeant le numéro du port, puis de redémarrer le service. Pour modifier le fichier, nous utiliserons l'éditeur nano :
$ sudo nano /etc/ssh/sshd_config
Dans ce fichier, tout ce qui commence par « # » indique un commentaire et n'est pas pris en compte par le système; en même temps, cela nous indique quelle est la valeur par défaut. Cherchons la ligne qui commence par #Port 22, supprimons le symbole « # » et modifions la valeur du port — ou bien ajoutons une ligne juste sous le commentaire avec notre nouveau port SSH : Port 4322. Il ne reste plus qu'à enregistrer la modification avec CTRL+X puis Y pour confirmer.
Pour que les modifications prennent effet, il faut redémarrer le service :
$ sudo systemctl restart sshd.service
À partir de ce moment, si vous essayez de vous connecter en SSH à votre VPS, vous recevrez le message ssh: connect to host IP_VPS port 22: Connection refused. Pour pouvoir vous connecter, il faut ajouter à la commande l'option -p suivie du nouveau port :
ssh mio_utente@IP_VPS -p 4322
Désactiver l'accès root via SSH
Pour une plus grande sécurité de votre VPS, il est fortement conseillé de ne pas autoriser l'utilisateur root à se connecter via SSH : c'est dans ce but que nous avons créé précédemment un utilisateur aux privilèges limités, mais capable au besoin de devenir root. Nous allons maintenant interdire l'accès en SSH à root. Là encore, nous devrons modifier le fichier de configuration du service SSH, comme nous l'avons fait pour le changement du port standard.
Ouvrons le fichier /etc/ssh/sshd_config avec l'éditeur nano ($ sudo nano /etc/ssh/sshd_config), cherchons la chaîne « PermitRootLogin yes » et définissons-la sur « no » :
# Authentication:
#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
Enregistrons la modification avec CTRL+X puis Y pour confirmer. Redémarrons le service pour que les modifications prennent effet :
$ sudo systemctl restart sshd.service
Même s'il peut sembler peu pratique d'empêcher root de se connecter via SSH, c'est une étape importante pour élever le niveau de sécurité du VPS. Si vous avez besoin de vous connecter directement à la machine avec l'utilisateur root, vous pourrez toujours utiliser la console web depuis le tableau de bord de votre compte VPS GREEN.
Guide publié à l'origine sur le blog de VPS GREEN, le service VPS sur notre cloud privé green.