2022-03-07 18:16:58 +03:00
.. role :: since
=================
Secret XML format
=================
.. contents ::
Secret XML
----------
Secrets stored by libvirt may have attributes associated with them, using the
`` secret `` element. The `` secret `` element has two optional attributes, each
with values '`` yes `` ' and '`` no `` ', and defaulting to '`` no `` ':
`` ephemeral ``
This secret must only be kept in memory, never stored persistently.
`` private ``
The value of the secret must not be revealed to any caller of libvirt, nor to
any other node.
The top-level `` secret `` element may contain the following elements:
`` uuid ``
An unique identifier for this secret (not necessarily in the UUID format). If
omitted when defining a new secret, a random UUID is generated.
`` description ``
A human-readable description of the purpose of the secret.
`` usage ``
Specifies what this secret is used for. A mandatory `` type `` attribute
specifies the usage category, currently only `` volume `` , `` ceph `` , `` iscsi `` ,
`` tls `` , and `` vtpm `` are defined. Specific usage categories are described
below.
Usage type "volume"
~~~~~~~~~~~~~~~~~~~
This secret is associated with a volume, whether the format is either for a
"luks" encrypted volume. Each volume will have a unique secret associated with
it and it is safe to delete the secret after the volume is deleted. The
`` <usage type='volume'> `` element must contain a single `` volume `` element that
specifies the path of the volume this secret is associated with. For example,
create a volume-secret.xml file as follows:
::
<secret ephemeral='no' private='yes'>
<description>Super secret name of my first puppy</description>
<uuid>0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f</uuid>
<usage type='volume'>
<volume>/var/lib/libvirt/images/puppyname.img</volume>
</usage>
</secret>
Define the secret and set the passphrase as follows:
::
# virsh secret-define volume-secret.xml
Secret 0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f created
2022-04-13 16:27:49 +03:00
See `Setting secret values in virsh`_ on how to set the value of the secret
using `` virsh secret-set-value `` .
2022-03-07 18:16:58 +03:00
The volume type secret can be supplied either in volume XML during creation of a
2022-04-14 14:48:43 +03:00
`storage volume <formatstorage.html#storage-volume-xml> `__ in order to provide
the passphrase to encrypt the volume or in domain XML
2022-05-13 11:31:33 +03:00
`disk device <formatdomain.html#hard-drives-floppy-disks-cdroms> `__ in order to provide the
2022-04-14 14:48:43 +03:00
passphrase to decrypt the volume, :since: `since 2.1.0` . An example follows:
2022-03-07 18:16:58 +03:00
::
# cat luks-secret.xml
<secret ephemeral='no' private='yes'>
<description>LUKS Sample Secret</description>
<uuid>f52a81b2-424e-490c-823d-6bd4235bc57</uuid>
<usage type='volume'>
<volume>/var/lib/libvirt/images/luks-sample.img</volume>
</usage>
</secret>
# virsh secret-define luks-secret.xml
Secret f52a81b2-424e-490c-823d-6bd4235bc57 created
2022-04-13 16:27:49 +03:00
See `Setting secret values in virsh`_ on how to set the value of the secret
using `` virsh secret-set-value `` .
2022-03-07 18:16:58 +03:00
The volume type secret can be supplied in domain XML for a luks storage volume
`encryption <formatstorageencryption.html> `__ as follows:
::
<encryption format='luks'>
<secret type='passphrase' uuid='f52a81b2-424e-490c-823d-6bd4235bc57'/>
</encryption>
Usage type "ceph"
~~~~~~~~~~~~~~~~~
This secret is associated with a Ceph RBD (rados block device). The
`` <usage type='ceph'> `` element must contain a single `` name `` element that
specifies a usage name for the secret. The Ceph secret can then be used by UUID
or by this usage name via the `` <auth> `` element of a `disk
2022-05-13 11:31:33 +03:00
device <formatdomain.html#hard-drives-floppy-disks-cdroms>`__ or a ` storage pool
2022-03-07 18:16:58 +03:00
(rbd) <formatstorage.html>`__. :since:` Since 0.9.7` . The following is an
example of the steps to be taken. First create a ceph-secret.xml file:
::
<secret ephemeral='no' private='yes'>
<description>CEPH passphrase example</description>
<usage type='ceph'>
<name>ceph_example</name>
</usage>
</secret>
Next, use `` virsh secret-define ceph-secret.xml `` to define the secret and
`` virsh secret-set-value `` using the generated UUID value and a base64 generated
secret value in order to define the chosen secret pass phrase.
::
# virsh secret-define ceph-secret.xml
Secret 1b40a534-8301-45d5-b1aa-11894ebb1735 created
#
# virsh secret-list
UUID Usage
-----------------------------------------------------------
1b40a534-8301-45d5-b1aa-11894ebb1735 cephx ceph_example
2022-04-13 16:27:49 +03:00
See `Setting secret values in virsh`_ on how to set the value of the secret
using `` virsh secret-set-value `` .
2022-03-07 18:16:58 +03:00
The ceph secret can then be used by UUID or by the usage name via the `` <auth> ``
2022-05-13 11:31:33 +03:00
element in a domain's `<disk> <formatdomain.html#hard-drives-floppy-disks-cdroms> `__ element as
2022-03-07 18:16:58 +03:00
follows:
::
<auth username='myname'>
<secret type='ceph' usage='ceph_example'/>
</auth>
As well as the `` <auth> `` element in a `storage pool
(rbd) <formatstorage.html>`__ ` `<source>` ` element as follows:
::
<auth type='ceph' username='myname'>
<secret usage='ceph_example'/>
</auth>
Usage type "iscsi"
~~~~~~~~~~~~~~~~~~
This secret is associated with an iSCSI target for CHAP authentication. The
`` <usage type='iscsi'> `` element must contain a single `` target `` element that
specifies a usage name for the secret. The iSCSI secret can then be used by UUID
or by this usage name via the `` <auth> `` element of a `disk
2022-05-13 11:31:33 +03:00
device <formatdomain.html#hard-drives-floppy-disks-cdroms>`__ or a ` storage pool
2022-03-07 18:16:58 +03:00
(iscsi) <formatstorage.html>`__. :since:` Since 1.0.4` . The following is an
example of the XML that may be used to generate a secret for iSCSI CHAP
authentication. Assume the following sample entry in an iSCSI authentication
file:
::
<target iqn.2013-07.com.example:iscsi-pool>
backing-store /home/tgtd/iscsi-pool/disk1
backing-store /home/tgtd/iscsi-pool/disk2
incominguser myname mysecret
</target>
Define an iscsi-secret.xml file to describe the secret. Use the `` incominguser ``
username used in your iSCSI authentication configuration file as the value for
the `` username `` attribute. The `` description `` attribute should contain
configuration specific data. The `` target `` name may be any name of your
choosing to be used as the `` usage `` when used in the pool or disk XML
description.
::
<secret ephemeral='no' private='yes'>
<description>Passphrase for the iSCSI example.com server</description>
<usage type='iscsi'>
<target>libvirtiscsi</target>
</usage>
</secret>
Next, use `` virsh secret-define iscsi-secret.xml `` to define the secret and
`` virsh secret-set-value `` using the generated UUID value and a base64 generated
secret value in order to define the chosen secret pass phrase. The pass phrase
must match the password used in the iSCSI authentication configuration file.
::
# virsh secret-define secret.xml
Secret c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 created
# virsh secret-list
UUID Usage
-----------------------------------------------------------
c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 iscsi libvirtiscsi
2022-04-13 16:27:49 +03:00
See `Setting secret values in virsh`_ on how to set the value of the secret
using `` virsh secret-set-value `` .
2022-03-07 18:16:58 +03:00
The iSCSI secret can then be used by UUID or by the usage name via the
2022-05-13 11:31:33 +03:00
`` <auth> `` element in a domain's `<disk> <formatdomain.html#hard-drives-floppy-disks-cdroms> `__
2022-03-07 18:16:58 +03:00
element as follows:
::
<auth username='myname'>
<secret type='iscsi' usage='libvirtiscsi'/>
</auth>
As well as the `` <auth> `` element in a `storage pool
(iscsi) <formatstorage.html>`__ ` `<source>` ` element as follows:
::
<auth type='chap' username='myname'>
<secret usage='libvirtiscsi'/>
</auth>
Usage type "tls"
~~~~~~~~~~~~~~~~
This secret may be used in order to provide the passphrase for the private key
used to provide TLS credentials. The `` <usage type='tls'> `` element must contain
a single `` name `` element that specifies a usage name for the secret.
:since: `Since 2.3.0` . The following is an example of the expected XML and
processing to define the secret:
::
# cat tls-secret.xml
<secret ephemeral='no' private='yes'>
<description>sample tls secret</description>
<usage type='tls'>
<name>TLS_example</name>
</usage>
</secret>
# virsh secret-define tls-secret.xml
Secret 718c71bd-67b5-4a2b-87ec-a24e8ca200dc created
# virsh secret-list
UUID Usage
-----------------------------------------------------------
718c71bd-67b5-4a2b-87ec-a24e8ca200dc tls TLS_example
A secret may also be defined via the
`virSecretDefineXML <html/libvirt-libvirt-secret.html#virSecretDefineXML> `__
API. Once the secret is defined, a secret value will need to be set. The secret
would be the passphrase used to access the TLS credentials. The following is a
simple example of using `` virsh secret-set-value `` to set the secret value. The
`virSecretSetValue <html/libvirt-libvirt-secret.html#virSecretSetValue> `__ API
may also be used to set a more secure secret without using printable/readable
characters.
Usage type "vtpm"
~~~~~~~~~~~~~~~~~
This secret is associated with a virtualized TPM (vTPM) and serves as a
passphrase for deriving a key from for encrypting the state of the vTPM. The
`` <usage type='vtpm'> `` element must contain a single `` name `` element that
specifies a usage name for the secret. The vTPM secret can then be used by UUID
2022-05-13 11:31:37 +03:00
via the `` <encryption> `` element of a `tpm <formatdomain.html#tpm-device> `__
2022-03-07 18:16:58 +03:00
when using an emulator. :since: `Since 5.6.0` . The following is an example of
the steps to be taken. First create a vtpm-secret.xml file:
::
# cat vtpm-secret.xml
<secret ephemeral='no' private='yes'>
<description>sample vTPM secret</description>
<usage type='vtpm'>
<name>VTPM_example</name>
</usage>
</secret>
# virsh secret-define vtpm-secret.xml
Secret 6dd3e4a5-1d76-44ce-961f-f119f5aad935 created
# virsh secret-list
UUID Usage
----------------------------------------------------------------------------------------
6dd3e4a5-1d76-44ce-961f-f119f5aad935 vtpm VTPM_example
A secret may also be defined via the
`virSecretDefineXML <html/libvirt-libvirt-secret.html#virSecretDefineXML> `__
API. Once the secret is defined, a secret value will need to be set. The secret
would be the passphrase used to decrypt the vTPM state. The following is a
simple example of using `` virsh secret-set-value `` to set the secret value. The
`virSecretSetValue <html/libvirt-libvirt-secret.html#virSecretSetValue> `__ API
may also be used to set a more secure secret without using printable/readable
characters.
Setting secret values in virsh
------------------------------
To set the value of the secret you can use the following virsh commands. If the
secret is a password-like string (printable characters, no newline) you can use:
::
# virsh secret-set-value --interactive 6dd3e4a5-1d76-44ce-961f-f119f5aad935
Enter new value for secret:
Secret value set
Another secure option is to read the secret from a file. This way the secret can
contain any bytes (even NUL and non-printable characters). The length of the
secret is the length of the input file. Alternatively the `` --plain `` option can
be omitted if the file contents are base64-encoded.
::
# virsh secret-set-value 6dd3e4a5-1d76-44ce-961f-f119f5aad935 --file --plain secretinfile
Secret value set
**WARNING** The following approach is **insecure** and deprecated. The secret
can also be set via an argument. Note that other users may see the actual secret
in the process listing! The secret must be base64 encoded.
::
# MYSECRET=`printf %s "open sesame" | base64`
# virsh secret-set-value 6dd3e4a5-1d76-44ce-961f-f119f5aad935 $MYSECRET
Secret value set