zfs: enable keylocation=http://

When ZFS is built with cURL, it allows retrieving encryption keys from
URLs automatically.
This commit is contained in:
Albert Peschar 2023-04-18 17:44:25 +03:00
parent 75c131fc1b
commit 0f05321d78
2 changed files with 28 additions and 2 deletions

View File

@ -80,6 +80,11 @@ let
fsType = "zfs"; fsType = "zfs";
options = [ "noauto" ]; options = [ "noauto" ];
}; };
virtualisation.fileSystems."/manual/httpkey" = {
device = "manual/httpkey";
fsType = "zfs";
options = [ "noauto" ];
};
}; };
specialisation.forcepool.configuration = { specialisation.forcepool.configuration = {
@ -92,6 +97,19 @@ let
options = [ "noauto" ]; options = [ "noauto" ];
}; };
}; };
services.nginx = {
enable = true;
virtualHosts = {
localhost = {
locations = {
"/zfskey" = {
return = ''200 "httpkeyabc"'';
};
};
};
};
};
}; };
testScript = '' testScript = ''
@ -130,6 +148,8 @@ let
"zpool create -O mountpoint=legacy manual /dev/vdd1", "zpool create -O mountpoint=legacy manual /dev/vdd1",
"echo otherpass | zfs create " "echo otherpass | zfs create "
+ "-o encryption=aes-256-gcm -o keyformat=passphrase manual/encrypted", + "-o encryption=aes-256-gcm -o keyformat=passphrase manual/encrypted",
"zfs create -o encryption=aes-256-gcm -o keyformat=passphrase "
+ "-o keylocation=http://localhost/zfskey manual/httpkey",
"bootctl set-default nixos-generation-1-specialisation-encryption.conf", "bootctl set-default nixos-generation-1-specialisation-encryption.conf",
"sync", "sync",
"zpool export automatic", "zpool export automatic",
@ -141,10 +161,12 @@ let
machine.send_console("password\n") machine.send_console("password\n")
machine.wait_for_unit("multi-user.target") machine.wait_for_unit("multi-user.target")
machine.succeed( machine.succeed(
"zfs get keystatus manual/encrypted | grep unavailable", "zfs get -Ho value keystatus manual/encrypted | grep -Fx unavailable",
"echo otherpass | zfs load-key manual/encrypted", "echo otherpass | zfs load-key manual/encrypted",
"systemctl start manual-encrypted.mount", "systemctl start manual-encrypted.mount",
"umount /automatic /manual/encrypted /manual", "zfs load-key manual/httpkey",
"systemctl start manual-httpkey.mount",
"umount /automatic /manual/encrypted /manual/httpkey /manual",
"zpool destroy automatic", "zpool destroy automatic",
"zpool destroy manual", "zpool destroy manual",
) )

View File

@ -10,6 +10,7 @@
, gawk, gnugrep, gnused, systemd , gawk, gnugrep, gnused, systemd
, smartmontools, enableMail ? false , smartmontools, enableMail ? false
, sysstat, pkg-config , sysstat, pkg-config
, curl
# Kernel dependencies # Kernel dependencies
, kernel ? null , kernel ? null
@ -76,6 +77,8 @@ let
nfs-utils.override (old: { enablePython = old.enablePython or true && enablePython; }) nfs-utils.override (old: { enablePython = old.enablePython or true && enablePython; })
}/bin/exportfs" }/bin/exportfs"
substituteInPlace ./lib/libshare/smb.h --replace "/usr/bin/net" "${samba}/bin/net" substituteInPlace ./lib/libshare/smb.h --replace "/usr/bin/net" "${samba}/bin/net"
# Disable dynamic loading of libcurl
substituteInPlace ./config/user-libfetch.m4 --replace "curl-config --built-shared" "true"
substituteInPlace ./config/user-systemd.m4 --replace "/usr/lib/modules-load.d" "$out/etc/modules-load.d" substituteInPlace ./config/user-systemd.m4 --replace "/usr/lib/modules-load.d" "$out/etc/modules-load.d"
substituteInPlace ./config/zfs-build.m4 --replace "\$sysconfdir/init.d" "$out/etc/init.d" \ substituteInPlace ./config/zfs-build.m4 --replace "\$sysconfdir/init.d" "$out/etc/init.d" \
--replace "/etc/default" "$out/etc/default" --replace "/etc/default" "$out/etc/default"
@ -111,6 +114,7 @@ let
++ optional buildUser pkg-config; ++ optional buildUser pkg-config;
buildInputs = optionals buildUser [ zlib libuuid attr libtirpc ] buildInputs = optionals buildUser [ zlib libuuid attr libtirpc ]
++ optional buildUser openssl ++ optional buildUser openssl
++ optional buildUser curl
++ optional (buildUser && enablePython) python3; ++ optional (buildUser && enablePython) python3;
# for zdb to get the rpath to libgcc_s, needed for pthread_cancel to work # for zdb to get the rpath to libgcc_s, needed for pthread_cancel to work