Racine en lecture seule sur GNU/Linux

De Wiki de Eliott
Sauter à la navigation Sauter à la recherche

Pour des raisons de sécurité, il est parfois souhaitable de créer une racine de distribution GNU/Linux accessible en lecture seulement. La méthode présentée dans la suite de cet article se base sur le système de fichiers BTRFS. Il est donc impératif que la racine de l'installation GNU/Linux soit installée sur une partition BTRFS.

Prérequis

- Avoir une partition racine formatée en BTRFS.

- Les dossiers /lib /lib64 /bin /sbin doivent êtres des liens symboliques pointant vers des dossiers situés dans /usr.

Info : Si les dossiers ci-dessous ne sont pas des liens symboliques, la réalisation de cette installation risque d'être plus compliquée mais tout de même possible.

- Avoir accès au système de fichier racine sans devoir démarrer la distribution GNU/Linux (donc via une ISO Live d'une distribution).

Quelques explications du choix de BTRFS

BTRFS est un système de fichier très évolué possédant beaucoup de fonctionnalités dont une qui nous intéresse et qui est la raison pour laquelle cet article requiert BTRFS : la possibilité de créer des sous-volumes.

Pourquoi des sous-volumes et non des partitions séparées ? Tout simplement parce que contrairement aux partitions les sous-volumes BTRFS ont une taille dynamique qui leur permet de s'adapter automatiquement à la taille de leur contenu.

Mise en place

Info : Cette section considère que la partition racine a été créée, que celle-ci se situe à /dev/sda1 et que la distribution GNU/Linux cible n'a pas été installé.

La première étape consiste à monter la partition cible dans le répertoire /mnt :

mount /dev/sda1 /mnt

Ensuite, on peut créer les sous-volumes BTRFS :

btrfs subvolume create /mnt/etc
btrfs subvolume create /mnt/home
btrfs subvolume create /mnt/opt
btrfs subvolume create /mnt/usr
btrfs subvolume create /mnt/var

Si vous souhaitez voir la liste des sous-volumes créés pour vérifier qu'ils ont bien étés créés, vous pouvez utiliser cette commande :

btrfs subvolume list /mnt

Suite à cette étape, vous pouvez enfin installer votre distribution GNU/Linux sur la partition /dev/sda1.

Après avoir créé les sous-volumes, il faut activer le montage automatique de ceux-ci au démarrage. C'est le rôle du fichier fstab situé dans le répertoire /mnt/etc. Pour remplir correctement ce fichier, iI est nécessaire de connaître l'UUID de la partition racine. Cela peu se faire à l'aide de cette commande :

blkid | grep "/dev/sda1" | grep "UUID="

Après cela, on peut modifier le fichier fstab en s'inspirant des lignes suivantes :

# <file system> <dir> <type> <options> <dump> <pass>

# / ro
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX    /          btrfs    ro,nosuid,nodev,noexec,relatime,ssd,space_cache,subvolid=5,subvol=/   0 0

# /etc ro
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX    /etc       btrfs    ro,nosuid,nodev,noexec,relatime,ssd,space_cache,subvol=etc   0 0

# /opt ro
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX    /opt       btrfs    ro,nosuid,nodev,relatime,ssd,space_cache,subvol=opt   0 0

# /usr ro
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX    /usr       btrfs    ro,nodev,relatime,ssd,space_cache,subvol=usr   0 0

# /var rw
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX    /var       btrfs    rw,nodev,noexec,relatime,ssd,space_cache,subvol=var   0 0

# /home rw
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX    /home      btrfs    rw,nosuid,nodev,relatime,ssd,space_cache,subvol=home   0 0

Quelques notes sur les options de montage des sous-volumes BTRFS :

- L'option ssd n'est utile que pour les disques SSD.

- Les options nodev, nosuid et noexec sont facultatives mais recommandées pour des raisons de sécurité. Elles permettent respectivement de : désactiver la création de fichier spéciaux de périphériques, de désactiver les bits SUID/SGID des exécutables ainsi que de désactiver la possibilité de lancer un programme exécutable.

Mise en garde : Il est très important de garder le sous-volume /var en lecture-écriture, sans quoi le système ne pourra pas démarrer correctement.

On se retrouve donc avec un système en lecture seule pour quasiment toute la hiérarchie de fichiers à l'exception de /var /tmp /home (pour ce qui est des fichiers ne faisant pas partie de l'API du noyau Linux).

Gestion des changements de paquets

Lors de la mise à jour/installation/suppression d'un paquet, il est nécessaire de déclencher le remontage des partitions ro en rw avant d'exécuter l'action et de revenir à l'état initial.

Sur Arch Linux et dérivées

Il est possible de rajouter des hooks pour Pacman de cette manière :

cat > /etc/pacman.d/hooks/10-remount-etc-rw.hook << EOF
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Target = /etc

[Action]
Description = Remontage de /etc en lecture-écriture...
When = PreTransaction
Exec = /usr/bin/mount -o remount,rw /etc
EOF
cat > /etc/pacman.d/hooks/xx-remount-etc-ro.hook << EOF
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Target = /etc

[Action]
Description = Remontage de /etc en lecture seule...
When = PostTransaction
Exec = /usr/bin/mount -o remount,ro,bind /etc
EOF
Mise en garde : Le nom des fichiers est important, car les hooks s'exécutent dans un ordre précis. Pour que les hooks de remontage des sous-volumes s'exécutent avant ou après tout les autres hooks, il faut ajouter le préfixe "10-" ou "xx-" au nom des fichiers.

Cette opération est à répéter pour chaque sous-volume (en adaptant bien évidement le contenu).

Sur Debian et dérivées

Il est possible de rajouter des hooks pour Apt de cette manière :

cat > /etc/apt/apt.conf.d/00-remount-etc << EOF
Pre-Invoke {"/usr/bin/mount -o remount,rw /etc";};
Post-Invoke {"/usr/bin/mount -o remount,ro,bind /etc";};
EOF
Mise en garde : Le nom des fichiers est important, car les hooks s'exécutent dans un ordre précis. Pour que les hooks de remontage des sous-volumes s'exécutent avant ou après tout les autres hooks, il faut ajouter le préfixe "00-" au nom des fichiers.

Cette opération est à répéter pour chaque sous-volume (en adaptant bien évidement le contenu).