Chiffrement des disques et RAID

J'ai suivi ce tuto sur le wiki de Archlinux.

J'ai deux disques de 2 To et deux disques de 1 To.

L'idée est de joindre ces disques deux par deux en RAID1. Pas la peine d'utiliser de volumes LVM, ça complique inutilement pour le moment. Un de ces volumes en RAID servira au stockage pour NextCloud, l'autre au stockage des données du reste des applications. Et on chiffre tout ça avec LUKS.

Schématiquement :

Hard drives /dev/sda (1 To) /dev/sdb (1 To) /dev/sdc (2 To) /dev/sde (2 To)
Partitions /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
RAID arrays /dev/md0 (1 To) /dev/md1 (2 To)
Point de montage /data /cloud

Création de l'array RAID

Source : Arch wiki

Supprimer les anciennes infos RAID :

mdadm --misc --zero-superblock /dev/<drive or partition>

Création des partitions :

fdisk

Création des arrays RAID :

mdadm --create --verbose --level=1 --metadata=1.2 --raid-devices=2 /dev/md/raidCloud /dev/sdc1 /dev/sde1
mdadm --create --verbose --level=1 --metadata=1.2 --raid-devices=2 /dev/md/raidData /dev/sda1 /dev/sdb1

On met à jour la configuration de *mdadm* :

mdadm --detail --scan >> /etc/mdadm.conf

Formatage du système de fichier des RAID :

mkfs.ext4 -v -L dataraid /dev/md/raidData
mkfs.ext4 -v -L cloudraid /dev/md/raidCloud

Scrubbing : c'est bien de vérifier de temps en temps l'état du RAID et résoudre les erreurs. Pour lancer un *scrub* :

echo check > /sy/block/mdX/md/sync_action

On peut ensuite voir le statut de l'opération avec :

cat /proc/mdstat

Pour arrêter un *scrub* :

echo idle > /sys/block/mdX/md/sync_action

Quand le *scrub* est fini, on peut voir le nombre de blocks problématiques (s'il y en a) :

cat /sys/block/mdX/md/mismatch_cnt

S'il y a des gros problèmes de disques : Arch wiki : removing devices from an array.

Chiffrement avec LUKS

Préparation des block devices :

# data
cryptsetup open --type plain /dev/md/raidData container --key-file /dev/random
dd if=/dev/zero of=/dev/mapper/container bs=1M status=progress
cryptsetup close container
 
# cloud
cryptsetup open --type plain /dev/md/raidCloud container --key-file /dev/random
dd if=/dev/zero of=/dev/mapper/container bs=1M status=progress
cryptsetup close container

Chiffrement :

# data
cryptsetup -y -v luksFormat /dev/md/raidData
cryptsetup open /dev/md/raidData cryptdata
mkfs.ext4 /dev/mapper/cryptdata
mkdir /data
mount /dev/mapper/cryptdata /data
 
# cloud
cryptsetup -y -v luksFormat /dev/md/raidCloud
cryptsetup open /dev/md/raidCloud cryptcloud
mkfs.ext4 /dev/mapper/cryptcloud
mkdir /cloud
mount /dev/mapper/cryptcloud /cloud

Configuration des fichiers de clé (cf Arch wiki) :

Création des fichiers :

dd bs=512 count=4 if=/dev/random of=/etc/luks-keys/cryptdata
dd bs=512 count=4 if=/dev/random of=/etc/luks-keys/cryptcloud

Défendre l'accès de ces fichiers :

chmod 600 /etc/luks-keys/cryptdata
chmod 600 /etc/luks-keys/cryptcloud
chmod -R 600 /etc/luks-keys/

Configurer LUKS pour utiliser un fichier de clé :

cryptsetup luksAddKey /dev/md/raidData /etc/luks-keys/cryptdata
cryptsetup luksAddKey /dev/md/raidCloud /etc/luks-keys/cryptcloud

Déchiffrer et monter automatiquement les disques au démarrage, il faut modifier deux fichiers.

/etc/crypttab :

cryptdata      UUID=XXX          /etc/luks-keys/cryptdata
cryptcloud     UUID=XXX          /etc/luks-keys/cryptcloud

Pour avoir les UUID en question :

ls -l /dev/disk/by-uuid

/etc/fstab :

/dev/mapper/cryptdata      /data      ext4    rw,relatime   0 2
/dev/mapper/cryptcloud     /cloud     ext4    rw,relatime   0 2

Pas besoin d'utiliser de UUID ici, vu que lors du déchiffrement des disques on associe des noms.