[libvirt] [PATCH] qemu: Copy SELinux labels for namespace too

Martin Kletzander mkletzan at redhat.com
Mon Jan 16 13:48:19 UTC 2017


On Fri, Jan 13, 2017 at 03:47:16PM +0100, Michal Privoznik wrote:
>On 01/13/2017 12:43 PM, Martin Kletzander wrote:
>> On Fri, Jan 13, 2017 at 11:12:43AM +0100, Michal Privoznik wrote:
>>> When creating new /dev/* for qemu, we do chown() and copy ACLs to
>>> create the exact copy from the original /dev. I though that
>>> copying SELinux labels is not necessary as SELinux will chose the
>>> sane defaults. Surprisingly, it does not leaving namespace with
>>> the following labels:
>>>
>>> crw-rw-rw-. root root system_u:object_r:tmpfs_t:s0     random
>>> crw-------. root root system_u:object_r:tmpfs_t:s0     rtc0
>>> drwxrwxrwt. root root system_u:object_r:tmpfs_t:s0     shm
>>> crw-rw-rw-. root root system_u:object_r:tmpfs_t:s0     urandom
>>>
>>> As a result, domain is unable to start:
>>>
>>> error: internal error: process exited while connecting to monitor:
>>> Error in GnuTLS initialization: Failed to acquire random data.
>>> qemu-kvm: cannot initialize crypto: Unable to initialize GNUTLS
>>> library: Failed to acquire random data.
>>>
>>> The solution is to copy the SELinux labels as well.
>>>
>>> Reported-by: Andrea Bolognani <abologna at redhat.com>
>>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>>> ---
>>> src/qemu/qemu_domain.c | 61
>>> ++++++++++++++++++++++++++++++++++++++++++++++++++
>>> 1 file changed, 61 insertions(+)
>>>
>>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>>> index 1399dee0d..a29866673 100644
>>> --- a/src/qemu/qemu_domain.c
>>> +++ b/src/qemu/qemu_domain.c
>>> @@ -63,6 +63,9 @@
>>> #if defined(HAVE_SYS_MOUNT_H)
>>> # include <sys/mount.h>
>>> #endif
>>> +#ifdef WITH_SELINUX
>>> +# include <selinux/selinux.h>
>>> +#endif
>>>
>>> #include <libxml/xpathInternals.h>
>>>
>>> @@ -6958,6 +6961,9 @@ qemuDomainCreateDevice(const char *device,
>>>     char *canonDevicePath = NULL;
>>>     struct stat sb;
>>>     int ret = -1;
>>> +#ifdef WITH_SELINUX
>>> +    char *tcon = NULL;
>>> +#endif
>>>
>>>     if (virFileResolveAllLinks(device, &canonDevicePath) < 0) {
>>>         if (errno == ENOENT && allow_noent) {
>>> @@ -7023,10 +7029,34 @@ qemuDomainCreateDevice(const char *device,
>>>         goto cleanup;
>>>     }
>>>
>>> +#ifdef WITH_SELINUX
>>> +    if (getfilecon_raw(canonDevicePath, &tcon) < 0 &&
>>> +        (errno != ENOTSUP && errno != ENODATA)) {
>>> +        virReportSystemError(errno,
>>> +                             _("Unable to get SELinux label on %s"),
>>> canonDevicePath);
>>> +        goto cleanup;
>>> +    }
>>> +
>>> +    if (tcon &&
>>> +        setfilecon_raw(devicePath, (VIR_SELINUX_CTX_CONST char *)
>>> tcon) < 0) {
>>> +        VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
>>> +        if (errno != EOPNOTSUPP && errno != ENOTSUP) {
>>> +        VIR_WARNINGS_RESET
>>> +            virReportSystemError(errno,
>>> +                                 _("Unable to set SELinux label on %s"),
>>> +                                 devicePath);
>>> +            goto cleanup;
>>> +        }
>>> +    }
>>> +#endif
>>> +
>>
>> I think, instead of all the ifdefs, this should be a security driver API
>> instead of being hardcoded in places.  That way it will be processed
>> properly by all the security drivers.
>
>I don't think I see what you mean. Firstly, we want to set seclabels for
>some paths that are not touched by secdrivers at all (e.g. /dev/*random,
>/dev/kvm). Secondly, secdrivers should honour norelabel flag and be a
>no-op if that one is set. This would clash with sysadmins handling
>seclabels themselves. Thirdly, no secdriver of ours deals with ACLs. We
>have to in here.
>

It might sound a bit weird to have a security API that does not honour
relabel=no and does label an arbritrary file, but SELinux stuff should
go into SELinux security driver.  Otherwise this will be a mess.  The
only problem I see here is when the driver is disabled in the
configuration file, it will not be triggered.  But we might get around
that.

Just so you know, I'm not special-casing SELinux here.  I think
DAC-related stuff should go to DAC driver and so on.

Just my 2 cents, though.

>Michal
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170116/a2b424d3/attachment-0001.sig>


More information about the libvir-list mailing list