Systemd-homed est un nouveau mécanisme de gestion des utilisateurs UNIX [1]. Il promet la possiblité de stocker le répertoire utilisateur sur une clé USB chiffrée; d’après man homectl:
The following backing storage mechanisms are supported
[…]
- Similar, but the LUKS2 encrypted file system is located on regular block device, such as an USB storage stick. In this mode home directories and all data they include are nicely migratable between machines, simply by plugging the USB stick into different systems at different times.
Mais la documentation web [2] est peu détaillée sur la procédure de création
When the image is stored on removable media (such as a USB stick) the image file can be directly dd‘ed onto it, the format is unchanged.
On y arrive après quelques essais dont voici un résumé:
Création d’un utilisateur avec un nouveau home directory
La bonne approche est se trouve dans le 2e exemple de man homectl:
# homectl create $USER --storage=luks --image-path=/dev/disk/by-id/my-usb-device
Cette commande va écraser la clé USB et créer la structure suivante:
NAME TYPE PTTYPE LABEL FSTYPE UUID sdb disk gpt └─sdb1 part gpt $USER crypto_LUKS aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
La table de partition est de type GPT, et il contient une seule partition contenant un volume LUKS. Examinons les métadonnées de la partition:
# sgdick /dev/sdb -i 1
Partition GUID code: 773F91EF-66D4-49B5-BD83-D683BF40AD16 (Unknown)
Partition unique GUID: zzzzzzzz-yyyy-xxxx-wwww-vvvvvvvvvvvv
[…]
Attribute flags: 0000000000000000
Partition name: '$USER'
Le nom et le type de la partition (GUID code) sont ceux spécifiés dans [2]. Examinons l’entête du volume LUKS:
# cryptsetup luksDump /dev/disk/by-uuid/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
LUKS header information
Version: 2
[…]
UUID: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
Label: $USER
Subsystem: systemd-home
[…]
Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
[…]
Tokens:
0: systemd-homed
Digests:
0: pbkdf2
[…]
Comme spécifié dans [2], le label correspond à $USER et il y a un token de type systemd-homed
Regardons enfin:
# homectl inspect $USER
User name: $USER
State: inactive
Disposition: regular
Last Change: Thu 2020-12-02 10:23:28 CET
Login OK: yes
Password OK: yes
UID: $UID
GID: $GID ($USER)
Directory: /home/dummy
Storage: luks (strong encryption)
Image Path: /dev/disk/by-uuid/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
Removable: yes
Shell: /bin/bash
LUKS Discard: online=yes offline=yes
LUKS UUID: aaaaaaaabbbbccccddddeeeeeeeeeeee
Part UUID: zzzzzzzzyyyyxxxxwwwwvvvvvvvvvvvv
FS UUID: mmmmmmmmnnnnooooppppqqqqqqqqqqqq
File System: ext4
[…]
On voit notamment que l’image est reprérée à l’aide de l’UUID de LUKS.
(De)Activation
Dans la sortie de homectl précédente, le status est marqué inactive. L’activation correspond au montage du disque:
# homectl activate $USER
Une fois activé, le home directory /home/$USER est monté est le compte est accessible par les moyens classiques. La déactivation se fait de manière similaire avec la sous-commande deactivate.
Le montage est double, d’abort, le volume LUKS est monté:
# sudo cryptsetup status home-$USER
/dev/mapper/home-$USER is active and is in use.
type: LUKS2
cipher: aes-xts-plain64
keysize: 256 bits
key location: keyring
device: /dev/sdb1
sector size: 512
offset: 32768 sectors
size: 15734751 sectors
mode: read/write
flags: discards
et ce dernier est monté ensuite dans le home:
# mount | grep home-$USER
/dev/mapper/home-$USER on /home/$USER type ext4 (rw,nosuid,nodev,relatime,discard)
Examinons le système de fichiers:
# dumpe2fs /dev/mapper/home-$USER
dumpe2fs 1.45.6 (20-Mar-2020)
Filesystem volume name: $USER
Last mounted on: /run/systemd/user-home-mount
Filesystem UUID: mmmmmmmm-nnnn-oooo-pppp-qqqqqqqqqqqq
[…]
On retrouve les informations spécifiés dans [2].
Note Il faut être root pour activer un compte.
Login(out)
L’activation préalable du compte n’est pas nécessaire pour un login via un login shell ou via GDM.
Note. L’activation préalable est toutefois nécessaire pour faire un sudo -iu $USER.
Note. La commande su $USER ne marche pas.
Nomadisme
Lorsque la clé USB est débranchée, le status de l’utilisateur passe à absent, et repasse à inactive quand la clée est rebranchée.
Attention. GONME Shell détecte la partition LUKS et demande un mot de passe pour la monter automatiquement. In ne faut pas valider ce montage car GNOME Shell va monter la clé dans /run/media et homectl ne pourra plus utiliser la clé.
Losque la clé USB est branchée sur un autre ordinateur celle-ci est repérée par systemd-homed, mais a un status unfixiated. Il faut alors enregistrer l’utilisateur avec:
# homectl authenticate $USER
Cette étape requiert une authentification; elle ajoute une entrée dans passwd et consors.
Suppression
La suppression de compte se fait avec:
# homectl remove $USER
Si la clé USB est débranchée, alors $USER disparait des registres; si la clé USB est branchée, alors $USER passe à l’état unfixiated comme indiqué plus haut.
Attention. Dans man homectl, il est indiqué que la commande précédente supprime le contenu du home directory. C’est probablement ce qui arrive lorsque le home directory est stocké localement.