mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
security: Introduce SetSocketLabel
This API labels all sockets created until ClearSocketLabel is called in a way that a vm can access them (i.e., they are labeled with svirt_t based label in SELinux).
This commit is contained in:
parent
4c85d96f27
commit
520d91f8bd
@ -911,6 +911,7 @@ virSecurityManagerSetHostdevLabel;
|
|||||||
virSecurityManagerSetProcessFDLabel;
|
virSecurityManagerSetProcessFDLabel;
|
||||||
virSecurityManagerSetProcessLabel;
|
virSecurityManagerSetProcessLabel;
|
||||||
virSecurityManagerSetSavedStateLabel;
|
virSecurityManagerSetSavedStateLabel;
|
||||||
|
virSecurityManagerSetSocketLabel;
|
||||||
virSecurityManagerVerify;
|
virSecurityManagerVerify;
|
||||||
|
|
||||||
# sexpr.h
|
# sexpr.h
|
||||||
|
@ -584,6 +584,13 @@ AppArmorSetSecurityDaemonSocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
AppArmorSetSecuritySocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||||
|
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
AppArmorClearSecuritySocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
AppArmorClearSecuritySocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||||
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
||||||
@ -836,6 +843,7 @@ virSecurityDriver virAppArmorSecurityDriver = {
|
|||||||
AppArmorRestoreSecurityImageLabel,
|
AppArmorRestoreSecurityImageLabel,
|
||||||
|
|
||||||
AppArmorSetSecurityDaemonSocketLabel,
|
AppArmorSetSecurityDaemonSocketLabel,
|
||||||
|
AppArmorSetSecuritySocketLabel,
|
||||||
AppArmorClearSecuritySocketLabel,
|
AppArmorClearSecuritySocketLabel,
|
||||||
|
|
||||||
AppArmorGenSecurityLabel,
|
AppArmorGenSecurityLabel,
|
||||||
|
@ -674,6 +674,14 @@ virSecurityDACSetDaemonSocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virSecurityDACSetSocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||||
|
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virSecurityDACClearSocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
virSecurityDACClearSocketLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||||
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
||||||
@ -715,6 +723,7 @@ virSecurityDriver virSecurityDriverDAC = {
|
|||||||
virSecurityDACRestoreSecurityImageLabel,
|
virSecurityDACRestoreSecurityImageLabel,
|
||||||
|
|
||||||
virSecurityDACSetDaemonSocketLabel,
|
virSecurityDACSetDaemonSocketLabel,
|
||||||
|
virSecurityDACSetSocketLabel,
|
||||||
virSecurityDACClearSocketLabel,
|
virSecurityDACClearSocketLabel,
|
||||||
|
|
||||||
virSecurityDACGenLabel,
|
virSecurityDACGenLabel,
|
||||||
|
@ -43,6 +43,8 @@ typedef int (*virSecurityDomainRestoreImageLabel) (virSecurityManagerPtr mgr,
|
|||||||
virDomainDiskDefPtr disk);
|
virDomainDiskDefPtr disk);
|
||||||
typedef int (*virSecurityDomainSetDaemonSocketLabel)(virSecurityManagerPtr mgr,
|
typedef int (*virSecurityDomainSetDaemonSocketLabel)(virSecurityManagerPtr mgr,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
|
typedef int (*virSecurityDomainSetSocketLabel) (virSecurityManagerPtr mgr,
|
||||||
|
virDomainObjPtr vm);
|
||||||
typedef int (*virSecurityDomainClearSocketLabel)(virSecurityManagerPtr mgr,
|
typedef int (*virSecurityDomainClearSocketLabel)(virSecurityManagerPtr mgr,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
typedef int (*virSecurityDomainSetImageLabel) (virSecurityManagerPtr mgr,
|
typedef int (*virSecurityDomainSetImageLabel) (virSecurityManagerPtr mgr,
|
||||||
@ -102,6 +104,7 @@ struct _virSecurityDriver {
|
|||||||
virSecurityDomainRestoreImageLabel domainRestoreSecurityImageLabel;
|
virSecurityDomainRestoreImageLabel domainRestoreSecurityImageLabel;
|
||||||
|
|
||||||
virSecurityDomainSetDaemonSocketLabel domainSetSecurityDaemonSocketLabel;
|
virSecurityDomainSetDaemonSocketLabel domainSetSecurityDaemonSocketLabel;
|
||||||
|
virSecurityDomainSetSocketLabel domainSetSecuritySocketLabel;
|
||||||
virSecurityDomainClearSocketLabel domainClearSecuritySocketLabel;
|
virSecurityDomainClearSocketLabel domainClearSecuritySocketLabel;
|
||||||
|
|
||||||
virSecurityDomainGenLabel domainGenSecurityLabel;
|
virSecurityDomainGenLabel domainGenSecurityLabel;
|
||||||
|
@ -170,6 +170,16 @@ int virSecurityManagerSetDaemonSocketLabel(virSecurityManagerPtr mgr,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int virSecurityManagerSetSocketLabel(virSecurityManagerPtr mgr,
|
||||||
|
virDomainObjPtr vm)
|
||||||
|
{
|
||||||
|
if (mgr->drv->domainSetSecuritySocketLabel)
|
||||||
|
return mgr->drv->domainSetSecuritySocketLabel(mgr, vm);
|
||||||
|
|
||||||
|
virSecurityReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int virSecurityManagerClearSocketLabel(virSecurityManagerPtr mgr,
|
int virSecurityManagerClearSocketLabel(virSecurityManagerPtr mgr,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm)
|
||||||
{
|
{
|
||||||
|
@ -55,6 +55,8 @@ int virSecurityManagerRestoreImageLabel(virSecurityManagerPtr mgr,
|
|||||||
virDomainDiskDefPtr disk);
|
virDomainDiskDefPtr disk);
|
||||||
int virSecurityManagerSetDaemonSocketLabel(virSecurityManagerPtr mgr,
|
int virSecurityManagerSetDaemonSocketLabel(virSecurityManagerPtr mgr,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
|
int virSecurityManagerSetSocketLabel(virSecurityManagerPtr mgr,
|
||||||
|
virDomainObjPtr vm);
|
||||||
int virSecurityManagerClearSocketLabel(virSecurityManagerPtr mgr,
|
int virSecurityManagerClearSocketLabel(virSecurityManagerPtr mgr,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
int virSecurityManagerSetImageLabel(virSecurityManagerPtr mgr,
|
int virSecurityManagerSetImageLabel(virSecurityManagerPtr mgr,
|
||||||
|
@ -59,6 +59,12 @@ static int virSecurityDomainSetDaemonSocketLabelNop(virSecurityManagerPtr mgr AT
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int virSecurityDomainSetSocketLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||||
|
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int virSecurityDomainClearSocketLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
static int virSecurityDomainClearSocketLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
|
||||||
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
@ -172,6 +178,7 @@ virSecurityDriver virSecurityDriverNop = {
|
|||||||
virSecurityDomainRestoreImageLabelNop,
|
virSecurityDomainRestoreImageLabelNop,
|
||||||
|
|
||||||
virSecurityDomainSetDaemonSocketLabelNop,
|
virSecurityDomainSetDaemonSocketLabelNop,
|
||||||
|
virSecurityDomainSetSocketLabelNop,
|
||||||
virSecurityDomainClearSocketLabelNop,
|
virSecurityDomainClearSocketLabelNop,
|
||||||
|
|
||||||
virSecurityDomainGenLabelNop,
|
virSecurityDomainGenLabelNop,
|
||||||
|
@ -1136,6 +1136,43 @@ done:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
SELinuxSetSecuritySocketLabel(virSecurityManagerPtr mgr,
|
||||||
|
virDomainObjPtr vm)
|
||||||
|
{
|
||||||
|
const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
|
||||||
|
int rc = -1;
|
||||||
|
|
||||||
|
if (secdef->label == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!STREQ(virSecurityManagerGetModel(mgr), secdef->model)) {
|
||||||
|
virSecurityReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("security label driver mismatch: "
|
||||||
|
"'%s' model configured for domain, but "
|
||||||
|
"hypervisor driver is '%s'."),
|
||||||
|
secdef->model, virSecurityManagerGetModel(mgr));
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DEBUG("Setting VM %s socket context %s",
|
||||||
|
vm->def->name, secdef->label);
|
||||||
|
if (setsockcreatecon(secdef->label) == -1) {
|
||||||
|
virReportSystemError(errno,
|
||||||
|
_("unable to set socket security context '%s'"),
|
||||||
|
secdef->label);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (security_getenforce() != 1)
|
||||||
|
rc = 0;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
SELinuxClearSecuritySocketLabel(virSecurityManagerPtr mgr,
|
SELinuxClearSecuritySocketLabel(virSecurityManagerPtr mgr,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm)
|
||||||
@ -1313,6 +1350,7 @@ virSecurityDriver virSecurityDriverSELinux = {
|
|||||||
SELinuxRestoreSecurityImageLabel,
|
SELinuxRestoreSecurityImageLabel,
|
||||||
|
|
||||||
SELinuxSetSecurityDaemonSocketLabel,
|
SELinuxSetSecurityDaemonSocketLabel,
|
||||||
|
SELinuxSetSecuritySocketLabel,
|
||||||
SELinuxClearSecuritySocketLabel,
|
SELinuxClearSecuritySocketLabel,
|
||||||
|
|
||||||
SELinuxGenSecurityLabel,
|
SELinuxGenSecurityLabel,
|
||||||
|
@ -354,6 +354,22 @@ virSecurityStackSetDaemonSocketLabel(virSecurityManagerPtr mgr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virSecurityStackSetSocketLabel(virSecurityManagerPtr mgr,
|
||||||
|
virDomainObjPtr vm)
|
||||||
|
{
|
||||||
|
virSecurityStackDataPtr priv = virSecurityManagerGetPrivateData(mgr);
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (virSecurityManagerSetSocketLabel(priv->secondary, vm) < 0)
|
||||||
|
rc = -1;
|
||||||
|
if (virSecurityManagerSetSocketLabel(priv->primary, vm) < 0)
|
||||||
|
rc = -1;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virSecurityStackClearSocketLabel(virSecurityManagerPtr mgr,
|
virSecurityStackClearSocketLabel(virSecurityManagerPtr mgr,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm)
|
||||||
@ -419,6 +435,7 @@ virSecurityDriver virSecurityDriverStack = {
|
|||||||
virSecurityStackRestoreSecurityImageLabel,
|
virSecurityStackRestoreSecurityImageLabel,
|
||||||
|
|
||||||
virSecurityStackSetDaemonSocketLabel,
|
virSecurityStackSetDaemonSocketLabel,
|
||||||
|
virSecurityStackSetSocketLabel,
|
||||||
virSecurityStackClearSocketLabel,
|
virSecurityStackClearSocketLabel,
|
||||||
|
|
||||||
virSecurityStackGenLabel,
|
virSecurityStackGenLabel,
|
||||||
|
Loading…
Reference in New Issue
Block a user