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 ?