diff --git a/man/crypttab.xml b/man/crypttab.xml
index 9b6fffd154..3942fe67f9 100644
--- a/man/crypttab.xml
+++ b/man/crypttab.xml
@@ -41,7 +41,7 @@
character are ignored. Each of the remaining lines describes one
encrypted block device. Fields are delimited by white space.
- Each line is in the formnameencrypted-devicepasswordoptions
+ Each line is in the formvolume-nameencrypted-devicekey-fileoptions
The first two fields are mandatory, the remaining two are
optional.
@@ -53,24 +53,20 @@
it is opened as a LUKS device; otherwise, it is assumed to be in
raw dm-crypt (plain mode) format.
- The first field contains the name of the resulting encrypted
- block device; the device is set up within
- /dev/mapper/.
+ The first field contains the name of the resulting encrypted volume; its block device is set up
+ below /dev/mapper/.The second field contains a path to the underlying block
device or file, or a specification of a block device via
UUID= followed by the UUID.
- The third field specifies the encryption password. If the
- field is not present or the password is set to
- none or -, the password has
- to be manually entered during system boot. Otherwise, the field is
- interpreted as an absolute path to a file containing the encryption
- password. For swap encryption, /dev/urandom
- or the hardware device /dev/hw_random can be
- used as the password file; using /dev/random
- may prevent boot completion if the system does not have enough
- entropy to generate a truly random encryption key.
+ The third field specifies an absolute path to a file to read the encryption key from. If the field
+ is not present or set to none or -, a key file named after the
+ volume to unlock (i.e. the first column of the line), suffixed with .key is
+ automatically loaded from the /etc/cryptsetup-keys.d/ and
+ /run/cryptsetup-keys.d/ directories, if present. Otherwise, the password has to be
+ manually entered during system boot. For swap encryption, /dev/urandom may be used
+ as key file.The fourth field, if present, is a comma-delimited list of
options. The following options are recognized:
@@ -138,6 +134,15 @@
size is then given by the key size.
+
+
+
+ If enabled, the specified key file is erased after the volume is activated or when
+ activation fails. This is in particular useful when the key file is only acquired transiently before
+ activation (e.g. via a file in /run/, generated by a service running before
+ activation), and shall be removed after use. Defaults to off.
+
+
@@ -431,6 +436,15 @@
before it is used to unlock the LUKS volume.
+
+
+
+ Takes a boolean argument. If enabled, right before asking the user for a password it
+ is first attempted to unlock the volume with an empty password. This is useful for systems that are
+ initialized with an encrypted volume with only an empty password set, which shall be replaced with a
+ suitable password during first boot, but after activation.
+
+
diff --git a/man/systemd-cryptsetup@.service.xml b/man/systemd-cryptsetup@.service.xml
index 0324a67440..47051b9cef 100644
--- a/man/systemd-cryptsetup@.service.xml
+++ b/man/systemd-cryptsetup@.service.xml
@@ -44,6 +44,32 @@
At early boot and when the system manager configuration is reloaded, /etc/crypttab is
translated into systemd-cryptsetup@.service units by
systemd-cryptsetup-generator8.
+
+ In order to unlock a volume a password or binary key is
+ required. systemd-cryptsetup@.service tries to acquire a suitable password or binary
+ key via the following mechanisms, tried in order:
+
+
+ If a key file is explicitly configured (via the third column in
+ /etc/crypttab), a key read from it is used. If a PKCS#11 token is configured
+ (using the pkcs11-uri= option) the key is decrypted before use.
+
+ If no key file is configured explicitly this way, a key file is automatically loaded
+ from /etc/cryptsetup-keys.d/volume.key and
+ /run/cryptsetup-keys.d/volume.key, if present. Here
+ too, if a PKCS#11 token is configured, any key found this way is decrypted before
+ use.
+
+ If the try-empty-password option is specified it is then attempted
+ to unlock the volume with an empty password.
+
+ The kernel keyring is then checked for a suitable cached password from previous
+ attempts.
+
+ Finally, the user is queried for a password, possibly multiple times.
+
+
+ If no suitable key may be acquired via any of the mechanisms describes above, volume activation fails.
diff --git a/man/yubikey-crypttab.sh b/man/yubikey-crypttab.sh
index c0717b364e..651246d6a1 100644
--- a/man/yubikey-crypttab.sh
+++ b/man/yubikey-crypttab.sh
@@ -23,8 +23,9 @@ dd if=/dev/urandom of=plaintext.bin bs=128 count=1
base64 < plaintext.bin | tr -d '\n\r\t ' > plaintext.base64
# Encrypt this newly generated (binary) LUKS decryption key using the public key whose private key is on the
-# Yubikey, store the result in /etc/encrypted-luks-key.bin, where we'll look for it during boot.
-sudo openssl rsautl -encrypt -pubin -inkey pubkey.pem -in plaintext.bin -out /etc/encrypted-luks-key.bin
+# Yubikey, store the result in /etc/cryptsetup-keys.d/mytest.key, where we'll look for it during boot.
+mkdir -p /etc/cryptsetup-keys.d
+sudo openssl rsautl -encrypt -pubin -inkey pubkey.pem -in plaintext.bin -out /etc/cryptsetup-keys.d/mytest.key
# Configure the LUKS decryption key on the LUKS device. We use very low pbkdf settings since the key already
# has quite a high quality (it comes directly from /dev/urandom after all), and thus we don't need to do much
@@ -40,8 +41,10 @@ shred -u plaintext.bin plaintext.base64
rm pubkey.pem
# Test: Let's run systemd-cryptsetup to test if this all worked. The option string should contain the full
-# PKCS#11 URI we have in the clipboard, it tells the tool how to decipher the encrypted LUKS key.
-sudo systemd-cryptsetup attach mytest /dev/sdXn /etc/encrypted-luks-key.bin 'pkcs11-uri=pkcs11:…'
+# PKCS#11 URI we have in the clipboard; it tells the tool how to decipher the encrypted LUKS key. Note that
+# systemd-cryptsetup automatically searches for the encrypted key in /etc/cryptsetup-keys.d/, hence we do
+# not need to specify the key file path explicitly here.
+sudo systemd-cryptsetup attach mytest /dev/sdXn - 'pkcs11-uri=pkcs11:…'
# If that worked, let's now add the same line persistently to /etc/crypttab, for the future.
-sudo bash -c 'echo "mytest /dev/sdXn /etc/encrypted-luks-key \'pkcs11-uri=pkcs11:…\'" >> /etc/crypttab'
+sudo bash -c 'echo "mytest /dev/sdXn - \'pkcs11-uri=pkcs11:…\'" >> /etc/crypttab'