Hi Michal,

Thank you for your super quick response - including patches, no less!

> > Several months ago, I ran into issue #135 which says that Qemu under
> > AppArmor can't access LVM volume disks.

> The problem here is, that AppArmor driver in libvirt generates the
> profile in qemuSecurityGenLabel() phase. Long story short, starting up a
> libvirt domain is broken down into several steps. One of them is
> qemuProcessPrepareDomain() where domain XML is filled with (parts of)
> live data. In this specific case, disk source is translated (from
> storage pool/vol to a filepath). But it's not just that, various other
> paths are generated (e.g. socket paths, render nodes for graphics,
> etc.).

Thanks for this context. Yes, I was unaware of that situation and
completely focussed at the volume paths. Taking the extra paths into
account complicates the matter.

> Then, the next step is qemuProcessPrepareHost() where those files from
> previous step are created, their seclabels are (possibly) set. This has
> a caveat though.

> Initially, libvirt cared about SELinux only (leave traditional uid/gid
> perms (we call them DAC) aside for a brief moment). Here. an unique
> seclabel is generated in the domain prepare phase, so that any helper
> process that's used to create files in host prepare phase can run under
> that label (and thus be restricted).

> AppArmor does not work this way. So when an aforementioned helper
> process wants to run (say /usr/bin/swtpm_setup) it already needs profile
> to be defined. As "obvious" workaround, AppArmor generates the profile
> in seclabel generation phase. But by that time path are not populated!

I saw your patches. From the patches I concluded that the security
policy is strictly applicable to Qemu (apparently). That greatly
simplifies the solution space, but with your proposed patches, I see
that the learning curve would have been too steep for me to be able to
come up with a solution this simple.

> IMO, quick and dirty fix would be to generate seclabels at the end of
> qemuProcessPrepareDomain() instead of beginning (see below). The only
> downside of this is that seclabels won't be available upfront, e.g. if
> we want to copy them into a device specific seclabel (we do NOT do that
> though).
> diff --git i/src/qemu/qemu_process.c w/src/qemu/qemu_process.c
> index a53bb40783..00b9a732f3 100644
> --- i/src/qemu/qemu_process.c
> +++ w/src/qemu/qemu_process.c
> @@ -7024,15 +7024,6 @@ qemuProcessPrepareDomain(virQEMUDriver *driver,
>          return -1;
>
>      if (!(flags & VIR_QEMU_PROCESS_START_PRETEND)) {
> -        /* If you are using a SecurityDriver with dynamic labelling,
> -           then generate a security label for isolation */
> -        VIR_DEBUG("Generating domain security label (if required)");
> -        if (qemuSecurityGenLabel(driver->securityManager, vm->def) < 0) {
> -            virDomainAuditSecurityLabel(vm, false);
> -            return -1;
> -        }
> -        virDomainAuditSecurityLabel(vm, true);
> -
>          if (qemuProcessPrepareDomainNUMAPlacement(vm) < 0)
>              return -1;
>      }
> @@ -7154,6 +7145,17 @@ qemuProcessPrepareDomain(virQEMUDriver *driver,
>          }
>      }
>
> +    /* Keep this as the very last step because AppArmor already generates
> +     * profile at this point. IOW, we need all the paths filled in. */
> +    if (!(flags & VIR_QEMU_PROCESS_START_PRETEND)) {
> +        VIR_DEBUG("Generating domain security label (if required)");
> +        if (qemuSecurityGenLabel(driver->securityManager, vm->def) < 0) {
> +            virDomainAuditSecurityLabel(vm, false);
> +            return -1;
> +        }
> +        virDomainAuditSecurityLabel(vm, true);
> +    }
> +
>      return 0;
>  }
>
>
>
> Another alternative is to move profile generation into its separate
> step. So then we'd have:
>
> qemuProcessPrepareDomain():
>   1) gen seclabel /* here only SELinux/DAC drivers would do something useful. 
> For AppArmor it'd be a NOP. */
>   2) generate all the paths
>   3) write profile /* only AppArmor would act upon, for SELinux and AppArmor 
> it'd be nop. */
>
> Let me see if that'd would fix the issue.

>From the fact that you submitted the patches, I think I understand the
change above didn't work. Is there anything I can do to help this
patch set?

--
Bye,

Erik.

http://efficito.com -- Hosted accounting and ERP.
Robust and Flexible. No vendor lock-in.

Reply via email to