On 04.11.2016 17:32, Martin Pitt wrote:
> Hello Michal,
> 
> Michal Privoznik [2016-11-04  8:47 +0100]:
>> That means that whenever a VM is being started up, libvirtd (our
>> daemon we have) relabels all the necessary paths that QEMU process
>> (representing VM) can touch.
> 
> Does that mean it's shipping an udev rule that does that? Or actually
> listens to uevents by itself (possibly via libudev) and applies the
> labels?

No. At the domain startup phase we know all the devices (paths) domain
is configured to have. So we iterate over them and
chown()/setfilecon_raw() over them.
BTW: domains is how we refer to VMs in libvirt terminology.

> 
>> However, I'm facing an issue that I don't know how to fix. In some cases
>> QEMU can close & reopen a block device. However, closing a block device
>> triggers an event and hence if there is a rule that sets a security
>> label on a device the QEMU process is unable to reopen the device again.
> 
> Is that triggering the above libvirtd action (in the daemon via
> libudev or via an udev rule), or is that something else?

No, it's triggering other rules that user may already have. For instance:

# cat /etc/udev/rules.d/51-qemu.rules
KERNEL=="sd*", GROUP="qemu"

> 
>> My question is, whet we can do to prevent udev from mangling with our
>> security labels that we've set on the devices?
> 
> Sorry for my ignorance, but my question in return is: What's the udev
> rule that mangles with it in the first place? I don't see any such
> rule in upstream systemd or in Debian/Ubuntu, but it's of course
> possible that Fedora ships such a rule via another package.

Frankly, I have no idea where does the rule come from either. But no
matter what I guess we should have a way to skip devices assigned to a
domain when it comes to rules execution.

> 
>> One of the ideas our lead developer had was for libvirt to set some kind
>> of udev label on devices managed by libvirt (when setting up security
>> labels) and then whenever udev sees such labelled device it won't touch
>> it at all (this could be achieved by a rule perhaps?). Later, when
>> domain is shutting down libvirt removes that label. But I don't think
>> setting an arbitrary label on devices is supported, is it?
> 
> It actually is -- they are called "tags" (TAG+=) and "properties"
> (ENV{PROPNAME}="foo"), see udev(7). So indeed the most straightforward
> way would be to tag or set a property on those devices which you want
> to handle in libvirtd yourself, and then add something like
> 
>    TAG=="libvirtd", GOTO="skip_selinux_context"
>    [... original rule that changes context goes here ..]
>    LABEL="skip_selinux_context"

I fear that this will not work because other rule may have already
changed the label. BTW: I don't see an API to add tag to a device. I
only see API to check if device has given tag. Libvirt's written in C so
something like udev_device_add_tag() is needed if we were to go with
tags (which again I think it's not helpful enough).

Michal
_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to