• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 24/08/2021

Auditez le mode de démarrage du serveur

Nous avons maintenant fait le tour des composants sensibles pendant le processus de démarrage du serveur : le bootloader, les options et modules du noyau, les accès physiques aux consoles virtuelles et les raccourcis clavier. Dans ce chapitre, je vous propose de nous pencher sur les services lancés avec la machine afin d'en dresser la liste et de suggérer d'éventuelles suppressions.

Identifiez la cible de démarrage configurée par défaut

 Le traditionnel gestionnaire de démarrage Linux System V se voit progressivement remplacé par le nouveau gestionnaire systemd, ce qui continue de susciter de nombreux débats. Quoi qu'il en soit, les principales distributions (Red Hat/CentOS, Debian/Ubuntu) proposent, depuis leur dernière version, un mode transitoire System V basé sur systemd. Et bientôt, ce mode transitoire disparaîtra au profit de systemd.

Le gestionnaire systemd va gérer beaucoup d'aspects de Linux. Ici, nous allons nous concentrer sur la manière dont il gère le lancement automatique des services de la machine lors du démarrage.

Sur un serveur avec System V, pour connaître le runlevel configuré par défaut au démarrage de la machine, il fallait consulter le fichier /etc/inittab. Sur un système transitoire, ce fichier existe toujours et, si vous affichez son contenu, vous obtenez quelque chose comme :

[root@fichesproduits ~]# more /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#

Le message est clair : il faut passer à systemd. Et le fichier indique également la commande à exécuter pour obtenir la cible par défaut de la machine. Lancez la commande :

[root@fichesproduits ~]# systemctl get-default
multi-user.target
[root@fichesproduits ~]#

Ici, la cible par défaut est multi-user.target, ce qui correspond à l'ancien runlevel 3. C'est pertinent pour ce serveur.

Pour obtenir la liste de toutes les cibles chargées sur le système actuel, lancez la commande suivante :

[root@fichesproduits ~]# systemctl list-units --type target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
cryptsetup.target loaded active active Local Encrypted Volumes
getty.target loaded active active Login Prompts
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
network-online.target loaded active active Network is Online
network.target loaded active active Network
paths.target loaded active active Paths
remote-fs.target loaded active active Remote File Systems
slices.target loaded active active Slices
sockets.target loaded active active Sockets
sound.target loaded active active Sound Card
swap.target loaded active active Swap
sysinit.target loaded active active System Initialization
timers.target loaded active active Timers

LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.

16 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
[root@fichesproduits ~]#

La plupart des cibles listées ici sont indispensables (à l'exception, sûrement, de la sound.target). Il n'y a donc pas de recommandations à faire. Il pourrait y avoir d'autres cibles, comme la graphical.target, qui propose de démarrer le serveur en mode graphique. Les cibles ouvrant des services qui ne sont pas indispensables au serveur doivent être supprimées.

Chaque cible définit la liste des services à lancer automatiquement lors du démarrage de la machine. Nous allons étudier cet aspect en détail dans la seconde partie de ce chapitre.

Auditez la cible par défaut du système

Pour lister les services démarrés avec la cible multi-user.target, lancez la commande suivante :

[root@fichesproduits ~]# ls -lrtha /etc/systemd/system/multi-user.target.wants/
total 8,0K
lrwxrwxrwx. 1 root root 40 27 mars 09:30 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target
lrwxrwxrwx. 1 root root 46 27 mars 09:30 rhel-configure.service -> /usr/lib/systemd/system/rhel-configure.service
lrwxrwxrwx. 1 root root 37 27 mars 09:30 crond.service -> /usr/lib/systemd/system/crond.service
lrwxrwxrwx. 1 root root 46 27 mars 09:30 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root 37 27 mars 09:30 tuned.service -> /usr/lib/systemd/system/tuned.service
lrwxrwxrwx. 1 root root 42 27 mars 09:30 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service
lrwxrwxrwx. 1 root root 39 27 mars 09:30 rsyslog.service -> /usr/lib/systemd/system/rsyslog.service
lrwxrwxrwx. 1 root root 37 27 mars 09:30 kdump.service -> /usr/lib/systemd/system/kdump.service
lrwxrwxrwx. 1 root root 36 27 mars 09:30 sshd.service -> /usr/lib/systemd/system/sshd.service
lrwxrwxrwx. 1 root root 38 27 mars 09:30 auditd.service -> /usr/lib/systemd/system/auditd.service
lrwxrwxrwx. 1 root root 39 27 mars 09:30 postfix.service -> /usr/lib/systemd/system/postfix.service
lrwxrwxrwx. 1 root root 39 27 mars 09:30 chronyd.service -> /usr/lib/systemd/system/chronyd.service
lrwxrwxrwx. 1 root root 39 27 mars 09:46 mariadb.service -> /usr/lib/systemd/system/mariadb.service
lrwxrwxrwx. 1 root root 37 27 mars 09:46 httpd.service -> /usr/lib/systemd/system/httpd.service
lrwxrwxrwx 1 root root 39 27 mars 09:50 proftpd.service -> /usr/lib/systemd/system/proftpd.service
drwxr-xr-x. 11 root root 4,0K 27 mars 09:51 ..
drwxr-xr-x. 2 root root 4,0K 27 mars 09:51 .
[root@fichesproduits ~]#

La liste des fichiers du répertoire correspond à la liste des services qui se lancent automatiquement au démarrage de la machine. Vous pouvez constater la présence de services qui ne sont pas indispensables au serveur, comme postfix.service, chronyd.service ou encore tuned.service. Il faut stopper ces services inutiles aux contextes fonctionnel et opérationnel du serveur. En effet, il n'y a rien de plus frustrant qu'un serveur corrompu par un service inutile.

Par exemple, avec la commande suivante :

# Arrêt de l'instance courante
systemctl stop postfix.service

# Suppression du lancement automatique pour la cible multi-user.target
systemctl disable postfix.service

La cible multi-user.target configure elle-même des dépendances dans son fichier de configuration :

[root@fichesproduits ~]# cat /lib/systemd/system/multi-user.target
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

Le mot-clé Requires indique ici que la cible basic.target sera exécutée avant multi-user.target. Cette cible configure elle-même également des dépendances, par exemple :

[root@fichesproduits ~]# cat /lib/systemd/system/basic.target
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.

[Unit]
Description=Basic System
Documentation=man:systemd.special(7)

Requires=sysinit.target
After=sysinit.target
Wants=sockets.target timers.target paths.target slices.target
After=sockets.target paths.target slices.target

Les mots clés After et Wants indiquent les dépendances. La documentation de systemd explique les différents types de dépendance. 

Quoi qu'il en soit, il est possible de lister l'ensemble des services et leur statut actuel, grâce à la commande suivante :

[root@fichesproduits ~]# systemctl list-unit-files --type service
UNIT FILE STATE
auditd.service enabled
autovt@.service enabled
blk-availability.service disabled
brandbot.service static
chrony-dnssrv@.service static
chrony-wait.service disabled
chronyd.service enabled
console-getty.service disabled
console-shell.service disabled
container-getty@.service static
cpupower.service disabled
crond.service enabled
dbus-org.freedesktop.hostname1.service static
...

Tous les services avec le statut enabled se lancent automatiquement sur le serveur.

En résumé

Cette dernière étape de l'audit du processus de démarrage de la machine concerne les services. À partir de la liste des services démarrés automatiquement par la cible par défaut, nous avons pu émettre deux recommandations : l'une d'une priorité critique et l'autre d'une priorité moindre. Je vous donne désormais rendez-vous dans la partie suivante pour auditer le système. Je vous propose de résumer toutes les recommandations effectuées sur cette partie :

Recommandation

Type

Principe

Passer les droits sur l'arborescence /etc/grub.d à 700

CRITICAL

Moindre privilège

Créer un utilisateur et son mot de passe chiffré dans le fichier 01_users afin de protéger l'accès au shell de Grub par une authentification

CRITICAL

Minimisation

Passer l'option iommu=force au noyau lors du démarrage de Linux

WARNING

Minimisation

Bloquer le chargement de modules supplémentaires via la sysctl kernel.modules_disabled=1

WARNING

Minimisation

Vider le contenu du fichier /etc/securetty afin de bloquer toute connexion avec l'utilisateur root depuis une console virtuelle

CRITICAL

Défense en profondeur

Augmenter l'intervalle minimal de temps entre chaque tentative de connexion sur le module pam_faildelay.so du fichier /etc/pam.d/system-auth à 5 ou 10 secondes afin de ralentir les attaques par dictionnaire

WARNING

Défense en profondeur

Désactiver la combinaison Ctrl+Alt+Supp sur le serveur pour prévenir tout redémarrage depuis un accès physique à la machine

CRITICAL

Défense en profondeur

Désactiver les Magic System Request Keys

WARNING

Défense en profondeur

Supprimer les services inutiles démarrés automatiquement avec le serveur en passant par la cible par défaut

CRITICAL

Minimisation

Supprimer les services inutiles démarrés automatiquement avec le serveur en passant par les dépendances de la cible par défaut

WARNING

Minimisation

Maintenant que nous avons audité en détail le processus de démarrage, nous allons nous atteler à l'analyse du système dans la prochaine partie. Vous êtes prêt ?

Exemple de certificat de réussite
Exemple de certificat de réussite