31 May 2021, 00:00

Gestion des disques OPAL 2.0

Share

(OPAL 1 est un peu différent et n’est pas analysé ici)

Généralités

La norme OPAL 2.0 est une norme qui définit notamment un standard pour qu’un péripĥérique de stockage (disque dur, ssd etc) auto-protège ses données par du chiffrement. C’est un SED, un Self-Encrypting Disk.
C’est donc une puce dans le disque lui-même qui s’occupe de chiffrer et déchiffrer les données (libérant ainsi le CPU de ces tâches, et réduisant la surface d’attaque concernant les failles CPU/RAM ; d’autres attaques concernant ce type de chiffrement sont toutefois existantes).

Le chiffrement du disque se fait un peu à la manière de LUKS : la clé qui va réellement chiffrer les données (Data Encryption Key, DEK) est elle-même chiffrée par le mot de passe utilisateur (Authentication Key, AK).
Ainsi, il est facile de changer le mot de passe du disque sans tout rechiffrer (la DEK ne change pas, mais est rechiffrée avec la nouvelle AK).
Il est également instantané et simple d’effacer de manière sécurisée et intégralement un disque, simplement en regénérant une nouvelle DEK. Ainsi, le reste du contenu n’a pas besoin d’être effacé, puisqu’il est indéchiffrable, la clé ayant été supprimée. C’est le Secure Disk Erasure.

Sur un disque OPAL, les données sont TOUJOURS chiffrées par une DEK, mais en l’absence de AK, la DEK est lisible en clair et donc utilisée de manière transparente (voir MSID).

Spécifications d’OPAL sur le site du TCG : https://www.trustedcomputinggroup.org/wp-content/uploads/TCGandNVMe_Joint_White_Paper-TCG_Storage_Opal_and_NVMe_FINAL.pdf

Un diaporama qui schématise bien OPAL et différentes attaques

USB

La disponibilité de l’interface OPAL via un adaptateur USB va dépendre de l’adaptateur en question. Ce fil mentionne un adaptateur qui semble fonctionner avec les disques M.2 SATA et NVMe.

Doc chez ArchLinux

Terminologie

  • SD : Storage Device : le support de stockage (disque, SSD, clé USB etc)
  • MEK (ou DEK) : Media (ou Data) Encryption key : la clé qui chiffre les données sur le disque ; chiffrée par la KEK
  • AC : Authentication Credentials : le mot de passe utilisateur (“password”)
  • AK : Authentication Key (ou PIN) : dérivée de l’AC
  • KEK : Key-Encryption-Key : dérivée de l’AK, chiffre la DEK
  • TPer : Trusted Peripheral
  • MSID : Manufacturer Secure ID : une clé fixe, lisible par tout le monde directement sur le disque, qui fait office de AK par défaut.
  • PSID : Physical Security ID : présent physiquement sur le disque (ou la boîte), permet de réinitiliser le disque (avec PERTE de données). Il est optionnel pour OPAL v2.00, et obligatoire pour OPAL v2.01
  • Verrouillage (Locking) : Création/suppression de la MEK (déchiffrée) dans la RAM du disque. Lorsqu’elle est absente, le disque est verrouillé. Une fois la MEK accessible grâce au password, elle est stockée dans la RAM du disque jusqu’à la prochaine coupure d’alimentation (ou verrouillage manuel ?). Le disque est alors déverrouillé.

Locking Range

Les intervalles de verrouillage sont des sections continues sur le disque, exprimées en LBA, qui peuvent être verrouillées de manière indépendantes les unes des autres. Chaque intervalle a sa propre MEK.
Ceci permet, il me semble, de partager un disque entre plusieurs utilisateurs, en ne laissant chacun accéder qu’aux données qui lui sont autorisées.
Ceci permet également d’avoir certains intervalles qui ne sont PAS chiffrés.

Le Global Range représente l’ensemble des intervales qui ne sont pas définis explicitement (les Local Ranges). C’est le range 0.

Lorsqu’on définit un nouvel intervalle, les données déjà présentes dessus sont détruites.

On peut lister les LockingRange ainsi :
sudo ./sedutil-cli --listLockingRanges mYpAsSwOrD /dev/sdX

Authentification pré-boot

La Preboot-Authentication (PBA) est un MBR particulier (shadow MBR) qui contient une instance de sedutil permettant de déverrouiller le disque, pour ensuite pouvoir le démarrer.
Selon cette discussion, MBREnable = Y dit au disque de présenter ce shadow MBR lors du boot, alors que MBRDone = Y dit au disque de ne PLUS présenter ce shadow MBR.

Sous Debian

La gestion d’un disque OPAL sous Linux se fait avec l’utilitaire sedutil. C’est un utilitaire open-source, développée par la Drive Trust Alliance.
Il n’est, en 2021, pas disponible dans les dépôts Debian, et doit donc être téléchargé ou compilé depuis le lien ci-dessus.

Pour pouvoir gérer les disques SATA, il faut activer le paramètre allow_tpm du module libata. Pour le faire de manière permanente, il faut ajouter libata.allow_tpm=1 à /etc/default/grub (ligne GRUB_CMDLINE_LINUX_DEFAULT=), mettre à jour la config de GRUB et redémarrer.
Pour le faire de manière temporaire sans redémarrage du système, il semble qu’il faille écrire 1 dans le fichier /sys/module/libata/parameters/allow_tpm, mais je n’arrive pas à obtenir l’accès en écriture sur mon système.

Ceci ne semble pas nécessaire pour les disques NVMe. Par contre, il semble qu’il faille être root.

Utilisation de sedutil

Cet utilitaire nécessite souvent les droits root pour agir directement sur le périphérique.

Syntaxe

Codes d’erreur :

  • NOT_AUTHORIZED : mauvais mot de passe
  • AUTHORITY_LOCKED_OUT : trop d’essais infructueux, il faut éteindre/rallumer le disque

Lister les disques et leur support d’OPAL :

sudo sedutil-cli --scan
/dev/sda No -> Pas de support d’OPAL
/dev/sda 12 -> Support d’OPAL (“12” pour support de OPAL 1 et 2, “2” pour support d’OPAL 2 uniquement, il me semble)

Lister les détails d’un périphérique :

sudo ./sedutil-cli --query /dev/nvme0
On y voit notamment le statut de verrouillage (LockingEnabled) et de shadowing du MBR (MBREnabled) :

Locking function (0x0002)
    Locked = N, LockingEnabled = Y, LockingSupported = Y, MBRDone = N, MBREnabled = Y, MediaEncrypt = Y

PSID revert - DÉTRUIT TOUTES LES DONNÉES SI VERROUILLAGE ACTIVÉ

Ceci va réinitialiser https://www.reddit.com/r/sysadmin/comments/9ogdnk/psid_revert_of_encrypted_ssd_not_possible/
sudo ./sedutil-cli --yesIreallywanttoERASEALLmydatausingthePSID PSIDPASSWORD /dev/sdX
sudo ./sedutil-cli --PSIDrevert PSIDPASSWORD /dev/sdX
Si le constructeur a mis des tirets dans le PSID, il faut les enlever (sinon on aura l’erreur “One or more header fields have 0 length”). Il doit faire 32 caractères de long.

Initialisation du chiffrement

sudo sedutil-cli --initialSetup mYpAsSwOrD /dev/sdX
Définit les mot de passe SID et Admin1 (avec le password fourni) (c’est le takeownership).
Active le shadowing de MBR.

Ceci équivaut aux suites de commandes (à vérifier) :

sudo ./sedutil-cli --takeOwnership mYpAsSwOrD /dev/sdX
# définit les password SID et Admin1

sudo ./sedutil-cli --activateLockingSP mYpAsSwOrD /dev/sdX
# active la possibilité de chiffrement ? (LockingEnabled)

sudo ./sedutil-cli --setMBREnable on mYpAsSwOrD /dev/sdX
#

On peut ensuite effectivement chiffrer le disque :
sudo ./sedutil-cli --enablelockingrange 0 mYpAsSwOrD /dev/sdX

Le disque devient ainsi non-lisible sans le mot de passe (y compris le MBR, il n’apparaîtra pas dans fdisk).
On voit “Locked = Y” lorsqu’on lance query

Déverrouillage d’un disque chiffré

sudo ./sedutil-cli --setlockingrange 0 rw mYpAsSwOrD /dev/sdX
Il redevient ainsi libible, y compris le MBR.
On peut également définir le volume en lecture seule :
sudo ./sedutil-cli --setlockingrange 0 ro mYpAsSwOrD /dev/sdX
ou le verrouiller :
sudo ./sedutil-cli --setlockingrange 0 lk mYpAsSwOrD /dev/sdX

Suppression du chiffrement

https://github.com/Drive-Trust-Alliance/sedutil/wiki/Remove-OPAL

On peut désactiver le chiffrement SANS suppresion des données avec :
sudo ./sedutil-cli --revertnoerase mYpAsSwOrD /dev/sdX
(il faut avoir deverrouillé le disque avant, en RX ou RO, sinon erreur FAIL)