From 438224a79708a9ecebd215b059ea08d0eea8c5b8 Mon Sep 17 00:00:00 2001 From: Ludovic Poujol Date: Tue, 7 May 2024 16:32:12 +0200 Subject: [PATCH] HowtoClevis/Tang (wip) --- HowtoClevis.md | 123 +++++++++++++++++++++++++++++++++++++++++++++++++ HowtoTang.md | 116 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 239 insertions(+) create mode 100644 HowtoClevis.md create mode 100644 HowtoTang.md diff --git a/HowtoClevis.md b/HowtoClevis.md new file mode 100644 index 00000000..79413607 --- /dev/null +++ b/HowtoClevis.md @@ -0,0 +1,123 @@ +--- +categories: clevis chiffrement +title: Howto Clevis +... + +* Github / Documentation : + +[Clevis](https://github.com/latchset/clevis) est un logiciel qui permet l'automatisation de déchiffrement. Il peut être utilisé pour déchiffrer automatiquement des fichiers ou dévérouiller des partition chiffrées avec [LUKS](./HowtoLUKS) + +Pour pouvoir déchiffrer automatiquement un élément, il a besoin d'être associé avec un PIN. Dans la terminologie de Clevis, un PIN est un plugin qui implémente une méthode de déchiffrement automatique. Ça peut être [Tang](./HowtoTang) pour faire ça par le réseau ou un TPM 2.0 (ou une clé FIDO2) ou une combinaison de plusieurs PINs en s'appuyant sur [le partage de clé secrète de Shamir](https://fr.wikipedia.org/wiki/Partage_de_cl%C3%A9_secr%C3%A8te_de_Shamir) + + +## Installation + +~~~ +# apt install clevis luks clevis-systemd + +$ clevis --help + +Usage: clevis COMMAND [OPTIONS] + + clevis decrypt Decrypts using the policy defined at encryption time + clevis encrypt sss Encrypts using a Shamir's Secret Sharing policy + clevis encrypt tang Encrypts using a Tang binding server policy + clevis luks bind Binds a LUKS device using the specified policy + clevis luks common functions + clevis luks edit Edit a binding from a clevis-bound slot in a LUKS device + clevis luks list Lists pins bound to a LUKSv1 or LUKSv2 device + clevis luks pass Returns the LUKS passphrase used for binding a particular slot. + clevis luks regen Regenerate clevis binding + clevis luks report Report tang keys' rotations + clevis luks unbind Unbinds a pin bound to a LUKS volume + clevis luks unlock Unlocks a LUKS volume +~~~ + +> **Remarque** : il y a d'autres paquets installables en fonction des cas et des besoins. Par exemple `clevis-tpm2` est nécessaire uniquement si on souhaite se servir du TPM de la machine. De même, pour le déchffirement de la racine au démarrage, il faut le paquet `clevis-initramfs` pour que cette opération se fasse au boot. + +## Configuration + +### Partition chiffrées avec LUKS + +#### Binding d'un volume avec tang + +Un binding est un lien entre un volume chiffré et un PIN pour Clevis. Il peut y avoir plusieurs bindings pour un volume donné. + +Binding d'une partition chiffrée `/dev/sdz` avec le serveur tang à l'addresse `http://192.0.2.10:42` + +``` +# clevis luks bind -d /dev/sdz tang '{"url": "http://192.0.2.10:42"}' +Enter existing LUKS password: +The advertisement contains the following signing keys: + +X4rKb0DNu7rpmrjHF0SbeQfMQ-mUoVHdUiiNOmiFx1c + +Do you wish to trust these keys? [ynYN] y +``` + +> **Note** : Voir [la commande tang-show-keys dans le HowtoTang](./HowtoTang#afficher-lales-clé-actuelle) pour vérifier la clé affichée. + +#### Binding d'un volume avec un TPM 2.0 + +A Compléter + +#### Liste des bindings + +Il peut y avoir plusieurs bindings pour un volume LUKS +On peut utiliser la commande `clevis luks list` prévue à cet effet pour lister les bindings et leurs paramètres. + + +Exemple pour lister les bindings de `/dev/sdz` + +``` +# clevis luks list -d /dev/sdz +1: tang '{"url":"http://192.0.2.10:42"}' +2: tang '{"url":"http://192.0.2.29:42"}' +``` + +#### Retrait d'un binding + +> **REMARQUE IMPORTANTE** : Avant de retirer un binding, assurez-vous que les méthodes restantes (mot de passe, autre bindings avec clevis) puisse vous permettre de continuer de déverouiller le volume + +Comme il peut y avoir plusieurs bindings, il faut récupérer son numéro de slot avec la commande [`clevis luks list`](#liste-des-bindings) + + +Exemple : Retirer le binding dans avec le serveur tang sur `http://192.0.2.29:42` (slot numéro 2) pour `/dev/sdz` + +``` +# clevis luks list -d /dev/sdz +1: tang '{"url":"http://192.0.2.10:42"}' +2: tang '{"url":"http://192.0.2.29:42"}' + +# clevis luks unbind -d /dev/sdz -s 2 +The unbind operation will wipe a slot. This operation is unrecoverable. +Do you wish to erase LUKS slot 1 on /dev/sdz? [ynYN] y +Enter any remaining passphrase: + +# clevis luks list -d /dev/sdz +2: tang '{"url":"http://192.0.2.10:42"}' +``` + +#### Rotation de clés + +Après une rotation de clé d'un serveur [tang](./HowtoTang#rotation-de-clés), il faut mettre à jour le binding du slot + +Exemple : Mise à jour du binding de `/dev/sdz` présent au *slot 1* : + +``` +# clevis luks report -d /dev/sdz -s 1 +The following keys are not in the current advertisement and were probably rotated: + 6cSAW9rr6KH4mKga3urSJatIHYHOibA28AKJQlVfIxQ + aH0R-mkpdt7y72zoFEGCxZyeNMWZreoblk1H3zjIx2g +Do you want to regenerate the binding with "clevis luks regen -q -d /dev/sdz -s 1"? [ynYN] y +Regenerating binding (device /dev/sdz, slot 1): +Pin: tang, Config: '{"url":"http://192.0.2.10:42"}' +Binding regenerated successfully +``` + +> *Note* : Si les anciennes clés sont toujours disponibles, *Clevis* Ne demandera pas si on fait confiance à la nouvelle clé, car elle sera signée par l'ancienne déjà connue. + + +## Plomberie + +## FAQ \ No newline at end of file diff --git a/HowtoTang.md b/HowtoTang.md new file mode 100644 index 00000000..914005d4 --- /dev/null +++ b/HowtoTang.md @@ -0,0 +1,116 @@ +--- +categories: Tang chiffrement +title: Howto Tang +... + +* Github / Documentation : + +[Tang](https://github.com/latchset/tang) est un serveur pour permettre le déblocage/déchiffrement automatique de ressources quand elles sont présentes dans un réseau donné. C'est parfois appellé NBDE "Network Bound Disk Encryption". Il est utilisé comme PIN par [Clevis](./HowtoClevis) + + +## Installation + +~~~ +# apt install tang + +# systemctl status tangd.socket +● tangd.socket - Tang Server socket + Loaded: loaded (/lib/systemd/system/tangd.socket; enabled; preset: enabled) + Active: active (listening) since Mon 2024-05-02 14:48:44 CEST; 17s ago + Listen: [::]:80 (Stream) + Accepted: 0; Connected: 0; + Tasks: 0 (limit: 9144) + Memory: 8.0K + CPU: 613us + CGroup: /system.slice/tangd.socket + +may 02 14:48:44 hostname systemd[1]: Listening on tangd.socket - Tang Server socket. +~~~ + +## Configuration + +Tang n'a pas de daemon actif. C'est une socket de [systemd](./HowtoSystemd) (`tangd.socket`) qui est en écoute. Elle lancera un service `tangd@` qui se chargera de répondre à la requête. + +Par défaut la socket écoute sur le port 80 de toutes les interfaces réseau pour tangd. Il est possible de changer ce réglage via une surcharge (override) de la configuration systemd avec la commande `systemctl edit tangd.socket` (Ou alors manuellement éditier un fichier `/etc/systemd/system/tangd.socket.d/evolinux.conf` puis recharger la configuration `systemctl daemon-reload` et redémarrer la socket `systemctl restart tangd.socket`) + + +Exemple pour forcer l'écoute sur le port 42 de l'inteface d'un réseau privée ayant 192.0.2.10 comme IP (et avec localhost en plus) : + +``` +# systemctl edit tangd.socket + +### Editing /etc/systemd/system/tangd.socket.d/override.conf +### Anything between here and the comment below will become the new contents of the file + +[Socket] +# Rappel : Dans une surcharge de configuration systemd, si on souhaite écraser totalement des directives pouvant être répétées (comme ListenStream), il faut la préciser une première fois sans valeur. Dans le cas contraire, ça sera défini en plus de ce qu'il y a dans le fichier originel. +ListenStream= +ListenStream=127.0.0.1:42 +ListenStream=[::1]:42 +ListenStream=192.0.2.10:42 +``` + +Référence : [systemd.socket(5)](https://manpages.debian.org/bookworm/systemd/systemd.socket.5.en.html) + +## Administration + +Les clés cryptographiques sont enregistrées dans `/var/lib/tang`. S'il n'y a pas de clés présente, elle sera générée à la premère requête. Les fichier de clés cachés (ie: commençant par un ".") ne sont pas annoncés, mais sont toujours utilisables par les clients, le temps qu'ils basculent sur les nouvelles clés. + +### Afficher la/les clé actuelle + +On peut afficher localement l'identifiant de la clé active avec la commande `tang-show-keys [port (si différent de 80)]` + +Exemple (avec tang sur le port *42* ) : + +``` +# tang-show-keys 42 +iYzCrNa251c3iSXP5bc3o8EZpPgy6l4nFZisgeFHZmE +``` + +> *Remarque* : On ne peut pas préciser l'URL, seulement le port. Il faut donc que la socket de tang écoute aussi sur localhost. + +### Rotation de clés + +Il est possible de renouveller les clés utilisées par tang. L'ancienne clée sera mise de côté (ie: renommage du fichier avec un "." en début). Elle reste utilisable mais elle ne sera plus annoncée. + +L'outil `/usr/libexec/tangd-rotate-keys` permet de faire cette opération simplement. Il faut spécifier avec l'option *-d* le dossier des clés. + +Exemple : + +``` +# /usr/libexec/tangd-rotate-keys +Please specify the keys directory with -d switch +Usage: /usr/libexec/tangd-rotate-keys [-h] [-v] -d + +Perform rotation of tang keys + + -d KEYDIR The directory with the keys, e.g. /var/db/tang + + -h Display this usage information + + -v Verbose. Display additional info on keys created/rotated + + +# tang-show-keys 42 +zlY3DlZ-RsvtFfRR4VMHX-WU8Bwmqw-wWLQVc56UdP8 + +# /usr/libexec/tangd-rotate-keys -v -d /var/lib/tang/ +Disabled advertisement of key YjndnmP4TKYBVKVukvf-2i3RdrWrynovBnmV8Uxh6p8.jwk -> .YjndnmP4TKYBVKVukvf-2i3RdrWrynovBnmV8Uxh6p8.jwk +Disabled advertisement of key zlY3DlZ-RsvtFfRR4VMHX-WU8Bwmqw-wWLQVc56UdP8.jwk -> .zlY3DlZ-RsvtFfRR4VMHX-WU8Bwmqw-wWLQVc56UdP8.jwk +Created new key X4rKb0DNu7rpmrjHF0SbeQfMQ-mUoVHdUiiNOmiFx1c.jwk +Created new key -5uJrqweM-kkHFOtfi_UWBbjPUJs8h7w2VfBascFaSw.jwk +Keys rotated successfully + +# tang-show-keys 42 +X4rKb0DNu7rpmrjHF0SbeQfMQ-mUoVHdUiiNOmiFx1c + +``` + +Il faut ensuite mettre à jour les bindings de tous les clients avec la nouvelle clé. +Voir [dans le HowtoClevis, section rotation de clés](./HowtoClevis#rotation-de-clés) + +Il ne faut pas supprimer les clés désactivées. Même non-annoncées elles permettent toujours à des clients qui ne sont pas encore à jour de dévérouiller leurs éléments chiffrés. + +## Monitoring + +## FAQ