ba46e5bb43
Unlocking entity is now the client, not the server anymore. Change filenames and syntax in initramfs scripts to reflect both. |
||
---|---|---|
codegen | ||
initramfs | ||
parsers | ||
testdata | ||
.gitignore | ||
argparse_client.c | ||
argparse_client.h | ||
argparse_edit.c | ||
argparse_edit.h | ||
argparse_server.c | ||
argparse_server.h | ||
blacklist.c | ||
blacklist.h | ||
ChangeLog | ||
client.c | ||
client.h | ||
editor.c | ||
editor.h | ||
exec.c | ||
exec.h | ||
file_encryption.c | ||
file_encryption.h | ||
gen_config | ||
global.h | ||
keydb.c | ||
keydb.h | ||
LICENSE | ||
LICENSE-header | ||
licensify | ||
log.c | ||
log.h | ||
luks.c | ||
luks.h | ||
luksrku-config.c | ||
luksrku.c | ||
Makefile | ||
msg.h | ||
openssl.c | ||
openssl.h | ||
parse-keyfile.c | ||
parse-keyfile.h | ||
pgmopts.c | ||
pgmopts.h | ||
README.md | ||
server.c | ||
server.h | ||
signals.c | ||
signals.h | ||
thread.c | ||
thread.h | ||
udp.c | ||
udp.h | ||
util.c | ||
util.h | ||
uuid.c | ||
uuid.h | ||
vault.c | ||
vault.h |
luksrku
luksrku is a tool that allows you to remotely unlock LUKS disks during bootup from within your initrd. The intention is to have full-disk-encryption with LUKS-rootfs running headlessly. You should be able to remotely unlock their LUKS cryptographic file systems when you know they have been (legitimately) rebooted.
This works as follows: The luksrku client (which needs unlocking) and luksrku server (which holds all the LUKS keys) share a secret. The client either knows the address of the server or it can issue a broadcast in the network to find the correct one. With the help of the shared secret, a TLS connection is established betweem the client and a legitimate server (who also knows the same secret). The server then tells the client all the LUKS passphrases, which performs luksOpen on all volumes.
Security
luksrku uses TLSv1.3-PSK with forward-secrecy key shares (i.e., ECDHE). The curves that are used are X448 and X25519 for key agreement and TLS_CHACHA20_POLY1305_SHA256 or TLS_AES_256_GCM_SHA384 as cipher suites. PSKs are 256 bit long and randomly generated (/dev/urandom). Likewise, the LUKS passphrases are based on 256 bit long secrets and are converted to Base64 for easier handling (when setting up everything initially).
The binary protocol that runs between both is intentionally extremely simple to allow for easy code review. It exclusively uses fixed message lengths.
The key database is encrypted itself, using AES256-GCM, a 128 bit randomized initialization vector and authenticated with a 128 bit authentication tag. Key derivation is done using scrypt with N = 131072 = 2^18, r = 8, p = 1.
Dependencies
OpenSSL v1.1 is required for luksrku.
Example
TODO