ChezManu.eu.org

Accueil // À propos




Liens :

Encrypt root partition of Raspberry Pi
Un article en anglais par U+309b, sensiblement similaire, sans fioritures, qui va à l'essentiel.
 
Sommaire :
1-Pourquoi faire ?
2-La différence avec une Debian sur x86
3-Pré-requis
4-Installation et chiffrement
5-Bonus 1 : transférer sur une mémoire plus importante
6-Bonus 2 : Gérer ses passphrases

1 - Pourquoi faire ?

Le Raspberry Pi est un ordinateur. Rien d'extraordinaire d'apprendre ça.
Mais c'est un ordinateur qui ne prends pas de place, puisqu'il fait la taille d'une carte de crédit, voire moins dans le cas du Raspberry Pi Zéro. Et c'est un ordinateur qui ne consomme presque rien. À peine 5 Watts. Moins qu'une ampoule. C'est presque 100 fois moins que mon premier serveur. Et ça veut donc dire presque 100 fois moins sur la facture d'électricité, hein.
Alors que faire avec un ordi, qui ne consomme rien, qui ne prends pas de place, mais qui n'a ni écran ni puissance comparable à celle des machines d'aujourd'hui ?
Facile, un serveur, par exemple, dans mon cas, hébergé à la maison, derrière une ligne ADSL propre (c'est à dire dont l'IP rattachée ne change pas tous les 4 matins et dont le FAI ne bloque aucun port, ni n'effectue de filtrage sale et grossier). Dans mon cas c'est une ligne fournie par FDN.
Gérer son mail par exemple,

2 - La différence avec une Debian sur x86

Le Raspberry Pi, contrairement à une machine de bureau, ne peut booter que sur la carte SD, il est impossible de le faire booter depuis une clé USB par exemple. Cela implique donc qu'il n'y a pas d'installation à proprement parler, mais on va flasher sur une carte SD une version de Debian conçue pour le Raspberry Pi qui se nomme « Raspbian ».

L'option « installer sur un volume chiffré » que l'on connait pendant l'installation classique de Debian n'existe donc pas.
Pour remédier à cela, on va donc booter sur une carte SD, y laisser la partition /boot, préparer une partition chiffrer sur une clé ou un disque dur USB, indiquer au bootloader que la partition / se trouve sur la dite clé USB, et enfin copier / sur la clé.

3 - Pré-requis

⋅ Un PC sachant faire tourner un client SSH ;
⋅ Un Raspberry Pi connecté à Internet ;
⋅ Une carte SD et un lecteur de cartes SD sur le PC ;
⋅ Une clé USB branchée sur le Raspberry Pi. Conventions :
  • ⋅ « thy » sera mon login, je vous invite à adapter le tutoriel pour mettre le votre, bien entendu ;
  • ⋅ Ma machine fixe est nommée « Mary-Sue » ;
  • ⋅ le Raspberry sera successivement nommée « Raspberrypi » puis « framboise » ;
  • ⋅ Sur mon PC fixe la carte SD est désignée par « /dev/mmcblk0 », cela pourrait être différent sur votre machine, possiblement « /dev/sdb » ;
  • ⋅ seront surligné en rouge informations à retenir et noter.
  • ⋅ un logo laptop apparaitra sur les captures d'écran des commande à saisir sur votre machine principale ;.
  • ⋅ Pour les commandes à rentrer dans le shell de notre Raspberry Pi, un dessin de ce dernier apparaitra sur les captures d'écran ;
  • ⋅ une horloge, 🕐, indiquera la durée de la plupart des opérations .

4 - Installation et chiffrement

Commençons par télécharger l'image, sur le poste de travail; la décompresser et la flasher sur la carte SD :

wget -q https://downloads.raspberrypi.org/raspbian_lite_latest -O raspbian.zip
unzip raspbian.zip && mv $(unzip -Z1 raspbian.zip) raspbian.img
sudo dd if=raspbian.img of=/dev/mmcblk0 bs=10M && sync && rm raspbian*

🕐 temps estimé :
− Téléchargement : 4 minutes en VDSL 40Mbits/s ;
− dézippage : 1 minute sur une machine à base de processeur i3 ;
− flashage : 2 minutes sur une carte µSD SanDisk de classe 10.

 ………


Depuis la fin 2016 l'équipe dévellopant Raspbian a décidé de compliquer la vie des users, sans prévenir sur la page de téléchargements sinon c'est pas drôle, en ajoutant une procédure supplémentaire. Il faut désormais poser un fichier dénommé « ssh » sur la partition /boot.
À défaut de notifier de ce changement, même pas en évidence sur la page ou l'on télécharge Raspbian, les auteurs ont posé la baffouille peu convaincante sur raspberrypi.org/blog/a-security-update-for-raspbian-pixel.

 ………


Une fois flashée, inserez la carte SD dans le Raspberry Pi, allumez le et connectez le à votre routeur.
En toute logique son nom sur le réseau sera raspberrypi.lan, et son IP dépendra de l'humeur du moment du serveur DHCP de votre routeur.
Pour connaitre son IP, utilisons l'utilitaire nmap :
Vérifions cela avec nmap.
La commande suivante scannera votre LAN partant du principe qu'il est adressé en 192.168.1.QQCHOSE. Vous adapterez au besoin.

nmap 192.168.10.0/24 -sP

 ………


puis connectons nous en SSH sur le Raspberry Pi. L'utilisateur par défaut est « pi » et son mot de passe « raspberry ».
SSH nous demandera de confirmer en tapant « yes » en toutes lettres que l'on souhaite bien s'y connecter en nous indiquant sa fingerprint. Elle n'est plus jamais censée bouger. Si un jour, sans avoir réinstallé raspbian, cette question vous est reposée c'est qu'il y a un sérieux problème et que l'intégrité de la machine est mise en doute.

ssh pi@raspberrypi

 ………


On va commencer par passer root, puis définir un mot de passe, puis créer un user autre que « pi ».

sudo su
passwd
adduser thy

 ………


Bien !
La sonnette est à notre nom, le coup de pinceau de la mise à jour est terminée et la peinture est sèche.
Il est temps d'installer les softs de première nécessité :
  • ⋅ busybox : pour obtenir un shell minimal en temps voulu ;
  • ⋅ cryptsetup : la brique angulaire de tout Linux chiffré ;
  • ⋅ dropbear : un serveur SSH minimal qui sera lancé pour pouvoir déchiffrer notre / à distance ;
  • ⋅ rsync pour copier plus intelligement qu'avec la commande cp ;
  • ⋅ rpi-update qui se chargera de mettre à jour le noyau de l'OS et le firmware du Raspberry ;
  • ⋅ ntpdate : pour s'assurer que notre Raspberry est bien à l'heure.

apt-get -y -q install busybox cryptsetup dropbear rsync rpi-update ntpdate && update-rc.d ssh enable

🕐 : une minute

 ………

 ………


Personnalisons l'hostname, par défaut « raspberry » par le nom souhaité pour notre machine, içi « framboise » :

sed "s/raspberrypi/framboise/" -i /etc/hostname

 ………


Lancons l'utilitaire Raspi-config

raspi-config

Première chose à faire : aller dans les options de boot, choisir un prompt sur une console en mode texte, avec login requis.
Pour une obscure histoire liée à systemd nous ne pourrons pas supprimer l'user « pi » si on ne procède pas à cela auparavant.
(entre nous, à part les seigneurs Sith, que peut-on trouvere de plus obscur que ce qui est lié à Systemd ?)
Étant donné que le couple « pi/raspberry » est désormais largement en tête dans les essais de login lorsqu'un scan de port SSH à lieu, c'est une précaution nécessaire en terme de sécurité que de pouvoir virer ce dernier.
3 Boot Options → B1 Console

 ………


 ………


Ensuite il va falloir indiquer le fuseau horaire dans lequel le Raspberry est situé.
5 Internationalisation Options → I2 Change Timezone
Europe → Paris.
À adapter évidemment si vous ne vous trouvez pas dans le même fuseau horaire que moi.
Ensuite quittez l'utilitaire, qui vous demandera au passage s'il convient de rebooter.
Choisissez « YES ».

 ………


 ………


 ………


 ………


Abandonnons le Raspberry Pi un instant pour revenir sur le PC principal en extraire votre clé SSH publique et la transférer au Raspberry Pi:

ssh-copy-id -i ~/.ssh/id_rsa.pub thy@framboise

 ………


On va pouvoir se connecter à notre Raspberry Pi, mais cette fois avec notre nom d'utilisateur (ici « thy » pour l'exemple) et le bon nom de la machine ( donc « framboise »).
SSH vous demandera de nouveau, c'est normalement la dernière fois, si vous êtes sur⋅e de vouloir vous connecter.
En effet, jusqu'à présent il connaissait « raspberry » pas « framboise » ; acceptez en tapant yes en toutes lettres.
On remarque au passage que l'ECDSA key fingerprint, est la même que lors de notre première connexions. C'est normal, si la machine a changé de nom, sa configuration −y compris SSH− n'a pas changé.

ssh thy@framboise

On souffle un coup… les choses sérieuses démarrent maintenant :-)

su && deluser --remove-home pi

On commence par virer l'utilisateur pi, comme un malprore, en supprimant son /home.

 ………


et lançons mkinitramfs, en donnant en argument la version du kernel utilisé sur le coup :

mkinitramfs -o /boot/initramfs.gz $(uname -r)

 ………


🕐 : 30 secondes

Quelques erreurs vont surgir et des caractères bien étranges, une clé SSH, vont apparaitre, rien d'affolant.
Il est temps d'éditer quelques fichiers.
On commencera par indiquer au noyau que la racine ne se trouve plus au même endroit qu'avant :

sed -e "s|root=/dev/mmcblk0p2|root=/dev/mapper/usbcrypt cryptdevice=/dev/sda1:usbcrypt|" -i /boot/cmdline.txt

On continue en éditant /boot/config.txt :

echo initramfs initramfs.gz 0x00f00000 >> /boot/config.txt

ajoutons cette commande ci en en-tête du fichier contenant la liste des clés SSH autorisées.

echo 'command="/scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3`"' > /etc/initramfs-tools/root/.ssh/authorized_keys

Copions notre clé dans la liste de celles autorisées lorsque nous en sommes au stade « InitramFS » du boot !

echo $(cat /home/thy/.ssh/authorized_keys) >> /etc/initramfs-tools/root/.ssh/authorized_keys

Cette commande fait que OpenSSH et Dropbear présenterons la même empreinte de clé SSH, ce qui nous évitera des messages d'erreur intempestifs :

cp /etc/ssh/ssh_host_rsa_key.pub /etc/initramfs-tools/root/.ssh/id_rsa

Ceci fait, éditons maintenant le fichier /etc/fstab :

sed -e "s|/dev/mmcblk0p2|/dev/mapper/usbcrypt|" -i /etc/fstab

(en effet, « usbcrypt » sera le nom donné au volume LUKS qui sera présent sur la clé USB)
Il serait bon d'indiquer que « usbcrypt », ca se trouvera sur la clé USB, soit /dev/sda1, pour ce faire :

echo -e "usbcrypt\t/dev/sda1\tnone\tluks" >> /etc/crypttab

Sur les Raspberry Pi l'USB peut mettre du temps à être reconnu, ce qui peut poser problème, corrigons cela en temporisant 5 secondes :

sed "s/configure_networking\ \&/echo \"USB se réveille en douceur\"\nsleep\ 5\nconfigure_networking\ \&/" -i /usr/share/initramfs-tools/scripts/init-premount/dropbear


 ………


Crééons une partitions sur la clé USB, ou le disque dur externe :

fdisk /dev/sda

ensuite :
  • d (delete) pour effacer une éventuelle partition existante ;
  • n (new) pour une nouvelle partition ;
  • laisser le choix par défaut, p, pour indiquer que ce sera une partition primaire ;
  • premier secteur : choix par défaut ;
  • dernier secteur : choix par défaut également, la partition occupera toute la place disponible ;
  • w (write) pour écrire les modifications sur la clé et quitter fdisk.

 ………


Maintenant que la partition est crée, chiffrons la, ouvrons la et formattons la :

cryptsetup -v -y luksFormat /dev/sda1

Tapons « YES » en capitales.
Puis la phrase de passe, puis la confirmation.

cryptsetup -v luksOpen /dev/sda1 usbcrypt

Rentrer la phrase de passe définie juste avant.

mkfs.ext4 /dev/mapper/usbcrypt

🕐 :1 minute sur une clé USB noname de 8 Gio. Pour formatter la partition chiffrée.

 ………


Ensuite montons dans deux répertoires distincts la partition (en clair) de la carte SD et celle, chiffrée de la clé USB :

mkdir /tmp/rootplain && mount /dev/mmcblk0p2 /tmp/rootplain/
mkdir /tmp/rootcrypt && mount /dev/mapper/usbcrypt /tmp/rootcrypt/

Puis avec rsync copions le contenu de la première vers la seconde :

rsync -a /tmp/rootplain/ /tmp/rootcrypt/

 ………


🕐 : 8 minutes
À ce stade les fichiers de configuration sont prêts, la partition / est chiffrée et déplacée sur la clé USB.
Il ne reste plus qu'à générer pour de bon l'initramfs avant de rebooter :

mkinitramfs -o /boot/initramfs.gz $(uname -r) && update-initramfs -u && reboot

🕐 : 30 secondes

 ………


Parfait !
le plus dur devrait être derrière nous.
L'intérêt de tout ce qu'on viens de faire, c'est de pouvoir déverrouiller le Raspberry Pi sans devoir y brancher un clavier et un écran dessus. À distance, via SSH.
Comme le système n'est pas totalement démarré, il ne fonctionnera qu'en mode mono-utilisateur, soit root.

ssh root@framboise

Maintenant que nous sommes loggués, il ne reste plus qu'à déchiffrer le volume Luks. Nous l'avions déjà fait tout à l'heure pour copier les données, avant le reboot, la syntaxe est donc ressemblante :

/sbin/cryptsetup luksOpen /dev/sda1 usbcrypt

Puis saisir la phrase de passe.

 ……… Il faudrait maintenant que le système daigne nous rendre la main, pour cela :

ps | grep {cryptroot} | grep -v grep

Le processus porte le PID 161 (ce nombre peut varier).
Tuons donc le processus 161 :

kill 161

Puis sortons de busybox.

exit

Maintenant on va pouvoir se logguer tout à fait normalement :

ssh thy@framboise

 ………


Et profiter maintenant de son Raspberry Pi déverrouillable à distance, et dont les données sont en théorie inviolables.
Ho, une dernière chose pour la route, effacer la partition root de la carte SD.

su
dd if=/dev/urandom of=/dev/mmcblk0p2 bs=10M

 ………

🕐 : 1h

Gérer les mises à jour de l'OS

Pour mettre à jour votre distribution Raspbian :

ntpdate -u fr.pool.ntp.org && apt-get -q -y update && apt-get -q -y upgrade && rpi-update

🕐 : entre 10 minutes et 1 heure.

 ………  ………

On note bien la version du kernel qui sera employé au prochain boot ; dans notre cas : 4.4.14-v7+.
À noter :
Prenez la première version du kernel si vous utilisez un RPI 1, par exemple 4.4.14+. Et la deuxième (4.4.14-v7+) dans le cas d'un RPI2.
(personne ne m'as encore offert de RPI3 pour tester, si vous voulez savoir, vous savez ce qu'il vous reste à faire)

mkinitramfs -o /boot/initramfs.gz 4.4.14-v7+ && update-initramfs -u && reboot

 ………


5 - Bonus 1 : transférer sur une mémoire plus importante

Après tout ce travail vous n'avez peut être envie de ne pas tout recommencer à la moindre occasion. Il va donc s'agir de sauvegarder le contenu de la carte SD et de la clé USB.
Ou bien encore de passer sur une clé, ou un disque dur, de capacité plus importante, pour X ou Y raison.
En ce qui concerne la carte SD, qui contient le /boot c'est facile, il y a qques dizaines de Mo de données sur la première partition de la carte, au format FAT32, un copier/coller et en parle plus…
Pour le / qui est sur la clé USB, il va falloir faire quelques manipulations, en fait assez similaires à ce qu'on à déjà fait, créer une partition, la chiffrer, copeir les données.
Juste une remarque :
Un Raspberry Pi ne délivre pas assez d'intensité électrique au niveau de ses ports USB pour alimenter à lui seul un disque dur externe. On veuillera donc à choisir un modèle qui possède un branchement en Y, ce qui est la solution retenue pour les modèles 2.5". Un port data à brancher sur le Raspberry Pi pour le transport des données, un port power à brancher sur une source plus importante (un chargeur de téléphone, le port USB de votre box, un hub USB alimenté…) pour l'alimentation électrique
Ou un disque dur externe qui possède sa propre alimentation, dans le cas des disques durs 3.5".
Commençons par regarder ce que nous avons comme espace libre :

df -h

 ………


Un disque de 7G dont 5.6 sont libres. Comme précédemment, nous allons effacer le contenu du disque pour ensuite créer une partition :

fdisk /dev/sdb

ensuite :
  • d (delete) pour effacer une éventuelle partition existante ;
  • n (new) pour une nouvelle partition ;
  • laisser le choix par défaut, p, pour indiquer que ce sera une partition primaire ;
  • premier secteur : choix par défaut ;
  • dernier secteur : choix par défaut également, la partition occupera toute la place disponible ;
  • w (write) pour écrire les modifications sur la clé et quitter fdisk.
  •  ………


    Puis créer un volume chiffré dans la dite partition, pour ensuite le formater :

    cryptsetup -v -y luksFormat /dev/sdb1
    cryptsetup -v luksOpen /dev/sdb1 usbcrypt2
    mkfs.ext4 /dev/mapper/usbcrypt2

     ………


    🕐 : 30 secondes Puis monter la partition chiffrée de la seconde clé USB
    Et enfin copier le contenu de la première vers la seconde.

    mkdir /tmp/root1 && mount /dev/mapper/usbcrypt /tmp/root1
    mkdir /tmp/root2 && mount /dev/mapper/usbcrypt2 /tmp/root2
    rsync -a /tmp/root1/ /tmp/root2/

    🕐 : 12 minutes

    Un reboot (en ne conservant que le nouveau disque dur) plus tard, on peut constater que la place disponible est plus importante qu'avant nous avons désormais 13G de libre :
     ………


    6 - Bonus 2 : Gérer ses passphrases

    voir l etat des slots :

    cryptsetup luksDump /dev/sda1

    ajouter un slot :

    cryptsetup luksAddKey /dev/sda1

    effacer un slot :

    cryptsetup luksKillSlot /dev/sda1 0

    8 - Références


    Machine
    Nom Débit max. théorique Commentaire
    -
    -

1983 - 2016 // Emmanuel Bourguin