提交 ec94e14b 编写于 作者: J Jim Fehlig

apparmor: don't fail on non-apparmor <seclabel>

If the apparmor security driver is loaded/enabled and domain config
contains a <seclabel> element whose type attribute is not 'apparmor',
starting the domain fails when attempting to label resources such
as tap FDs.

Many of the apparmor driver entry points attempt to retrieve the
apparmor security label from the domain def, returning failure if
not found. Functions such as AppArmorSetFDLabel fail even though
domain config contains an explicit 'none' secuirty driver, e.g.

  <seclabel type='none' model='none'/>

Change the entry points to succeed if the domain config <seclabel>
is not apparmor. This matches the behavior of the selinux driver.
上级 5cdfc80b
...@@ -289,10 +289,7 @@ reload_profile(virSecurityManagerPtr mgr, ...@@ -289,10 +289,7 @@ reload_profile(virSecurityManagerPtr mgr,
virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef( virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(
def, SECURITY_APPARMOR_NAME); def, SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef || !secdef->relabel)
return rc;
if (!secdef->relabel)
return 0; return 0;
if ((profile_name = get_profile_name(def)) == NULL) if ((profile_name = get_profile_name(def)) == NULL)
...@@ -435,7 +432,7 @@ AppArmorGenSecurityLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED, ...@@ -435,7 +432,7 @@ AppArmorGenSecurityLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
SECURITY_APPARMOR_NAME); SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef)
return -1; return 0;
if ((secdef->type == VIR_DOMAIN_SECLABEL_STATIC) || if ((secdef->type == VIR_DOMAIN_SECLABEL_STATIC) ||
(secdef->type == VIR_DOMAIN_SECLABEL_NONE)) (secdef->type == VIR_DOMAIN_SECLABEL_NONE))
...@@ -495,10 +492,7 @@ AppArmorSetSecurityAllLabel(virSecurityManagerPtr mgr, ...@@ -495,10 +492,7 @@ AppArmorSetSecurityAllLabel(virSecurityManagerPtr mgr,
{ {
virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def, virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def,
SECURITY_APPARMOR_NAME); SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef || !secdef->relabel)
return -1;
if (!secdef->relabel)
return 0; return 0;
/* Reload the profile if stdin_path is specified. Note that /* Reload the profile if stdin_path is specified. Note that
...@@ -559,12 +553,11 @@ AppArmorReleaseSecurityLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED, ...@@ -559,12 +553,11 @@ AppArmorReleaseSecurityLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
{ {
virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def, virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def,
SECURITY_APPARMOR_NAME); SECURITY_APPARMOR_NAME);
if (!secdef) if (secdef) {
return -1; VIR_FREE(secdef->model);
VIR_FREE(secdef->label);
VIR_FREE(secdef->model); VIR_FREE(secdef->imagelabel);
VIR_FREE(secdef->label); }
VIR_FREE(secdef->imagelabel);
return 0; return 0;
} }
...@@ -580,7 +573,7 @@ AppArmorRestoreSecurityAllLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED, ...@@ -580,7 +573,7 @@ AppArmorRestoreSecurityAllLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef)
return -1; return 0;
if (secdef->type == VIR_DOMAIN_SECLABEL_DYNAMIC) { if (secdef->type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
if ((rc = remove_profile(secdef->label)) != 0) { if ((rc = remove_profile(secdef->label)) != 0) {
...@@ -604,10 +597,7 @@ AppArmorSetSecurityProcessLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED, ...@@ -604,10 +597,7 @@ AppArmorSetSecurityProcessLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
virSecurityLabelDefPtr secdef = virSecurityLabelDefPtr secdef =
virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef || !secdef->label)
return -1;
if (secdef->label == NULL)
return 0; return 0;
if ((profile_name = get_profile_name(def)) == NULL) if ((profile_name = get_profile_name(def)) == NULL)
...@@ -653,10 +643,7 @@ AppArmorSetSecurityChildProcessLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED, ...@@ -653,10 +643,7 @@ AppArmorSetSecurityChildProcessLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
virSecurityLabelDefPtr secdef = virSecurityLabelDefPtr secdef =
virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef || !secdef->label)
goto cleanup;
if (secdef->label == NULL)
return 0; return 0;
if (STRNEQ(SECURITY_APPARMOR_NAME, secdef->model)) { if (STRNEQ(SECURITY_APPARMOR_NAME, secdef->model)) {
...@@ -738,10 +725,8 @@ AppArmorSetSecurityImageLabel(virSecurityManagerPtr mgr, ...@@ -738,10 +725,8 @@ AppArmorSetSecurityImageLabel(virSecurityManagerPtr mgr,
if (!src->path || !virStorageSourceIsLocalStorage(src)) if (!src->path || !virStorageSourceIsLocalStorage(src))
return 0; return 0;
if (!(secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME))) secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME);
return -1; if (!secdef || !secdef->relabel)
if (!secdef->relabel)
return 0; return 0;
if (secdef->imagelabel) { if (secdef->imagelabel) {
...@@ -792,7 +777,7 @@ AppArmorSecurityVerify(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED, ...@@ -792,7 +777,7 @@ AppArmorSecurityVerify(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef)
return -1; return 0;
if (secdef->type == VIR_DOMAIN_SECLABEL_STATIC) { if (secdef->type == VIR_DOMAIN_SECLABEL_STATIC) {
if (use_apparmor() < 0 || profile_status(secdef->label, 0) < 0) { if (use_apparmor() < 0 || profile_status(secdef->label, 0) < 0) {
...@@ -829,10 +814,7 @@ AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr, ...@@ -829,10 +814,7 @@ AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr,
virDomainHostdevSubsysSCSIPtr scsisrc = &dev->source.subsys.u.scsi; virDomainHostdevSubsysSCSIPtr scsisrc = &dev->source.subsys.u.scsi;
virDomainHostdevSubsysSCSIVHostPtr hostsrc = &dev->source.subsys.u.scsi_host; virDomainHostdevSubsysSCSIVHostPtr hostsrc = &dev->source.subsys.u.scsi_host;
if (!secdef) if (!secdef || !secdef->relabel)
return -1;
if (!secdef->relabel)
return 0; return 0;
if (dev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) if (dev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
...@@ -940,10 +922,7 @@ AppArmorRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr, ...@@ -940,10 +922,7 @@ AppArmorRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr,
virSecurityLabelDefPtr secdef = virSecurityLabelDefPtr secdef =
virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef || !secdef->relabel)
return -1;
if (!secdef->relabel)
return 0; return 0;
return reload_profile(mgr, def, NULL, false); return reload_profile(mgr, def, NULL, false);
...@@ -978,10 +957,7 @@ AppArmorSetFDLabel(virSecurityManagerPtr mgr, ...@@ -978,10 +957,7 @@ AppArmorSetFDLabel(virSecurityManagerPtr mgr,
virSecurityLabelDefPtr secdef = virSecurityLabelDefPtr secdef =
virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME);
if (!secdef) if (!secdef || !secdef->imagelabel)
return -1;
if (secdef->imagelabel == NULL)
return 0; return 0;
if (virAsprintf(&proc, "/proc/self/fd/%d", fd) == -1) if (virAsprintf(&proc, "/proc/self/fd/%d", fd) == -1)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册