279 lines
12 KiB
Text
279 lines
12 KiB
Text
Cryptsetup 2.2.0 Release Notes
|
|
==============================
|
|
Stable release with new experimental features and bug fixes.
|
|
|
|
Cryptsetup 2.2 version introduces a new LUKS2 online reencryption
|
|
extension that allows reencryption of mounted LUKS2 devices
|
|
(device in use) in the background.
|
|
|
|
Online reencryption is a complex feature. Please be sure you
|
|
have a full data backup before using this feature.
|
|
|
|
Changes since version 2.1.0
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
LUKS2 online reencryption
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The reencryption is intended to provide a reliable way to change
|
|
volume key or an algorithm change while the encrypted device is still
|
|
in use.
|
|
|
|
It is based on userspace-only approach (no kernel changes needed)
|
|
that uses the device-mapper subsystem to remap active devices on-the-fly
|
|
dynamically. The device is split into several segments (encrypted by old
|
|
key, new key and so-called hotzone, where reencryption is actively running).
|
|
|
|
The flexible LUKS2 metadata format is used to store intermediate states
|
|
(segment mappings) and both version of keyslots (old and new keys).
|
|
Also, it provides a binary area (in the unused keyslot area space)
|
|
to provide recovery metadata in the case of unexpected failure during
|
|
reencryption. LUKS2 header is during the reencryption marked with
|
|
"online-reencryption" keyword. After the reencryption is finished,
|
|
this keyword is removed, and the device is backward compatible with all
|
|
older cryptsetup tools (that support LUKS2).
|
|
|
|
The recovery supports three resilience modes:
|
|
|
|
- checksum: default mode, where individual checksums of ciphertext hotzone
|
|
sectors are stored, so the recovery process can detect which sectors were
|
|
already reencrypted. It requires that the device sector write is atomic.
|
|
|
|
- journal: the hotzone is journaled in the binary area
|
|
(so the data are written twice)
|
|
|
|
- none: performance mode; there is no protection
|
|
(similar to old offline reencryption)
|
|
|
|
These resilience modes are not available if reencryption uses data shift.
|
|
|
|
Note: until we have full documentation (both of the process and metadata),
|
|
please refer to Ondrej's slides (some slight details are no longer relevant)
|
|
https://okozina.fedorapeople.org/online-disk-reencryption-with-luks2-compact.pdf
|
|
|
|
The offline reencryption tool (cryptsetup-reencrypt) is still supported
|
|
for both LUKS1 and LUKS2 format.
|
|
|
|
Cryptsetup examples for reencryption
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The reencryption feature is integrated directly into cryptsetup utility
|
|
as the new "reencrypt" action (command).
|
|
|
|
There are three basic modes - to perform reencryption (change of already
|
|
existing LUKS2 device), to add encryption to plaintext device and to remove
|
|
encryption from a device (decryption).
|
|
|
|
In all cases, if existing LUKS2 metadata contains information about
|
|
the ongoing reencryption process, following reencrypt command continues
|
|
with the ongoing reencryption process until it is finished.
|
|
|
|
You can activate a device with ongoing reencryption as the standard LUKS2
|
|
device, but the reencryption process will not continue until the cryptsetup
|
|
reencrypt command is issued.
|
|
|
|
|
|
1) Reencryption
|
|
~~~~~~~~~~~~~~~
|
|
This mode is intended to change any attribute of the data encryption
|
|
(change of the volume key, algorithm or sector size).
|
|
Note that authenticated encryption is not yet supported.
|
|
|
|
You can start the reencryption process by specifying a LUKS2 device or with
|
|
a detached LUKS2 header.
|
|
The code should automatically recognize if the device is in use (and if it
|
|
should use online mode of reencryption).
|
|
|
|
If you do not specify parameters, only volume key is changed
|
|
(a new random key is generated).
|
|
|
|
# cryptsetup reencrypt <device> [--header <hdr>]
|
|
|
|
You can also start reencryption using active mapped device name:
|
|
# cryptsetup reencrypt --active-name <name>
|
|
|
|
You can also specify the resilience mode (none, checksum, journal) with
|
|
--resilience=<mode> option, for checksum mode also the hash algorithm with
|
|
--resilience-hash=<alg> (only hash algorithms supported by cryptographic
|
|
backend are available).
|
|
|
|
The maximal size of reencryption hotzone can be limited by
|
|
--hotzone-size=<size> option and applies to all reencryption modes.
|
|
Note that for checksum and journal mode hotzone size is also limited
|
|
by available space in binary keyslot area.
|
|
|
|
2) Encryption
|
|
~~~~~~~~~~~~~
|
|
This mode provides a way to encrypt a plaintext device to LUKS2 format.
|
|
This option requires reduction of device size (for LUKS2 header) or new
|
|
detached header.
|
|
|
|
# cryptsetup reencrypt <device> --encrypt --reduce-device-size <size>
|
|
|
|
Or with detached header:
|
|
# cryptsetup reencrypt <device> --encrypt --header <hdr>
|
|
|
|
3) Decryption
|
|
~~~~~~~~~~~~~
|
|
This mode provides the removal of existing LUKS2 encryption and replacing
|
|
a device with plaintext content only.
|
|
For now, we support only decryption with a detached header.
|
|
|
|
# cryptsetup reencrypt <device> --decrypt --header <hdr>
|
|
|
|
For all three modes, you can split the process to metadata initialization
|
|
(prepare keyslots and segments but do not run reencryption yet) and the data
|
|
reencryption step by using --init-only option.
|
|
|
|
Prepares metadata:
|
|
# cryptsetup reencrypt --init-only <parameters>
|
|
|
|
Starts the data processing:
|
|
# cryptsetup reencrypt <device>
|
|
|
|
Please note, that due to the Linux kernel limitation, the encryption or
|
|
decryption process cannot be run entirely online - there must be at least
|
|
short offline window where operation adds/removes device-mapper crypt (LUKS2) layer.
|
|
This step should also include modification of /etc/crypttab and fstab UUIDs,
|
|
but it is out of the scope of cryptsetup tools.
|
|
|
|
Limitations
|
|
~~~~~~~~~~~
|
|
Most of these limitations will be (hopefully) fixed in next versions.
|
|
|
|
* Only one active keyslot is supported (all old keyslots will be removed
|
|
after reencryption).
|
|
|
|
* Only block devices are now supported as parameters. As a workaround
|
|
for images in a file, please explicitly map a loop device over the image
|
|
and use the loop device as the parameter.
|
|
|
|
* Devices with authenticated encryption are not supported. (Later it will
|
|
be limited by the fixed per-sector metadata, per-sector metadata size
|
|
cannot be changed without a new device format operation.)
|
|
|
|
* The reencryption uses userspace crypto library, with fallback to
|
|
the kernel (if available). There can be some specific configurations
|
|
where the fallback does not provide optimal performance.
|
|
|
|
* There are no translations of error messages until the final release
|
|
(some messages can be rephrased as well).
|
|
|
|
* The repair command is not finished; the recovery of interrupted
|
|
reencryption is made automatically on the first device activation.
|
|
|
|
* Reencryption triggers too many udev scans on metadata updates (on closing
|
|
write enabled file descriptors). This has a negative performance impact on the whole
|
|
reencryption and generates excessive I/O load on the system.
|
|
|
|
New libcryptsetup reencryption API
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
The libcryptsetup contains new API calls that are used to setup and
|
|
run the reencryption.
|
|
|
|
Note that there can be some changes in API implementation of these functions
|
|
and/or some new function can be introduced in final cryptsetup 2.2 release.
|
|
|
|
New API symbols (see documentation in libcryptsetup.h)
|
|
* struct crypt_params_reencrypt - reencryption parameters
|
|
|
|
* crypt_reencrypt_init_by_passphrase
|
|
* crypt_reencrypt_init_by_keyring
|
|
- function to configure LUKS2 metadata for reencryption;
|
|
if metadata already exists, it configures the context from this metadata
|
|
|
|
* crypt_reencrypt
|
|
- run the reencryption process (processing the data)
|
|
- the optional callback function can be used to interrupt the reencryption
|
|
or report the progress.
|
|
|
|
* crypt_reencrypt_status
|
|
- function to query LUKS2 metadata about the reencryption state
|
|
|
|
Other changes and fixes
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
* Add optional global serialization lock for memory hard PBKDF.
|
|
(The --serialize-memory-hard-pbkdf option in cryptsetup and
|
|
CRYPT_ACTIVATE_SERIALIZE_MEMORY_HARD_PBKDF in activation flag.)
|
|
|
|
This is an "ugly" optional workaround for a situation when multiple devices
|
|
are being activated in parallel (like systemd crypttab activation).
|
|
The system instead of returning ENOMEM (no memory available) starts
|
|
out-of-memory (OOM) killer to kill processes randomly.
|
|
|
|
Until we find a reliable way how to work with memory-hard function
|
|
in these situations, cryptsetup provide a way how to serialize memory-hard
|
|
unlocking among parallel cryptsetup instances to workaround this problem.
|
|
This flag is intended to be used only in very specific situations,
|
|
never use it directly :-)
|
|
|
|
* Abort conversion to LUKS1 with incompatible sector size that is
|
|
not supported in LUKS1.
|
|
|
|
* Report error (-ENOENT) if no LUKS keyslots are available. User can now
|
|
distinguish between a wrong passphrase and no keyslot available.
|
|
|
|
* Fix a possible segfault in detached header handling (double free).
|
|
|
|
* Add integritysetup support for bitmap mode introduced in Linux kernel 5.2.
|
|
Integritysetup now supports --integrity-bitmap-mode option and
|
|
--bitmap-sector-per-bit and --bitmap-flush-time commandline options.
|
|
|
|
In the bitmap operation mode, if a bit in the bitmap is 1, the corresponding
|
|
region's data and integrity tags are not synchronized - if the machine
|
|
crashes, the unsynchronized regions will be recalculated.
|
|
The bitmap mode is faster than the journal mode because we don't have
|
|
to write the data twice, but it is also less reliable, because if data
|
|
corruption happens when the machine crashes, it may not be detected.
|
|
This can be used only for standalone devices, not with dm-crypt.
|
|
|
|
* The libcryptsetup now keeps all file descriptors to underlying device
|
|
open during the whole lifetime of crypt device context to avoid excessive
|
|
scanning in udev (udev run scan on every descriptor close).
|
|
|
|
* The luksDump command now prints more info for reencryption keyslot
|
|
(when a device is in-reencryption).
|
|
|
|
* New --device-size parameter is supported for LUKS2 reencryption.
|
|
It may be used to encrypt/reencrypt only the initial part of the data
|
|
device if the user is aware that the rest of the device is empty.
|
|
|
|
Note: This change causes API break since the last rc0 release
|
|
(crypt_params_reencrypt structure contains additional field).
|
|
|
|
* New --resume-only parameter is supported for LUKS2 reencryption.
|
|
This flag resumes reencryption process if it exists (not starting
|
|
new reencryption).
|
|
|
|
* The repair command now tries LUKS2 reencryption recovery if needed.
|
|
|
|
* If reencryption device is a file image, an interactive dialog now
|
|
asks if reencryption should be run safely in offline mode
|
|
(if autodetection of active devices failed).
|
|
|
|
* Fix activation through a token where dm-crypt volume key was not
|
|
set through keyring (but using old device-mapper table parameter mode).
|
|
|
|
* Online reencryption can now retain all keyslots (if all passphrases
|
|
are provided). Note that keyslot numbers will change in this case.
|
|
|
|
* Allow volume key file to be used if no LUKS2 keyslots are present.
|
|
If all keyslots are removed, LUKS2 has no longer information about
|
|
the volume key size (there is only key digest present).
|
|
Please use --key-size option to open the device or add a new keyslot
|
|
in these cases.
|
|
|
|
* Print a warning if online reencrypt is called over LUKS1 (not supported).
|
|
|
|
* Fix TCRYPT KDF failure in FIPS mode.
|
|
Some crypto backends support plain hash in FIPS mode but not for PBKDF2.
|
|
|
|
* Remove FIPS mode restriction for crypt_volume_key_get.
|
|
It is an application responsibility to use this API in the proper context.
|
|
|
|
* Reduce keyslots area size in luksFormat when the header device is too small.
|
|
Unless user explicitly asks for keyslots areas size (either via
|
|
--luks2-keyslots-size or --offset) reduce keyslots size so that it fits
|
|
in metadata device.
|
|
|
|
* Make resize action accept --device-size parameter (supports units suffix).
|