Re: libvirt-selinux.patch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, May 14, 2010 at 04:11:27PM -0400, Daniel J Walsh wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> This is my attempt at getting libvirt to work on an MLS machine.
> 
> This patch attempts to take the current context
> 
> libvirtcon = "system_u:system_r:virtd_t:SystemLow-SystemHigh"
> 
> The the label of the virtual machine
> 
> svirtcon = "system_u:system_r:virtd_t:TopSecret"
> 
> Create a new context
> 
> newcon = "system_u:system_r:virtd_t:TopSecret"
> 
> Then call setsockcreatecon(newcon)
> 
> Could you guys check the SELinux parts of this and make sure it matches
> your expectations.
> 
> The patch does not work, because I think something is wrong with
> libvirt, it does not call qemuConnectMonitor?

What sort of error do you get back ?  If you want to debug this, then
stop the libvirtd daemon, and run it with

  LIBVIRT_LOG_FILTERS="1:qemu 1:util 1:security" LIBVIRT_LOG_OUTPUTS="1:stderr" /usr/sbin/libvirtd

That'll log everything from the QEMU driver, util functions and
any file with 'security' in its name. Also be sure to check the
QEMU process logs in /var/log/libvirt/qemu/$GUEST.log which is
often helpful if QEMU itself fails.

If you're not seeing libvirt call qemuConnectMonitor() then my
guess would be that QEMU itself has crashed/quit before libvirt 
got around to connecting to the monitor.

Daniel

> diff -up libvirt-0.8.1/src/qemu/qemu_driver.c~ libvirt-0.8.1/src/qemu/qemu_driver.c
> --- libvirt-0.8.1/src/qemu/qemu_driver.c~	2010-04-30 11:45:43.000000000 -0400
> +++ libvirt-0.8.1/src/qemu/qemu_driver.c	2010-05-14 11:48:38.000000000 -0400
> @@ -1176,27 +1176,44 @@ static int
>  qemuConnectMonitor(struct qemud_driver *driver, virDomainObjPtr vm)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> -    int ret;
> +    int ret = -1;
>  
>      /* Hold an extra reference because we can't allow 'vm' to be
>       * deleted while the monitor is active */
>      virDomainObjRef(vm);
>  
> +    if ((driver->securityDriver &&
> +         driver->securityDriver->domainSetSecuritySocketLabel &&
> +         driver->securityDriver->domainSetSecuritySocketLabel(driver->securityDriver,vm)) < 0) {
> +        VIR_ERROR(_("Failed to set security context for monitor for %s"), vm->def->name);
> +        goto error;
> +    }
> +    
>      if ((priv->mon = qemuMonitorOpen(vm,
>                                       priv->monConfig,
>                                       priv->monJSON,
>                                       &monitorCallbacks)) == NULL) {
>          VIR_ERROR(_("Failed to connect monitor for %s"), vm->def->name);
> -        return -1;
> +        goto error;
>      }
>  
> +    if ((driver->securityDriver &&
> +         driver->securityDriver->domainClearSecuritySocketLabel &&
> +         driver->securityDriver->domainClearSecuritySocketLabel(driver->securityDriver,vm)) < 0) {
> +        VIR_ERROR(_("Failed to set security context for monitor for %s"), vm->def->name);
> +        goto error;
> +    }
> +    
>      qemuDomainObjEnterMonitorWithDriver(driver, vm);
>      ret = qemuMonitorSetCapabilities(priv->mon);
>      qemuDomainObjExitMonitorWithDriver(driver, vm);
>  
> +    ret = 0;
> +error:
>      if (ret < 0) {
>          qemuMonitorClose(priv->mon);
>          priv->mon = NULL;
> +        virDomainObjUnref(vm);
>      }
>  
>      return ret;
> diff -up libvirt-0.8.1/src/qemu/qemu_monitor.c~ libvirt-0.8.1/src/qemu/qemu_monitor.c
> diff -up libvirt-0.8.1/src/security/security_driver.h~ libvirt-0.8.1/src/security/security_driver.h
> --- libvirt-0.8.1/src/security/security_driver.h~	2010-03-18 08:30:08.000000000 -0400
> +++ libvirt-0.8.1/src/security/security_driver.h	2010-05-13 17:20:43.000000000 -0400
> @@ -32,6 +32,10 @@ typedef virSecurityDriverStatus (*virSec
>  typedef int (*virSecurityDriverOpen) (virSecurityDriverPtr drv);
>  typedef int (*virSecurityDomainRestoreImageLabel) (virDomainObjPtr vm,
>                                                     virDomainDiskDefPtr disk);
> +typedef int (*virSecurityDomainSetSocketLabel) (virSecurityDriverPtr drv,
> +                                                virDomainObjPtr vm);
> +typedef int (*virSecurityDomainClearSocketLabel)(virSecurityDriverPtr drv,
> +                                                virDomainObjPtr vm);
>  typedef int (*virSecurityDomainSetImageLabel) (virDomainObjPtr vm,
>                                                 virDomainDiskDefPtr disk);
>  typedef int (*virSecurityDomainRestoreHostdevLabel) (virDomainObjPtr vm,
> @@ -59,6 +63,8 @@ struct _virSecurityDriver {
>      virSecurityDriverOpen open;
>      virSecurityDomainSecurityVerify domainSecurityVerify;
>      virSecurityDomainRestoreImageLabel domainRestoreSecurityImageLabel;
> +    virSecurityDomainSetSocketLabel domainSetSecuritySocketLabel;
> +    virSecurityDomainClearSocketLabel domainClearSecuritySocketLabel;
>      virSecurityDomainSetImageLabel domainSetSecurityImageLabel;
>      virSecurityDomainGenLabel domainGenSecurityLabel;
>      virSecurityDomainReserveLabel domainReserveSecurityLabel;
> diff -up libvirt-0.8.1/src/security/security_selinux.c~ libvirt-0.8.1/src/security/security_selinux.c
> --- libvirt-0.8.1/src/security/security_selinux.c~	2010-04-30 08:46:09.000000000 -0400
> +++ libvirt-0.8.1/src/security/security_selinux.c	2010-05-14 11:47:38.000000000 -0400
> @@ -730,6 +728,103 @@ SELinuxSetSecurityProcessLabel(virSecuri
>  }
>  
>  static int
> +SELinuxSetSecuritySocketLabel(virSecurityDriverPtr drv,
> +                               virDomainObjPtr vm)
> +{
> +    /* TODO: verify DOI */
> +    const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
> +    context_t execcon = NULL;
> +    context_t proccon = NULL;
> +    security_context_t scon = NULL;
> +    int rc = -1;
> +
> +    if (vm->def->seclabel.label == NULL)
> +        return 0;
> +
> +    if (!STREQ(drv->name, secdef->model)) {
> +        virSecurityReportError(VIR_ERR_INTERNAL_ERROR,
> +                               _("security label driver mismatch: "
> +                                 "'%s' model configured for domain, but "
> +                                 "hypervisor driver is '%s'."),
> +                               secdef->model, drv->name);
> +        goto done;
> +    }
> +
> +    if ( !(execcon = context_new(secdef->label)) ) {
> +        virReportSystemError(errno,
> +                             _("unable to allocate socket security context '%s'"),
> +                             secdef->label);
> +        goto done;
> +    }
> +
> +    if (getcon(&scon) == -1) {
> +        virReportSystemError(errno,
> +                             _("unable to get current process context '%s'"),
> +                             secdef->label);
> +        goto done;
> +    }
> +
> +    if ( !(proccon = context_new(scon)) ) {
> +        virReportSystemError(errno,
> +                             _("unable to set socket security context '%s'"),
> +                             secdef->label);
> +        goto done;
> +    }
> +
> +    if (context_range_set(proccon, context_range_get(execcon)) == -1) {
> +        virReportSystemError(errno,
> +                             _("unable to set socket security context range '%s'"),
> +                             secdef->label);
> +        goto done;
> +    }
> +
> +    if (setsockcreatecon(context_str(proccon)) == -1) {
> +        virReportSystemError(errno,
> +                             _("unable to set socket security context '%s'"),
> +                             context_str(proccon));
> +        goto done;
> +    }
> +
> +    rc = 0;
> +done:
> +    if (security_getenforce() != 1)
> +        rc = 0;
> +    if (execcon) context_free(execcon);
> +    if (proccon) context_free(proccon);
> +    freecon(scon);
> +    return rc;
> +}
> +
> +static int
> +SELinuxClearSecuritySocketLabel(virSecurityDriverPtr drv,
> +                                virDomainObjPtr vm)
> +{
> +    /* TODO: verify DOI */
> +    const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
> +    if (vm->def->seclabel.label == NULL)
> +        return 0;
> +
> +    if (!STREQ(drv->name, secdef->model)) {
> +        virSecurityReportError(VIR_ERR_INTERNAL_ERROR,
> +                               _("security label driver mismatch: "
> +                                 "'%s' model configured for domain, but "
> +                                 "hypervisor driver is '%s'."),
> +                               secdef->model, drv->name);
> +        if (security_getenforce() == 1)
> +            return -1;
> +    }
> +
> +    if (setsockcreatecon(NULL) == -1) {
> +        virReportSystemError(errno,
> +                             _("unable to clear socket security context '%s'"),
> +                             secdef->label);
> +        if (security_getenforce() == 1)
> +            return -1;
> +    }
> +    return 0;
> +}
> +
> +static int
>  SELinuxSetSecurityAllLabel(virDomainObjPtr vm)
>  {
>      const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
> @@ -770,6 +865,8 @@ virSecurityDriver virSELinuxSecurityDriv
>      .open                       = SELinuxSecurityDriverOpen,
>      .domainSecurityVerify       = SELinuxSecurityVerify,
>      .domainSetSecurityImageLabel = SELinuxSetSecurityImageLabel,
> +    .domainSetSecuritySocketLabel     = SELinuxSetSecuritySocketLabel,
> +    .domainClearSecuritySocketLabel     = SELinuxClearSecuritySocketLabel,
>      .domainRestoreSecurityImageLabel = SELinuxRestoreSecurityImageLabel,
>      .domainGenSecurityLabel     = SELinuxGenSecurityLabel,
>      .domainReserveSecurityLabel     = SELinuxReserveSecurityLabel,



-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux