[libvirt PATCH v6 34/36] qemu: implement ssh-agent auth for ssh disks with nbdkit

Peter Krempa pkrempa at redhat.com
Mon Aug 21 12:47:46 UTC 2023


On Thu, Jul 20, 2023 at 17:20:01 -0500, Jonathon Jongsma wrote:
> It's not possible to use password-protected ssh keys directly with
> libvirt because libvirt doesn't have any way to prompt a user for the
> password. To accomodate password-protected key files, an administrator
> can add these keys to an ssh agent and then configure the domain with
> the path to the ssh-agent socket.
> 
> Note that this requires an administrator or management app to
> configure the ssh-agent with an appropriate socket path and add the
> necessary keys to it. In addition, it does not currently work with
> selinux enabled. The ssh-agent socket would need a label that libvirt
> would be allowed to access rather than unconfined_t.
> 
> Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> ---
>  src/conf/domain_conf.c                          | 11 ++++++++---
>  src/conf/storage_source_conf.c                  |  1 +
>  src/conf/storage_source_conf.h                  |  1 +
>  src/qemu/qemu_nbdkit.c                          | 10 ++++++++++
>  .../disk-network-ssh-key.args.disk0             |  6 +++---
>  .../disk-network-ssh-key.args.disk1             |  9 +++++++++
>  tests/qemuxml2argvdata/disk-network-ssh-key.xml | 17 ++++++++++++++---
>  7 files changed, 46 insertions(+), 9 deletions(-)
>  create mode 100644 tests/qemunbdkitdata/disk-network-ssh-key.args.disk1
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 08cf1be656..a70d7bf613 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -7257,8 +7257,11 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node,
>              if (!(src->ssh_user = virXMLPropStringRequired(tmpnode, "username")))
>                  return -1;
>  
> -            if (!(src->ssh_keyfile = virXMLPropStringRequired(tmpnode, "keyfile")))
> -                return -1;
> +            /* optional path to an ssh key file */
> +            src->ssh_keyfile = virXMLPropString(tmpnode, "keyfile");
> +
> +            /* optional ssh-agent socket location */
> +            src->ssh_agent = virXMLPropString(tmpnode, "agentsock");

By doing this you'll lose validation that either of the two coices from
the schema is present. Thus the user can just provide a username ...

>          }
>      }
>  
> @@ -22175,13 +22178,15 @@ virDomainDiskSourceFormatNetwork(virBuffer *attrBuf,
>      if (src->protocol == VIR_STORAGE_NET_PROTOCOL_SSH) {
>          if (src->ssh_known_hosts_file)
>              virBufferEscapeString(childBuf, "<knownHosts path='%s'/>\n", src->ssh_known_hosts_file);
> -        if (src->ssh_keyfile) {
> +        if (src->ssh_keyfile || src->ssh_agent) {
>              virBufferAddLit(childBuf, "<identity");

... which will vanish from the XML.

>              if (src->ssh_user)
>                  virBufferEscapeString(childBuf, " username='%s'", src->ssh_user);
>              if (src->ssh_keyfile)
>                  virBufferEscapeString(childBuf, " keyfile='%s'", src->ssh_keyfile);
> +            if (src->ssh_agent)
> +                virBufferEscapeString(childBuf, " agentsock='%s'", src->ssh_agent);

virBufferEscapeString is NULL tolerant

>  
>              virBufferAddLit(childBuf, "/>\n");
>          }


[..]

> diff --git a/src/conf/storage_source_conf.h b/src/conf/storage_source_conf.h
> index 8c805664af..061faa66cb 100644
> --- a/src/conf/storage_source_conf.h
> +++ b/src/conf/storage_source_conf.h
> @@ -411,6 +411,7 @@ struct _virStorageSource {
>      bool ssh_host_key_check_disabled;
>      char *ssh_known_hosts_file;
>      char *ssh_keyfile;
> +    char *ssh_agent;

Missing impl in virStorageSourceCopy.

>  
>      /* nfs_user and nfs_group store the strings passed in by the user for NFS params.
>       * nfs_uid and nfs_gid represent the converted/looked up ID numbers which are used

Reviewed-by: Peter Krempa <pkrempa at redhat.com>


More information about the libvir-list mailing list