Configurer OpenBSD avec une racine en lecture seule

Auteur : Olivier BOYER - oboyer () ajoute ! org

Mots clés

OpenBSD, lecture seule, slash read-only

Introduction

Ce document présente comment configurer un système OpenBSD pourqu'il fonctionne sur un système de fichiers racine (slash) en lecture seule (read-only). Ce genre de configuration est particulièrement adaptée à des systèmes dédiés, comme les firewalls. En effet, leur configuration évolue peu, les modifications impactent en général le seul fichier des règles de pf(4), pf.conf(5).

Présentation de la maquette

  • une machine sous OpenBSD

Note

Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.

Installer le système

L'installation du système n'est pas détaillée dans ce document. Elle se déroule de manière “classique”. Pour savoir comment installer le système, vous pouvez suivre cette procédure : http://openbsd.org/faq/faq4.html.

Comme la machine est dédiée à être un firewall, il est préférable de limiter le nombre de sets installés. Il est recommandé de choisir seulement les éléments suivants :

  • bsd
  • baseXY.tgz
  • etcXY.tgz
  • manXY.tgz [facultatif]

De plus, un firewall n'exécute pas de lourds traitements, gourmands en capacité mémoire. La présence d'une partition swap dédiée n'est pas obligatoire. Enfin, la fonction de la machine n'impose pas de stocker de nombreux fichiers. Ainsi, une seule partition, la partition racine est suffisante.

Dans le reste du document, nous considérerons que :

  • une seule partition a été créé,
  • seuls les sets précédemment cités sont installés,
  • l'installation et la configuration de base de la machine sont effectués avec succès,
  • un utilisateur d'administration admin a été créé, avec sa HOME sous /home/admin.

Configurer le système avec slash en lecture seule

Présentation

Le fonctionnement d'un système OpenBSD avec le système de fichiers racine en lecture seule différence peu d'un fonctionnement “standard”. Les seuls changements se situent au niveau des répertoires où des données sont écrites, à savoir :

  • /dev
  • /home (doit être très petite, sert juste à la connexion des administrateurs)
  • /tmp
  • /var

Comme le système de fichiers est en lecture seule, aucune donnée ne peut être écrite, modifiée, ou supprimée. Cela pose des problèmes pour la gestion des périphériques, des fichiers temporaires, des locks, des pipes, ou encore des logs. En effet, ces éléments ne sont pas statiques, et ils sont indispensables au fonctionnement du système. Il faut donc utiliser une zone en lecture-écriture, ce qui paraît antinomique avec un système en lecture seule.

Heureusement, OpenBSD supporte un système de fichiers un peu particulier, le Memory File System ou mfs. Ce système de fichiers est construit dynamiquement en mémoire virtuelle, et est vu par le système d'exploitation comme un système de fichiers standard. Nous utiliserons le mfs pour contenir toutes les données en écriture du système.

Hormis la gestion des répertoires /dev, /home, /tmp et /var, aucune modification dans la gestion du système n'est visible. Les sections suivantes présentes les modifications à apporter aux configurations d'origine.

Créer le répertoire /mfs

Dans la nouvelle architecture du système, le répertoire /mfs contient tous les éléments variables du système qui sont montés en mémoire virtuelle, grâce au système de fichiers mfs.

Ce répertoire va contenir les éléments suivants :

  • /dev
  • /home
  • /var

Pour créer le répertoire /mfs et ses sous-répertoires, exécutez les commandes suivantes :

# mkdir /mfs
# mkdir /mfs/{dev,home}
#
# chmod 711 /mfs

Remplir le répertoire /mfs

/mfs/dev

Au démarrage, le système a besoin d'accéder à des fichiers dans /dev, notamment aux disques durs. Si ces périphériques n'existent pas, le démarrage échoue. Or, avec un système en lecture seule, le répertoire /dev est monté en mémoire, et ce montage intervient, dans l'ordre de démarrage, après l'accès aux disques durs. On se retrouve donc devant le dilemme de “la poule et de l'oeuf”.

Pour le résoudre, il faut garder le contenu de /dev inchangé, puisque dans les premiers instants du démarrage, les éléments qu'il contient sont accédés en lecture seule, et monter le contenu de /mfs/dev sur /dev. Les accès en lecture écriture se feront donc sur le /dev en mfs.

Pour créer les fichiers de périphériques, exécutez les commandes suivantes :

# cd /mfs/dev
# sh /dev/MAKEDEV all

/mfs/home

Le répertoire d'accueil de l'administrateur doit être le plus petit possible. En effet, il n'a pas vocation à contenir des fichiers volumineux, juste à lui permettre de se loger sur le firewall.

Nous supposons que l'utilisateur d'administration s'appelle admin et que sa HOME est dans le répertoire /home/admin. Pour remplir sa HOME en mfs, exécutez les commandes suivantes :

# mv /home/admin /mfs/home/admin

/mfs/var

Le cas de /var est un peu particulier. Il contient les données variables du système, telles que les logs, les fichiers temporaires, les locks, la base des packages, … Il doit donc être en mfs. Cependant, pour les packages, il est préférable de conserver la base de données intacte pour toutes les actions relatives à leur administration. Il est donc conseillé de copier le contenu de /var dans /mfs/var, et de monter /mfs/var au-dessus de /var.

Ainsi, lors des tâches d'administration du firewall, il sera possible de monter le système de fichiers racine en lecture écriture, de démonter /mfs/var, de modifier le contenu de /var, de le recopier dans /mfs/var, et de remonter /mfs/var en /var.

Vider /var

Avant de copier /var dans /mfs/var, il est conseillé de supprimer les données non nécessaires de /var. Pour ce faire, exécutez les commandes suivantes :

# rm -Rf /var/{account,admin,audit,crash,games,named,rwho,www}

Remplir /mfs/var

Exécutez les commandes suivantes :

# cd /
# tar cpf - ./var |( cd /mfs ; tar xpf - )
# sync

Gérer le répertoire /tmp

Le répertoire /tmp contient certaines données temporaires du système. Ce répertoire est nécessaire au système. Pour le conserver dans une architecture en lecture seule, il faut créer un lien symbolique vers le répertoire /var/tmp. En effet, ce dernier est en mfs.

Exécutez les commandes suivantes :

# cd /
# rm -Rf /tmp
# ln -s var/tmp tmp

Modifier le fichier /etc/fstab

Modifier comme suit le fichier /etc/fstab pour monter :

  • / en read-only,
  • /dev en mfs
  • /var en mfs
  • /home en mfs
#/etc/fstab

/dev/sd0a       /       ffs     ro,noatime,softdep      1 1

swap    /dev    mfs  rw,nosuid,noatime,noexec,-P=/mfs/dev,-s=8192,-i=2048 0 0
swap    /var    mfs  rw,nosuid,noatime,noexec,nodev,-P=/mfs/var,-s=30720 0 0
swap    /home   mfs  rw,nosuid,noatime,-P=/mfs/home,-s=50000 0 0

/dev/cd0a       /cdrom  cd9660  noauto,ro,nodev,nosuid,noexec   0 0
#EOF

Notez l'option -P des montages mfs. Elle indique d'utiliser le contenu du répertoire qui suit l'option pour remplir le contenu du point de montage en mémoire. Cette option évite donc de devoir modifier les scripts de démarrage pour remplir “à la main” les systèmes de fichiers en mémoire.

Modifier le fichier /etc/rc

Le shell script /etc/rc est invoqué par init(8) pour exécuter les commandes d'initialisation du système. Au début du démarrage, le système de fichier racine est monté en lecture seule, puis plus tard, il est remonté en lecture écriture. Il faut commenter cette action pour que le système de fichiers racine reste en lecture seule.

Apportez les modifications suivantes :

#(#:read-only /
#mount -uw /            # root on nfs requires this, others aren't hurt
#rm -f /fastboot        # XXX (root now writeable)
#(#:/read-only /

Liens

 
doc/openbsd/root_ro.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page