On Tue, Jan 30, 2024 at 01:37:19PM +0800, yong.hu...@smartx.com wrote: > From: Hyman Huang <yong.hu...@smartx.com> > > By enhancing the LUKS driver, it is possible to implement > the LUKS volume with a detached header. > > Normally a LUKS volume has a layout: > disk: | header | key material | disk payload data | > > With a detached LUKS header, you need 2 disks so getting: > disk1: | header | key material | > disk2: | disk payload data | > > There are a variety of benefits to doing this: > * Secrecy - the disk2 cannot be identified as containing LUKS > volume since there's no header > * Control - if access to the disk1 is restricted, then even > if someone has access to disk2 they can't unlock > it. Might be useful if you have disks on NFS but > want to restrict which host can launch a VM > instance from it, by dynamically providing access > to the header to a designated host > * Flexibility - your application data volume may be a given > size and it is inconvenient to resize it to > add encryption.You can store the LUKS header > separately and use the existing storage > volume for payload > * Recovery - corruption of a bit in the header may make the > entire payload inaccessible. It might be > convenient to take backups of the header. If > your primary disk header becomes corrupt, you > can unlock the data still by pointing to the > backup detached header > > Take the raw-format image as an example to introduce the usage > of the LUKS volume with a detached header: > > 1. prepare detached LUKS header images > $ dd if=/dev/zero of=test-header.img bs=1M count=32 > $ dd if=/dev/zero of=test-payload.img bs=1M count=1000 > $ cryptsetup luksFormat --header test-header.img test-payload.img > > --force-password --type luks1 > > 2. block-add a protocol blockdev node of payload image > $ virsh qemu-monitor-command vm '{"execute":"blockdev-add", > > "arguments":{"node-name":"libvirt-1-storage", "driver":"file", > > "filename":"test-payload.img"}}' > > 3. block-add a protocol blockdev node of LUKS header as above. > $ virsh qemu-monitor-command vm '{"execute":"blockdev-add", > > "arguments":{"node-name":"libvirt-2-storage", "driver":"file", > > "filename": "test-header.img" }}' > > 4. object-add the secret for decrypting the cipher stored in > LUKS header above > $ virsh qemu-monitor-command vm '{"execute":"object-add", > > "arguments":{"qom-type":"secret", "id": > > "libvirt-2-storage-secret0", "data":"abc123"}}' > > 5. block-add the raw-drived blockdev format node > $ virsh qemu-monitor-command vm '{"execute":"blockdev-add", > > "arguments":{"node-name":"libvirt-1-format", "driver":"raw", > > "file":"libvirt-1-storage"}}' > > 6. block-add the luks-drived blockdev to link the raw disk > with the LUKS header by specifying the field "header" > $ virsh qemu-monitor-command vm '{"execute":"blockdev-add", > > "arguments":{"node-name":"libvirt-2-format", "driver":"luks", > > "file":"libvirt-1-format", "header":"libvirt-2-storage", > > "key-secret":"libvirt-2-format-secret0"}}' > > 7. hot-plug the virtio-blk device finally > $ virsh qemu-monitor-command vm '{"execute":"device_add", > > "arguments": {"num-queues":"1", "driver":"virtio-blk-pci", > > "drive": "libvirt-2-format", "id":"virtio-disk2"}}' > > Starting a VM with a LUKS volume with detached header is > somewhat similar to hot-plug in that both maintaining the > same json command while the starting VM changes the > "blockdev-add/device_add" parameters to "blockdev/device". > > Signed-off-by: Hyman Huang <yong.hu...@smartx.com> > --- > block/crypto.c | 21 +++++++++++++++++++-- > crypto/block-luks.c | 11 +++++++---- > include/crypto/block.h | 5 +++++ > qapi/block-core.json | 5 ++++- > 4 files changed, 35 insertions(+), 7 deletions(-)
Reviewed-by: Daniel P. Berrangé <berra...@redhat.com> With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|