HowtoClevis/Tang (wip)

This commit is contained in:
Ludovic Poujol 2024-05-07 16:32:12 +02:00
parent 134a020783
commit 438224a797
Signed by: lpoujol
SSH key fingerprint: SHA256:YZbQWfjHONnvIGkFZMs0xRKtqzqGqwtZU+kCOKhZXPA
2 changed files with 239 additions and 0 deletions

123
HowtoClevis.md Normal file
View file

@ -0,0 +1,123 @@
---
categories: clevis chiffrement
title: Howto Clevis
...
* Github / Documentation : <https://github.com/latchset/clevis>
[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

116
HowtoTang.md Normal file
View file

@ -0,0 +1,116 @@
---
categories: Tang chiffrement
title: Howto Tang
...
* Github / Documentation : <https://github.com/latchset/tang>
[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 <KEYDIR>
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