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.