Dans cet article, nous allons pousser la configuration de votre distribution à un niveau plus élevé : nous allons optimiser le noyau et appliquer également ce que l'on nomme un durcissement.
Certaines de ces optimisations peuvent cependant empêcher votre système de démarrer ou d'utiliser certaines fonctions utiles pour vous (virtualisation par exemple)... Procédez avec précaution et par étapes successives !
Linux ne doit pas être considéré comme un système d'exploitation pour station de travail, sécurisé, de base. Afin d'obtenir un meilleur niveau de sécurité, il est cependant tout à fait possible d'améliorer ce niveau en appliquant certaines fonctionnalités ou règles au système et ainsi réduire la surface d'attaque.
Cet article a pour base majoritairement l'article issu du site privsec qui fournit des détails très intéressants liés à la sécurité et à la vie privée. Nous avons cependant ajouté certaines optimisations et modifié certaines parties afin de limiter au strict nécessaire les modifications à apporter.
Une partie des distributions proposent nativement, dans leur installateur, la possibilité de chiffrer votre ou vos partitions système et home, pour ceux qui ont un modèle de menaces qui requiert une protection élevée de leurs données.
Nous suggérons de le faire dès l'installation, comme mentionné dans notre article sur le chiffrement.
Le noyau Linux peut être agrémenté de ce que l'on appelle des modules (ou LKM pour Loadable Kernel Module). ZRAM (ex-projet "compcache") est un module du noyau GNU/Linux qui permet de créer un espace de mémoire virtuelle à l'intérieur de la RAM de votre machine ; mais ce module n'est, sur la majorité des distributions, pas activé par défaut. Le SWAP se fait donc sur une partie du disque dur (ou une partition dédiée si vous en avez créée une !).
Plutôt que d'utiliser une partie du disque dur, ZRAM va utiliser la RAM pour le SWAP. Ceci a plusieurs avantages majeurs :
Vous retrouverez plus d'informations sur l'intérêt d'utiliser ZRAM ici.
Voici comment activer cette fonction sur la majorité des distributions :
Ou autres distributions basées sur Ubuntu ou Debian :
zram
:sudo apt install zram-tools
zstd
ainsi que la quantité de RAM à utiliser à 60% (au lieu de 50%) de celle disponible sur le système :echo -e "ALGO=zstd\nPERCENT=60" | sudo tee -a /etc/default/zramswap
tee
va modifier les valeurs de ALGO et PERCENT dans le fichier de configuration/etc/default/zramswap
. Vous pouvez alternativement le faire vous-même en éditant ce fichier manuellement avecnano
.
sudo service zramswap reload
Ou autres distributions basées sur Arch :
zram
:sudo pacman -S zram-generator
zstd
ainsi que la quantité de RAM à utiliser à 100% (au lieu de 50%) de celle disponible sur le système :echo -e "[zram0]\nzram-size=ram\ncompression-algorithm=zstd" | sudo tee /etc/systemd/zram-generator.conf
tee
va créer le fichierzram-generator.conf
et ajouter le texte issu de la commandeecho
dans ce fichier de configuration. Vous pouvez alternativement le faire vous-même en créant ce fichier manuellement avecnano
et en copiant manuellement le contenu
Attention aux retours chariots :\n
, qui sont en fait à remplacer par un simple retour à la ligne.
Sur les distributions basées sur Redhat, ZRAM est utilisé par défaut
sudo zypper install systemd-zram-service
sudo reboot
sudo systemctl enable --now zramswap.service
Voilà c'est tout.
Afin de vérifier que le SWAP utilise ZRAM, procédons comme suit :
cat /proc/swaps
/dev/zramX
(un par coeur de processeur).Pour voir l'utilisation des blocs zram :
zramctl
free -h
La journalisation (en anglais : logging, produisants des fichers de "logs") sur toutes les distributions est rarement optimisée et peut parfois atteindre un volume de données importants, impliquant un ralentissement du système voire pire...
A ce titre, il peut être utile d'optimiser cette journalisation :
Voici les commandes à appliquer, en premier lieu, pour nettoyer les journaux actuels :
sudo systemd-resolve --flush-caches
sudo journalctl --rotate
Puis nous optimisons la configuration :
sudo journalctl --vacuum-time=1s
sudo journalctl --vacuum-size=40M
sudo sed -i 's/#SystemMaxUse=/SystemMaxUse=100M/' /etc/systemd/journald.conf
sudo sed -i 's/#SystemMaxFiles=100/SystemMaxFiles=7/g' /etc/systemd/journald.conf
Enfin, nous réappliquons une rotation pour activer ces optimisations :
sudo journalctl --rotate
Le répertoire /tmp
(des fichiers temporaires) est très sollicité, par le système mais aussi par les applications qui l'utilisent très souvent, parfois même pour écrire puis supprimer des petits fichiers rapidement. Cela implique des écritures disque incessantes, ce qui à terme peut fatiguer les disques surtout les SSD.
Afin d'améliorer cet aspect, nous pouvons rediriger ce répertoire en mémoire vive, ce qui limitera grandement l'écriture sur disque, et parfois même améliorera les performances :
echo -e "\ntmpfs /tmp tmpfs defaults,noatime,nodiratime,noexec,nodev,mode=1777,nosuid,size=4G 0 0" | sudo tee -a /etc/fstab
echo -e "\ntmpfs /var/tmp tmpfs defaults,noatime,nodiratime,noexec,nodev,mode=1777,nosuid,size=4G 0 0" | sudo tee -a /etc/fstab
Ici veillez à ne pas avoir de partition séparée pour
/tmp
.
Une grande partie des distributions utilisent le gestionnaire de réseau "NetworkManager". Il est possible de renforcer ses propriétés en appliquant une configuration sur la randomisation des adresses MAC des équipements réseau (Wifi et Ethernet-câble).
Attention, cette optimisation semble ne pas correctement fonctionner sur les distributions à base de Fedora. Si vous ne retrouvez pas votre connexion, revenez en arrière sur cette partie.
Pour ce faire voici :
sudo nano /etc/NetworkManager/conf.d/00-macrandomize.conf
Copions ces lignes dans le fichier ainsi ouvert :
[device]
wifi.scan-rand-mac-address=yes
[connection]
wifi.cloned-mac-address=random
ethernet.cloned-mac-address=random
Fermer le fichier. Puis :
sudo nano /etc/NetworkManager/conf.d/01-transient-hostname.conf
Et ajoutons ces lignes :
[main]
hostname-mode=none
Redémarrons le service NetworkManager :
sudo systemctl restart NetworkManager
Et adaptons le nom d'hôte de notre machine sur localhost
:
sudo hostnamectl set-hostname "localhost"
Il est à noter que
~~ La randomisation de l'adresse MAC de votre carte WiFi peut ne pas fonctionner, cela dépend du microcode de la puce en question.
~~ Plus important encore : il est intéressant de comprendre ces aspects si votre modèle de menaces est élevé ; le 1er bloc de 3 octets de l'adresse MAC renvoi à un identifiant international du fabricant, nommé OUI (pour "Organizational Unique Identifier") qu'il n'est pas judicieux de spoofer car il devient plus facile de détecter la randomisation en interrogeant une base de données de ces OUI. Par corrélation, il devient alors facile de deviner l'usurpation (voire même dans certains cas l'utilisation d'un VPN !). Il est donc plus judicieux de ne spoofer/randomiser que le 2éme bloc ou derniers 3 octets de l'adresse qui renvoient au numéro NIC (pour "Network Interface Controller") de votre propre carte réseau qui dispose d'une grande largesse dans l'attribution des numéros et qui peut servir à l'identification et au pistage. En simulant seulement la fin de l'adresse MAC, sa détection par corrélation devient alors plus difficile.
Cette opération peut se faire depuis Linux via un outil comme Macchanger.Enfin il est à noter qu'il est impossible de se soustraire complètement au fingerprinting tant les possibilités d'identification sont protéiformes et nombreuses. L'idée est de réduire le risque.
Plusieurs points peuvent être renforcés ici :
user
.ordi
b08dff433e7567a1921a7150ab01
Généralement vous trouverez cet ID ici : /etc/machine-id
(systemd) ou /var/lib/dbus/machine-id
(wayland et autres)Une majorité des distributions effectuent un retour vers leurs serveurs sur le nombre d'installation de leur système et leurs logiciels. Il est possible de couper cette "télémétrie" si notre modèle de menace l'exige, ou en tout cas si nous souhaitons réduire notre empreinte réseau.
Voici une liste pour certaines distributions et logiciels, non exhaustive :
countme=false
au fichier /etc/dnf/dnf.conf
. Sur les systèmes utilisant rpm-ostree (Fedora Silverblue par ex.), vous pouvez suivre ces indications afin de masquer la variable countme./var/lib/zypp/AnonymousUniqueId
.sudo apt purge --auto-remove zorin-os-census
puis en labellisant ce logiciel comme "non-installable" avec sudo apt-mark hold zorin-os-census
pour éviter toute réinstallation accidentelle.sudo apt purge --auto-remove ubuntu-report
.sudo snap remove --purge firefox && snap remove --purge gtk-common-themes && snap remove --purge snapd-desktop-integration && snap remove --purge gnome-3-38-2004 && snap remove --purge snap-store && snap remove --purge bare && snap remove --purge core20 && snap remove --purge core18 && snap remove --purge snapd && apt -y purge --auto-remove snapd
Puis, afin d'éviter une réinstallation accidentelle, lancez la commande : sudo apt-mark hold snapd
.
L'utilisation de Flatpak est un bon moyen d'obtenir des logiciels. Flatpak conditionne, par défaut, ces logiciels en appliquant une isolation en bac à sable (sandboxing), un peu à la manière de ChromeOS ou d'Android, mais bien moins évolué et plus faible sur le filtrage.
Nous pouvons renforcer ce filtrage, si notre modèle de menace exige une compartimentation élevée afin d'assurer une sécurité sérieuse. L'installation de l'outil Flatseal
nous permettra de finement régler cet aspect.
L'idée générale que nous pouvons appliquer pour commencer est de désactiver tout accès des applications aux fichiers système (filesystem
). Puis de lancer ces applications et de vérifier leur fonctionnement et ajuster leurs accès.
Pour vous aider à ajuster au mieux, privsec et un développeur nommé rusty-snake ont fourni des exemples d'ajustements pour certaines applications.
Attention également à ne pas activer les mises à jour automatiques et de vérifier, après toute mise à jour, les accès ; en effet, il se peut que cette fonction réactive des paramètres par défaut.
Afin de surveiller l'accès aux différentes parties du système, les distributions Linux implémentent un outil de renforcement des contrôles d'accès : SELinux ou AppArmor.
SELinux est l'outil installé par défaut sur les Android et les distributions RedHat et Fedora et AppArmor celui sur les distributions Debian/Ubuntu et une partie des OpenSuse. Voilà pourquoi Fedora est généralement perçue comme plus avancée au niveau sécurité dans les distributions (et a fortiori RedHat bien sûr), nous conseillons de laisser le mode SELinux à "Enforcing".
Pour ce qui est des autres distributions, nous conseillons fortement de garder l'outil par défaut car il est livré avec des règles renforcées.
Pour ce qui est de Arch, il faudra en passer par l'utilisation de AppArmor et sa configuration nominale recommandée trouvable ici
Bien entendu, il est tout à fait possible de renforcer ou créer vos propres règles de confinement sur ces 2 outils, en suivant les recommandations de certains experts, que nous listons ici :
Attention, cette tâche est fastidieuse et réservée à ceux qui voudront se documenter et passer un peu de temps à configurer leur système.
Les distributions RedHat/Fedora et OpenSuse viennent avec un logiciel pare-feu nommé Firewalld
. Les distributions à base Debian/Ubuntu utilisent quant à elles plus fréquemment ufw
. La différence réside dans le fait que UFW ne peut appliquer de règle sur une connexion particulière, mais reste plus simple à l'usage.
Deux autres outils peuvent être également étudiés et utilisés afin de renforcer le filtrage :
Gardez bien en tête que tous ces outils, bien qu'utiles au quotidien peuvent être détournés : en effet, ces outils ne bloqueront pas une personne qui a des privilèges élevés sur la machine, et qui, par conséquent, pourra changer les règles de filtrage à sa guise.
Il est important de recevoir des mises à jour des microcodes de vos CPUs pour, par exemple, réduire le risque de vulnérabilité (type Meltdown et Spectre).
Pour ce faire, il est impératif d'activer les paquets "non-free" de vos distributions et de vérifier ou installer ces paquets :
intel-microcode
pour les CPUs Intel (intel-ucode
sur base Arch),amd-microcode
pour les CPUs AMD (amd-ucode
sur base Arch).En ce qui concerne la mise à jour des différents firmwares de nos machines, de simples commandes sont à effectuer régulièrement :
sudo fwupdmgr refresh && fwupdmgr update
Si fwupd
n'est pas installé par défaut, nous devrons procéder à son installation.
On entre ici sur un sujet assez complexe, le durcissement du noyau Linux (linux-kernel).
Certaines distributions Arch permettent de choisir le noyau spécial "durci" linux-hardened
qui inclut par défaut les patchs de sécurité et une configuration plus stricte du noyau (qui peut malheureusement casser certains logiciels). Hormis ce type de noyau (Redhat par exemple se base sur linux-hardened
, Whonix dont la base utilise les durcissements de kicksecure
), la majorité des noyaux n'est pas durcie par défaut.
Attention : cette partie s'adresse à des profils intermédiaires à initiés. Le risque de bloquer certains usages du quotidien est élevé lorsque nous appliquons des règles durcissement élevé. Au risque de nous répéter, la sécurité vient pratiquement toujours avec des compromis sur la facilité d'usage !
Afin de durcir le noyau notamment au niveau des contrôles de privilège, du swap et des contrôles réseau, deux choix s'offrent à vous :
kicksecure
en suivant ce tutoriel./etc/sysctl.d
:Note : vous pouvez télécharger ces fichiers depuis le dépôt github et les copier avec des droits administrateur dans le répertoire, ou simplement créer 2 fichiers vides dans /etc/sysctl.d
du même nom et copier les contenus dans ces fichiers.
Le boot est une étape importante et critique du lancement d'une machine. Il peut donc être utile de renforcer la sécurité autour de cette étape.
Voici les 2 commandes à lancer afin de durcir la séquence de boot :
Ou autres distributions basées sur Ubuntu ou Debian :
sudo sed -i'.bkp' -E 's|(GRUB_CMDLINE_LINUX_DEFAULT="quiet splash)|\1 slab_nomerge init_on_alloc=1 init_on_free=1 page_alloc.shuffle=1 pti=on vsyscall=none debugfs=off oops=panic mce=0 loglevel=0 spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force randomize_kstack_offset=on|' /etc/default/grub
Puis
sudo update-grub
Ou autres distributions basées sur Arch :
sudo sed -i'.bkp' -E 's|(GRUB_CMDLINE_LINUX_DEFAULT="quiet )|\1 slab_nomerge init_on_alloc=1 init_on_free=1 page_alloc.shuffle=1 pti=on vsyscall=none debugfs=off oops=panic mce=0 loglevel=0 spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force randomize_kstack_offset=on |' /etc/default/grub
Puis
sudo update-grub
Sur les distributions basées sur Redhat :
sudo sed -i'.bkp' -E 's|(GRUB_CMDLINE_LINUX="rhgb quiet)|\1 slab_nomerge init_on_alloc=1 init_on_free=1 page_alloc.shuffle=1 pti=on vsyscall=none debugfs=off oops=panic mce=0 loglevel=0 spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force randomize_kstack_offset=on|' /etc/default/grub
sudo grub2-mkconfig -o /etc/grub2.cfg
sudo grub2-mkconfig -o /etc/grub2-efi.cfg
sudo sed -i'.bkp' -E 's|(GRUB_CMDLINE_LINUX_DEFAULT="splash=silent mitigations=auto quiet security=apparmor)|\1 slab_nomerge init_on_alloc=1 init_on_free=1 page_alloc.shuffle=1 pti=on vsyscall=none debugfs=off oops=panic mce=0 loglevel=0 spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force randomize_kstack_offset=on|' /etc/default/grub
sudo grub2-mkconfig -o /etc/grub2.cfg
sudo grub2-mkconfig -o /etc/grub2-efi.cfg
Kicksecure fournit une configuration durcie pour les modules du noyau chargés par le système. Il nous est possible de copier simplement ce fichier de configuration dans notre dossier /etc/modprobe.d
:
Attention cependant :
install bluetooth
et install btusb
(nous commentons des lignes en ajoutant le caractère "#" en début de ligne)install hfsplus /bin/disabled-filesys-by-security-misc
.Porter une attention particulière aux accès aux répertoires /proc
et /sys
peut être une solution afin de réduire la surface d'attaque. Ces répertoires contiennent beaucoup de données sur le noyau, la distribution et l'état de la machine ainsi que les processus en cours d'exécution. Il peut donc être intéressant de limiter leur accès, bien que cela soit assez complexe et long à mettre en place.
Une possibilité est de reprendre les configurations suivantes issues de Kicksecure, et utilisées de base sur Whonix :
- proc-hidepid
- hide-hardware-info
Lorsque vous insérez un média externe (clé USB ou disque dur...), sur la plupart des distributions leur montage est automatique. Bien que pratique, ce fonctionnement ajoute un vecteur d'attaque qui peut être facilement évité ; en effet, n'importe quelle personne malveillante peut insérer une clé et exécuter des programmes malicieux si vous ne bloquez pas ces accès...
Sur Gnome entrez ces commandes :
echo '[org/gnome/desktop/media-handling] automount=false automount-open=false' | sudo tee /etc/dconf/db/local.d/automount-disable
echo 'org/gnome/desktop/media-handling/automount org/gnome/desktop/media-handling/automount-open' | sudo tee /etc/dconf/db/local.d/locks/automount-disable
Puis :
sudo dconf update
gnome
par cinnamon
ci-dessus.Il est également recommandé, pour ceux qui ont un modèle de sécurité élevé, de mettre en place une surveillance active des ports USB, notamment grâce à USBGuard.
Vous avez sûrement noté, lorsque vous avez installé votre distribution, que nous avons désactivé le "Secure Boot" dans les paramètres de votre BIOS. En effet, les firmwares sur la grande majorité des machines aujourd'hui sont préconfigurées pour faire confiance uniquement aux clés Microsoft, ce qui bloque donc de facto l'installation d'autres types de systèmes. De ce fait, nous avons quelque peu augmenté votre surface d'attaque sur votre machine.
Il est important de bien comprendre à quoi sert et ce que ne permet pas le Secure Boot : cette fonction permet de valider l'authenticité et l'intégrité du système (en vérifiant des signatures) que vous lancez au démarrage de votre machine. Il ne permet en aucun cas de protéger la confidentialité du système (un vol de donnée est toujours possible) ; pour cela, vous aurez besoin de chiffrement !
Il est donc à noter que :
Nous résolvons généralement ce problème en chiffrant tout le système (toutes les partitions d'intérêt).
Afin de contourner ce problème, il suffit de protéger l'accès au BIOS par un mot de passe administrateur et de ne pas autoriser le boot sur un média USB ; ce qui n'est pas si trivial à l'usage, mais renforce tout de même la sécurité au démarrage du système. Nous pourrions potentiellement également chiffrer et ajouter un mot de passe au boot.
Il est, cela dit, possible sur certaines machines de mettre en place un Secure Boot avec des distributions GNU/Linux, en utilisant un outil particulier : sbctl
.
Attention ici, toutes les machines ne sont pas compatibles de cette manipulation. Le risque est de bricker le mécanisme UEFI ce qui bloquera la machine. Il faudra alors faire un reset de l'EEPROM et revenir à une configuration nominale !
Veuillez lire notre page Avertissement.
Voici la procédure, comme décrite sur le dépôt de l'outil :
sudo sbctl status
Installed: ✘ Sbctl is not installed
Setup Mode: ✘ Enabled
Secure Boot: ✘ Disabled
sudo sbctl create-keys
Created Owner UUID a9fbbdb7-a05f-48d5-b63a-08c5df45ee70
Creating secure boot keys...✔
Secure boot keys created!
sudo sbctl enroll-keys
Enrolling keys to EFI variables...✔
Enrolled keys to the EFI variables!
sudo sbctl status
Installed: ✔ Sbctl is installed
Owner GUID: a9fbbdb7-a05f-48d5-b63a-08c5df45ee70
Setup Mode: ✔ Disabled
Secure Boot: ✘ Disabled
Après avoir redémarré :
sudo sbctl status
Installed: ✔ Sbctl is installed
Owner GUID: a9fbbdb7-a05f-48d5-b63a-08c5df45ee70
Setup Mode: ✔ Disabled
Secure Boot: ✔ Enabled
Il est possible que, sur certains matériels, cela ne fonctionne toujours pas. Il faudra alors tenter d'exporter la clé publique sur votre partition EFI et de l'importer manuellement via votre BIOS. Voici la commande pour copier la clé publique sur la partition EFI :
sudo openssl x509 -in /usr/share/secureboot/keys/db/db.pem -outform DER -out /boot/efi/EFI/fedora/DB.cer
Notes importantes :
/usr/share/secureboot/keys/db/db.pem
est à adapter au chemin de la clé publique/boot/efi/EFI/fedora/DB.cer
est également à adapter chez vous (ici l'exemple est donné pour une distribution Fedora)Pour terminer sur le tour d'horizon du durcissement de notre machine, nous pourrions enfin ajouter :
Contributeur(s): Ayo, Lou