mirror of
https://github.com/libvirt/libvirt.git
synced 2026-08-09 12:38:27 -05:00
Improve security label error reporting & verification (Dan Walsh)
This commit is contained in:
+2
-1
@@ -419,7 +419,8 @@ EXTRA_DIST += \
|
||||
$(STORAGE_DRIVER_DISK_SOURCES) \
|
||||
$(NODE_DEVICE_DRIVER_SOURCES) \
|
||||
$(NODE_DEVICE_DRIVER_HAL_SOURCES) \
|
||||
$(NODE_DEVICE_DRIVER_DEVKIT_SOURCES)
|
||||
$(NODE_DEVICE_DRIVER_DEVKIT_SOURCES) \
|
||||
$(SECURITY_DRIVER_SELINUX_SOURCES)
|
||||
|
||||
#
|
||||
# Build our version script. This is composed of three parts:
|
||||
|
||||
+24
-9
@@ -1859,29 +1859,44 @@ virSecurityLabelDefParseXML(virConnectPtr conn,
|
||||
if (virXPathNode(conn, "./seclabel", ctxt) == NULL)
|
||||
return 0;
|
||||
|
||||
p = virXPathStringLimit(conn, "string(./seclabel/@model)",
|
||||
VIR_SECURITY_MODEL_BUFLEN-1, ctxt);
|
||||
if (p == NULL) {
|
||||
virDomainReportError(conn, VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing security model"));
|
||||
goto error;
|
||||
}
|
||||
def->seclabel.model = p;
|
||||
|
||||
p = virXPathStringLimit(conn, "string(./seclabel/@type)",
|
||||
VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
|
||||
if (p == NULL)
|
||||
goto error;
|
||||
if ((def->seclabel.type = virDomainSeclabelTypeFromString(p)) < 0)
|
||||
if (p == NULL) {
|
||||
virDomainReportError(conn, VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing security type"));
|
||||
goto error;
|
||||
}
|
||||
def->seclabel.type = virDomainSeclabelTypeFromString(p);
|
||||
VIR_FREE(p);
|
||||
if (def->seclabel.type < 0) {
|
||||
virDomainReportError(conn, VIR_ERR_XML_ERROR,
|
||||
_("invalid security type"));
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Only parse details, if using static labels, or
|
||||
* if the 'live' VM XML is requested
|
||||
*/
|
||||
if (def->seclabel.type == VIR_DOMAIN_SECLABEL_STATIC ||
|
||||
!(flags & VIR_DOMAIN_XML_INACTIVE)) {
|
||||
p = virXPathStringLimit(conn, "string(./seclabel/@model)",
|
||||
VIR_SECURITY_MODEL_BUFLEN-1, ctxt);
|
||||
if (p == NULL)
|
||||
goto error;
|
||||
def->seclabel.model = p;
|
||||
|
||||
p = virXPathStringLimit(conn, "string(./seclabel/label[1])",
|
||||
VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
|
||||
if (p == NULL)
|
||||
if (p == NULL) {
|
||||
virDomainReportError(conn, VIR_ERR_XML_ERROR,
|
||||
_("security label is missing"));
|
||||
goto error;
|
||||
}
|
||||
|
||||
def->seclabel.label = p;
|
||||
}
|
||||
|
||||
|
||||
@@ -248,6 +248,7 @@ free_qparam_set;
|
||||
|
||||
|
||||
# security.h
|
||||
virSecurityDriverVerify;
|
||||
virSecurityDriverStartup;
|
||||
virSecurityDriverInit;
|
||||
virSecurityDriverSetDOI;
|
||||
|
||||
@@ -2115,6 +2115,9 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
|
||||
VIR_DOMAIN_XML_INACTIVE)))
|
||||
goto cleanup;
|
||||
|
||||
if (virSecurityDriverVerify(conn, def) < 0)
|
||||
goto cleanup;
|
||||
|
||||
vm = virDomainFindByName(&driver->domains, def->name);
|
||||
if (vm) {
|
||||
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
@@ -3398,6 +3401,9 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
|
||||
VIR_DOMAIN_XML_INACTIVE)))
|
||||
goto cleanup;
|
||||
|
||||
if (virSecurityDriverVerify(conn, def) < 0)
|
||||
goto cleanup;
|
||||
|
||||
vm = virDomainFindByName(&driver->domains, def->name);
|
||||
if (vm) {
|
||||
virDomainObjUnlock(vm);
|
||||
|
||||
@@ -27,6 +27,25 @@ static virSecurityDriverPtr security_drivers[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
int
|
||||
virSecurityDriverVerify(virConnectPtr conn, virDomainDefPtr def)
|
||||
{
|
||||
unsigned int i;
|
||||
const virSecurityLabelDefPtr secdef = &def->seclabel;
|
||||
|
||||
if (STREQ(secdef->model, "none"))
|
||||
return 0;
|
||||
|
||||
for (i = 0; security_drivers[i] != NULL ; i++) {
|
||||
if (STREQ(security_drivers[i]->name, secdef->model)) {
|
||||
return security_drivers[i]->domainSecurityVerify(conn, def);
|
||||
}
|
||||
}
|
||||
virSecurityReportError(conn, VIR_ERR_XML_ERROR,
|
||||
_("invalid security model"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
virSecurityDriverStartup(virSecurityDriverPtr *drv,
|
||||
const char *name)
|
||||
|
||||
@@ -46,11 +46,14 @@ typedef int (*virSecurityDomainRestoreLabel) (virConnectPtr conn,
|
||||
typedef int (*virSecurityDomainSetLabel) (virConnectPtr conn,
|
||||
virSecurityDriverPtr drv,
|
||||
virDomainObjPtr vm);
|
||||
typedef int (*virSecurityDomainSecurityVerify) (virConnectPtr conn,
|
||||
virDomainDefPtr def);
|
||||
|
||||
struct _virSecurityDriver {
|
||||
const char *name;
|
||||
virSecurityDriverProbe probe;
|
||||
virSecurityDriverOpen open;
|
||||
virSecurityDomainSecurityVerify domainSecurityVerify;
|
||||
virSecurityDomainRestoreImageLabel domainRestoreSecurityImageLabel;
|
||||
virSecurityDomainSetImageLabel domainSetSecurityImageLabel;
|
||||
virSecurityDomainGenLabel domainGenSecurityLabel;
|
||||
@@ -71,6 +74,9 @@ struct _virSecurityDriver {
|
||||
int virSecurityDriverStartup(virSecurityDriverPtr *drv,
|
||||
const char *name);
|
||||
|
||||
int
|
||||
virSecurityDriverVerify(virConnectPtr conn, virDomainDefPtr def);
|
||||
|
||||
void
|
||||
virSecurityReportError(virConnectPtr conn, int code, const char *fmt, ...)
|
||||
ATTRIBUTE_FORMAT(printf, 3, 4);
|
||||
|
||||
+17
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2008 Red Hat, Inc.
|
||||
* Copyright (C) 2008,2009 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -8,6 +8,7 @@
|
||||
*
|
||||
* Authors:
|
||||
* James Morris <jmorris@namei.org>
|
||||
* Dan Walsh <dwalsh@redhat.com>
|
||||
*
|
||||
* SELinux security driver.
|
||||
*/
|
||||
@@ -356,6 +357,20 @@ SELinuxRestoreSecurityLabel(virConnectPtr conn,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
SELinuxSecurityVerify(virConnectPtr conn, virDomainDefPtr def)
|
||||
{
|
||||
const virSecurityLabelDefPtr secdef = &def->seclabel;
|
||||
if (secdef->type == VIR_DOMAIN_SECLABEL_STATIC) {
|
||||
if (security_check_context(secdef->label) != 0) {
|
||||
virSecurityReportError(conn, VIR_ERR_XML_ERROR,
|
||||
_("Invalid security label %s"), secdef->label);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
SELinuxSetSecurityLabel(virConnectPtr conn,
|
||||
virSecurityDriverPtr drv,
|
||||
@@ -402,6 +417,7 @@ virSecurityDriver virSELinuxSecurityDriver = {
|
||||
.name = SECURITY_SELINUX_NAME,
|
||||
.probe = SELinuxSecurityDriverProbe,
|
||||
.open = SELinuxSecurityDriverOpen,
|
||||
.domainSecurityVerify = SELinuxSecurityVerify,
|
||||
.domainSetSecurityImageLabel = SELinuxSetSecurityImageLabel,
|
||||
.domainRestoreSecurityImageLabel = SELinuxRestoreSecurityImageLabel,
|
||||
.domainGenSecurityLabel = SELinuxGenSecurityLabel,
|
||||
|
||||
Reference in New Issue
Block a user