]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Disallow create/resize of qcow2 encrypted images
authorJohn Ferlan <jferlan@redhat.com>
Wed, 20 Jun 2018 20:21:50 +0000 (16:21 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 26 Jun 2018 18:02:43 +0000 (14:02 -0400)
https://bugzilla.redhat.com/show_bug.cgi?id=1526382

Since commit c4eedd793 disallowed qcow2 encrypted images to be
used for domains, it no longer makes sense to allow a qcow2
encrypted volume to be created or resized.

Add a test that will exhibit the failure of creation as well
as the xml2xml validation of the format still being correct.

Update the documentation to note the removal of the capability
to create and use qcow/default encrypted volumes.

Signed-off-by: John Ferlan <jferlan@redhat.com>
ACKed-by: Michal Privoznik <mprivozn@redhat.com>
docs/formatsecret.html.in
docs/formatstorageencryption.html.in
src/storage/storage_util.c
tests/storagevolxml2argvtest.c
tests/storagevolxml2xmlin/vol-qcow2-encryption.xml [new file with mode: 0644]
tests/storagevolxml2xmlout/vol-qcow2-encryption.xml [new file with mode: 0644]
tests/storagevolxml2xmltest.c

index 155b7c35de9f359191a53791f7872eb92d2a1910..defbe7173110eea1db00df2c4593960c90e98301 100644 (file)
@@ -51,7 +51,7 @@
 
     <p>
       This secret is associated with a volume, whether the format is either
-      for a "qcow" or a "luks" encrypted volume. Each volume will have a
+      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
       <code>&lt;usage type='volume'&gt;</code> element must contain a
@@ -83,16 +83,6 @@ Secret value set
 #
     </pre>
 
-    <p>
-      The volume type secret can be supplied in domain XML for a qcow storage
-      volume <a href="formatstorageencryption.html">encryption</a> as follows:
-    </p>
-    <pre>
-&lt;encryption format='qcow'&gt;
-  &lt;secret type='passphrase' uuid='0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f'/&gt;
-&lt;/encryption&gt;
-    </pre>
-
     <p>
       The volume type secret can be supplied either in volume XML during
       creation of a <a href="formatstorage.html#StorageVol">storage volume</a>
@@ -120,6 +110,16 @@ Secret value set
 #
     </pre>
 
+    <p>
+      The volume type secret can be supplied in domain XML for a luks storage
+      volume <a href="formatstorageencryption.html">encryption</a> as follows:
+    </p>
+    <pre>
+&lt;encryption format='luks'&gt;
+  &lt;secret type='passphrase' uuid='f52a81b2-424e-490c-823d-6bd4235bc57'/&gt;
+&lt;/encryption&gt;
+    </pre>
+
     <h3><a id="CephUsageType">Usage type "ceph"</a></h3>
     <p>
       This secret is associated with a Ceph RBD (rados block device).
index 434bdb609ebeb2d7e2ca9e8d0effe76dd0d22bca..ea80a87cfbdf499fd5abfe803078170c6925a8f1 100644 (file)
       specified <code>uuid</code>.
     </p>
     <h3><a id="StorageEncryptionDefault">"default" format</a></h3>
-    <p>
-      <code>&lt;encryption format="default"/&gt;</code> can be specified only
-      when creating a qcow volume.  If the volume is successfully created, the
-      encryption formats, parameters and secrets will be auto-generated by
-      libvirt and the attached <code>encryption</code> tag will be updated.
-      The unmodified contents of the <code>encryption</code> tag can be used
-      in later operations with the volume, or when setting up a domain that
-      uses the volume.
-    </p>
     <h3><a id="StorageEncryptionQcow">"qcow" format</a></h3>
     <p>
-      The <code>qcow</code> format specifies that the built-in encryption
-      support in <code>qcow</code>- or <code>qcow2</code>-formatted volume
-      images should be used.  A single
-      <code>&lt;secret type='passphrase'&gt;</code> element is expected.  Note
-      that this encryption is inherently broken and should not be used any more.
+      <span class="since">Since 4.5.0,</span> encryption formats
+      <code>default</code> and <code>qcow</code> may no longer be used
+      to create an encrypted volume. Usage of qcow encrypted volumes
+      in QEMU began phasing out in QEMU 2.3 and by QEMU 2.9 creation
+      of a qcow encrypted volume via qemu-img required usage of secret
+      objects, but that support was not added to libvirt.
     </p>
     <h3><a id="StorageEncryptionLuks">"luks" format</a></h3>
     <p>
 
     <h2><a id="example">Examples</a></h2>
 
-    <p>
-      Here is a simple example, specifying use of the <code>qcow</code> format:
-    </p>
-
-    <pre>
-&lt;encryption format='qcow'&gt;
-   &lt;secret type='passphrase' uuid='c1f11a6d-8c5d-4a3e-ac7a-4e171c5e0d4a' /&gt;
-&lt;/encryption&gt;</pre>
-
     <p>
       Assuming a <a href="formatsecret.html#VolumeUsageType">
       <code>luks volume type secret</code></a> is already defined,
index 90cadb9d13ff308fdde2305f80a6e7804645737a..6b02bb2e9a97ebed1d77d878fb294a9c240e104b 100644 (file)
@@ -1214,6 +1214,15 @@ virStorageBackendCreateQemuImgCmdFromVol(virStoragePoolObjPtr pool,
 
     virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL);
 
+    if (enc && (enc->format == VIR_STORAGE_ENCRYPTION_FORMAT_QCOW ||
+                enc->format == VIR_STORAGE_ENCRYPTION_FORMAT_DEFAULT) &&
+        (vol->target.format == VIR_STORAGE_FILE_QCOW ||
+         vol->target.format == VIR_STORAGE_FILE_QCOW2)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("creation of qcow2 encrypted image is not supported"));
+        goto error;
+    }
+
     if (virStorageBackendCreateQemuImgSetInfo(pool, vol, inputvol, &info) < 0)
         goto error;
 
@@ -1232,8 +1241,7 @@ virStorageBackendCreateQemuImgCmdFromVol(virStoragePoolObjPtr pool,
     if (info.backingPath)
         virCommandAddArgList(cmd, "-b", info.backingPath, NULL);
 
-    if (info.format == VIR_STORAGE_FILE_RAW && enc &&
-        enc->format == VIR_STORAGE_ENCRYPTION_FORMAT_LUKS) {
+    if (enc) {
         if (!info.secretPath) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("path to secret data file is required"));
@@ -2354,6 +2362,16 @@ storageBackendResizeQemuImg(virStoragePoolObjPtr pool,
     const char *type;
     char *secretPath = NULL;
     char *secretAlias = NULL;
+    virStorageEncryptionPtr enc = vol->target.encryption;
+
+    if (enc && (enc->format == VIR_STORAGE_ENCRYPTION_FORMAT_QCOW ||
+                enc->format == VIR_STORAGE_ENCRYPTION_FORMAT_DEFAULT) &&
+        (vol->target.format == VIR_STORAGE_FILE_QCOW ||
+         vol->target.format == VIR_STORAGE_FILE_QCOW2)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("resize of qcow2 encrypted image is not supported"));
+        return -1;
+    }
 
     img_tool = virFindFileInPath("qemu-img");
     if (!img_tool) {
index b8afe4abccf4ee7db5c2bf0ba8725722a80fecea..d7f5c0f51e52ee93a65b9b1882a889c9b23cb5bb 100644 (file)
@@ -232,6 +232,10 @@ mymain(void)
             "pool-dir", "vol-file-iso",
             "iso-input", 0);
 
+    DO_TEST_FAIL("pool-dir", "vol-qcow2-encryption",
+                 NULL, NULL,
+                 "qcow2-encryption", 0);
+
     DO_TEST("pool-dir", "vol-luks",
             NULL, NULL,
             "luks", 0);
diff --git a/tests/storagevolxml2xmlin/vol-qcow2-encryption.xml b/tests/storagevolxml2xmlin/vol-qcow2-encryption.xml
new file mode 100644 (file)
index 0000000..49a7de3
--- /dev/null
@@ -0,0 +1,31 @@
+<volume>
+  <name>OtherDemo.img</name>
+  <key>/var/lib/libvirt/images/OtherDemo.img</key>
+  <source>
+  </source>
+  <capacity unit="G">5</capacity>
+  <allocation>294912</allocation>
+  <target>
+    <path>/var/lib/libvirt/images/OtherDemo.img</path>
+    <format type='qcow2'/>
+    <permissions>
+      <mode>0644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+    <encryption format='qcow'>
+      <secret type='passphrase' uuid='e78d4b51-a2af-485f-b0f5-afca709a80f4'/>
+    </encryption>
+  </target>
+  <backingStore>
+    <path>/dev/null</path>
+    <format type='raw'/>
+    <permissions>
+      <mode>0644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+  </backingStore>
+</volume>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-encryption.xml b/tests/storagevolxml2xmlout/vol-qcow2-encryption.xml
new file mode 100644 (file)
index 0000000..31dc578
--- /dev/null
@@ -0,0 +1,31 @@
+<volume type='file'>
+  <name>OtherDemo.img</name>
+  <key>/var/lib/libvirt/images/OtherDemo.img</key>
+  <source>
+  </source>
+  <capacity unit='bytes'>5368709120</capacity>
+  <allocation unit='bytes'>294912</allocation>
+  <target>
+    <path>/var/lib/libvirt/images/OtherDemo.img</path>
+    <format type='qcow2'/>
+    <permissions>
+      <mode>0644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+    <encryption format='qcow'>
+      <secret type='passphrase' uuid='e78d4b51-a2af-485f-b0f5-afca709a80f4'/>
+    </encryption>
+  </target>
+  <backingStore>
+    <path>/dev/null</path>
+    <format type='raw'/>
+    <permissions>
+      <mode>0644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+  </backingStore>
+</volume>
index 426b100c27e53a98eb0e02f7ff2b8c28736f7c70..7bac4974ae0b1a3baf41058e7c50505e7e83f160 100644 (file)
@@ -106,6 +106,7 @@ mymain(void)
     DO_TEST("pool-dir", "vol-qcow2-lazy");
     DO_TEST("pool-dir", "vol-qcow2-0.10-lazy");
     DO_TEST("pool-dir", "vol-qcow2-nobacking");
+    DO_TEST("pool-dir", "vol-qcow2-encryption");
     DO_TEST("pool-dir", "vol-luks");
     DO_TEST("pool-dir", "vol-luks-cipher");
     DO_TEST("pool-disk", "vol-partition");