On Thu, Jul 20, 2023 at 17:19:55 -0500, Jonathon Jongsma wrote:
For ssh disks that are served by nbdkit, lookup the password from
the
configured secret and securely pass it to the nbdkit process using fd
passing.
Signed-off-by: Jonathon Jongsma <jjongsma(a)redhat.com>
---
src/qemu/qemu_nbdkit.c | 87 ++++++++++---------
.../disk-network-ssh-password.args.disk0 | 8 ++
...k-network-ssh-password.args.disk0.pipe.778 | 1 +
.../disk-network-ssh.args.disk1 | 8 ++
.../disk-network-ssh.args.disk1.pipe.778 | 1 +
tests/qemunbdkittest.c | 1 +
...sk-network-ssh-password.x86_64-latest.args | 35 ++++++++
.../disk-network-ssh-password.xml | 34 ++++++++
tests/qemuxml2argvtest.c | 1 +
9 files changed, 137 insertions(+), 39 deletions(-)
create mode 100644 tests/qemunbdkitdata/disk-network-ssh-password.args.disk0
create mode 100644 tests/qemunbdkitdata/disk-network-ssh-password.args.disk0.pipe.778
create mode 100644 tests/qemunbdkitdata/disk-network-ssh.args.disk1
create mode 100644 tests/qemunbdkitdata/disk-network-ssh.args.disk1.pipe.778
create mode 100644 tests/qemuxml2argvdata/disk-network-ssh-password.x86_64-latest.args
create mode 100644 tests/qemuxml2argvdata/disk-network-ssh-password.xml
diff --git a/src/qemu/qemu_nbdkit.c b/src/qemu/qemu_nbdkit.c
index 8bb91de994..9dbe3af1dd 100644
--- a/src/qemu/qemu_nbdkit.c
+++ b/src/qemu/qemu_nbdkit.c
@@ -936,6 +936,46 @@ qemuNbdkitCommandPassDataByPipe(virCommand *cmd,
}
+static int
+qemuNbdkitProcessBuildCommandAuth(virStorageAuthDef *authdef,
+ virCommand *cmd)
+{
+ g_autoptr(virConnect) conn = NULL;
+ g_autofree uint8_t *secret = NULL;
+ size_t secretlen = 0;
+ int secrettype;
+
+ if (!authdef)
+ return 0;
+
+ if ((secrettype = virSecretUsageTypeFromString(authdef->secrettype)) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("invalid secret type %1$s"),
+ authdef->secrettype);
+ return -1;
+ }
+
+ conn = virGetConnectSecret();
+ if (virSecretGetSecretString(conn,
+ &authdef->seclookupdef,
+ secrettype,
+ &secret,
+ &secretlen) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("failed to get auth secret for storage"));
This overwrites the error from virSecretGetSecretString with a much
worse error, e.g. not showing which secred we are looking for and in
addition to that with an VIR_ERR_INTERNAL_ERROR.
+ return -1;
+ }
+
+ virCommandAddArgPair(cmd, "user", authdef->username);
+
+ if (qemuNbdkitCommandPassDataByPipe(cmd, "password",
+ &secret, secretlen) < 0)
+ return -1;
+
+ return 0;
+}
+
Reviewed-by: Peter Krempa <pkrempa(a)redhat.com>