Comment configurer un pool ZFS chiffré avec DigitalOcean Block Storage sur FreeBSD

ZFS est un système de fichiers et un gestionnaire de volumes qui prennent en charge des capacités de stockage élevées, prennent en charge la compression et peuvent empêcher la corruption des données. ZFS, lorsqu’il est associé à stable/stock/ de DigitalOcean, fournit une solution de stockage facile à configurer et à étendre.

Dans ce guide, vous allez configurer des volumes de stockage en mode bloc pour ZFS sur FreeBSD qui sont chiffrés pour protéger vos données.

Conditions préalables

  • Une droplet FreeBSD dans un centre de données prenant en charge le stockage en bloc, avec au moins 4 Go de RAM, car ZFS a tendance à consommer beaucoup de mémoire, en particulier si vous souhaitez effectuer la déduplication en bloc. Nous utiliserons le compte * freebsd * par défaut, créé automatiquement lorsque vous créez un droplet FreeBSD. Pour en savoir plus sur la connexion à votre Droplet FreeBSD et sur sa gestion de base, consultez la série de tutoriels Comment démarrer avec FreeBSD.

  • Un volume de 100 Go attaché à votre Droplet. Vous pouvez créer ce volume lorsque vous créez votre Droplet ou utiliser https://www.digitalocean.com/community/tutorials/how-to-use-block-storage-on-digitalocean#creating-and-attaching-volumes [ce guide] pour créer et joindre un volume.

Ce didacticiel utilisera également un deuxième volume de 100 Go pour expliquer comment ajouter des volumes au pool, mais vous n’avez pas besoin de le configurer au préalable. les instructions seront abordées dans le contexte à l’étape 5.

Étape 1 - Partitionnement du volume

Même si nous utiliserons l’ensemble du volume pour un seul système de fichiers, il est généralement judicieux de placer une carte de partition sur le volume. Cela nous permet d’appliquer des étiquettes significatives aux partitions que nous créons.

Tout d’abord, confirmons que le volume est connecté et disponible. Connectez-vous à votre Droplet.

ssh freebsd@

Une fois connecté, vérifiez que le volume a été connecté en consultant le résultat de la commande + dmesg +. Le SSD local d’un droplet FreeBSD apparaît sous la forme + vtbd0 + et tous les volumes attachés apparaîtront sous la forme de périphériques + da +.

Utilisez + grep + pour filtrer les résultats de la commande + dmesg + pour + da0 +, qui est notre volume attaché. Apprenez-en plus sur + grep + dans notre tutoriel Using Grep & Regular Expressions pour rechercher des modèles de texte sous Linux.

dmesg | grep

Vous verrez une sortie semblable à celle-ci:

Outputda0 at vtscsi0 bus 0 scbus2 target 0 lun 1
da0: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da0: 300.000MB/s transfers
da0: Command Queueing enabled
da0: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)

Une fois que vous avez vérifié que le volume est disponible, créez une carte de partition en utilisant le format GPT. Exécutez la commande suivante:

sudo gpart create -s gpt

Ensuite, créez une seule partition pour ZFS.

sudo gpart add -t  -l

L’indicateur + -t + nous permet de spécifier le type de partition et l’option + -l + nous permet d’appliquer une étiquette à la partition. L’étiquette peut être ce que nous aimons. Dans ce cas, nous allons faire correspondre le nom du volume pour aider à garder les choses droites.

Protégeons maintenant les données que nous allons placer sur cette partition des regards indiscrets.

Étape 2 - Configuration du cryptage

Le cryptage des données présente de nombreux avantages et il est facile à configurer. Actionnons le pilote aesni afin que nous puissions utiliser le cryptage AES à accélération matérielle:

sudo kldload aesni

Nous pouvons maintenant configurer le chiffrement geli sur la partition. Nous allons utiliser la commande + geli + et spécifier une longueur de clé et la partition que nous voulons chiffrer:

sudo geli init -l  /dev/gpt/

L’option + -l + spécifie la longueur de la clé, qui doit être 128 bits ou 256 bits pour l’algorithme AES-XTS. Nous référençons la partition en utilisant l’étiquette que nous avons spécifiée précédemment.

Lorsque vous exécutez la commande, un mot de passe composé vous sera demandé:

OutputEnter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_volume-nyc1-01.eli and
can be restored with the following command:

   # geli restore /var/backups/gpt_volume-nyc1-01.eli /dev/gpt/volume-nyc1-01

Chaque fois que votre Droplet est redémarré, vous devez entrer cette phrase secrète pour rattacher la partition cryptée. C’est un inconvénient mineur en échange d’une meilleure sécurité.

Maintenant, attachez la partition cryptée:

sudo geli attach /dev/gpt/

Le mot de passe composé que vous avez entré lors de l’initialisation de la partition vous sera demandé:

OutputEnter passphrase:

Ceci configure + / dev / gpt / volume-nyc1-01.eli +, qui est la version décryptée de la partition. Les données écrites sur ce périphérique bloc sont cryptées et écrites sur le périphérique sous-jacent. C’est le chemin que nous attacherons à notre pool de stockage, que nous créerons ensuite.

Étape 3 - Configuration du pool ZFS

Un pool de stockage ZFS, ou zpool, est un ensemble de volumes et constitue le moyen par lequel ZFS gère son système de fichiers. Et ils sont faciles à créer. Etant donné que les volumes DigitalOcean implémentent leur propre redondance de données, il n’est pas nécessaire de créer plusieurs volumes et de les mettre en miroir, ni de les exécuter dans une configuration RAID-Z; nous pouvons simplement utiliser le volume individuel directement dans la piscine.

La commande + zpool create + crée un nouveau zpool. Il faut un nom pour le pool et le volume que vous souhaitez ajouter au pool.

sudo zpool create tank /dev/gpt/

Nous utilisons le nom générique + tank + pour notre pool, mais vous pouvez utiliser le nom de votre choix.

Le volume étant connecté sur un réseau, l’accès aux fichiers sera plus lent que sur le disque SSD local. Afin de minimiser la quantité de données en cours d’écriture sur le périphérique via le réseau, permettons la compression au niveau de la couche système de fichiers ZFS. Ceci est entièrement facultatif et peut être défini système par fichier.

Nous allons utiliser l’algorithme de compression LZ4, optimisé pour la vitesse tout en offrant une compression correcte. Pour d’autres options, consultez la page de manuel https://www.freebsd.org/cgi/man.cgi?query=zfs [+ zfs +].

sudo zfs set compression=lz4 tank

Regardons maintenant notre piscine. Nous pouvons obtenir des informations détaillées en utilisant la commande + zpool list +:

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT

La taille totale du pool est légèrement inférieure à la taille totale du volume, en raison du temps de partitionnement et du formatage.

Nous pouvons également afficher le système de fichiers ZFS de ce pool en utilisant la commande + zfs list +:

zfs list
OutputNAME   USED  AVAIL  REFER  MOUNTPOINT

ou avec la commande + df +:

df -h
OutputFilesystem         Size    Used   Avail Capacity  Mounted on
/dev/gpt/rootfs     57G    2.2G     50G     4%    /
devfs              1.0K    1.0K      0B   100%    /dev

Vous utiliserez ces commandes de temps en temps pour vérifier l’état de santé de votre nouveau système de fichiers.

Avant de poursuivre, vérifions que le module de noyau ZFS démarre lorsque nous démarrons notre système d’exploitation. Le module a été chargé automatiquement pour nous lorsque nous avons exécuté la commande + zpool create + avec + sudo +, mais il serait préférable que le module soit chargé automatiquement.

Pour ce faire, éditez le fichier + / etc / rc.conf +:

sudo vi /etc/rc.conf

Ajoutez cette ligne après toutes les lignes existantes du fichier:

/etc/rc.conf

zfs_enable="YES"

Enregistrez ensuite les modifications dans le fichier. Lorsque le serveur redémarre, le module de noyau ZFS se charge.

L’un des avantages de ZFS est la possibilité d’ajouter plus de stockage au pool à mesure que nos besoins augmentent. Voyons comment cela fonctionne.

Étape 4 - Ajout de volumes supplémentaires au pool

Nous pouvons élargir la piscine avec des volumes supplémentaires si nous avons besoin de plus d’espace. Avec ZFS, il suffit simplement d’ajouter un périphérique au pool.

Tout d’abord, nous avons besoin d’un autre appareil. Joignez un nouveau volume de 100 Go à votre Droplet. Voir this guide pour savoir comment procéder.

Une fois le volume prêt, retournez sur le terminal de votre serveur et vérifiez que le nouveau volume existe et est connecté. Le nouveau volume sera identifié comme + da1 +.

dmesg | grep
Outputda1 at vtscsi0 bus 0 scbus2 target 0 lun 2
da1: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da1: 300.000MB/s transfers
da1: Command Queueing enabled
da1: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)

Ensuite, partitionnez et étiquetez le nouveau volume en utilisant le même processus que celui utilisé pour le premier volume. Commencez par créer la partition:

sudo gpart create -s gpt

Et puis créez le volume:

sudo gpart add -t freebsd-zfs -l

Puisque votre volume existant est chiffré, activez le chiffrement sur ce nouveau volume:

sudo geli init -l 256 /dev/gpt/

Une fois encore, vous serez invité à saisir une phrase secrète pour pouvoir déchiffrer et attacher le volume.

OutputEnter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/gpt_volume-nyc1-02.eli and
can be restored with the following command:

   # geli restore /var/backups/gpt_volume-nyc1-02.eli /dev/gpt/volume-nyc1-02

Ensuite, attachez ce nouveau volume en fournissant la phrase secrète lorsque vous y êtes invité:

sudo geli attach /dev/gpt/

Et enfin, ajoutez-le au pool ZFS:

sudo zpool add tank /dev/gpt/

Le système de fichiers se développe automatiquement à la taille du pool, que vous pouvez vérifier à l’aide de la commande suivante:

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank            -     0%     0%  1.00x  ONLINE  -

Et nous pouvons vérifier avec la commande + zfs list:

zfs list

La sortie indique le volume + tank + et la quantité d’espace correcte:

OutputNAME   USED  AVAIL  REFER  MOUNTPOINT
tank  62.5K       19K  /tank

Lorsque vous avez besoin de plus d’espace, répétez ce processus pour ajouter plus de volumes au pool.

Nous avons ajouté des partitions chiffrées à notre pool. Nous allons donc voir comment les rattacher après le redémarrage du serveur.

Étape 5 - Gestion d’un redémarrage

Lorsque vous redémarrez votre serveur, les partitions chiffrées ne seront plus attachées. Vous devrez les joindre manuellement. Pour s’entraîner, procédons à un redémarrage afin de voir le processus.

Utilisez la commande + shutdown + pour redémarrer votre serveur, ce qui déconnectera votre session SSH.

sudo shutdown -r now

Le redémarrage de votre système peut prendre environ une minute. Une fois la machine en ligne, reconnectez-vous à votre Droplet.

ssh freebsd@

Ensuite, attachez les partitions chiffrées.

sudo geli attach /dev/gpt/volume-nyc1-01
sudo geli attach /dev/gpt/volume-nyc1-02

Lorsque vous attachez chaque partition, le mot de passe composé que vous avez entré lors de l’initialisation de cette partition vous sera demandé.

Regardez maintenant les résultats de votre pool en utilisant + zpool +:

sudo zpool list

Une fois les partitions attachées, ZFS voit automatiquement le pool et monte les systèmes de fichiers.

OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT

Si nous n’avions pas chiffré les volumes, nous n’aurions pas à nous soucier de ces étapes supplémentaires lors d’un redémarrage. Nous négocions la commodité pour une sécurité accrue; personne ne peut joindre les volumes et consulter le contenu sans la phrase secrète.

Conclusion

Comme vous pouvez le constater, ZFS et DigitalOcean’s Block Storage facilitent la création d’un système de fichiers évolutif et chiffré répondant à vos besoins. Pour en savoir plus sur ZFS sous FreeBSD, consultez la page FreeBSD.