提交 43c030f0 编写于 作者: C Cédric Bosdonnat 提交者: Daniel P. Berrange

LXC driver: generate apparmor profiles for guests

use_apparmor() was first designed to be called from withing libvirtd,
but libvirt_lxc also uses it. in libvirt_lxc, there is no need to check
whether to use apparmor or not: just use it if possible.
上级 a31bd18f
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
EXTRA_DIST= \ EXTRA_DIST= \
TEMPLATE \ TEMPLATE \
libvirt-qemu \ libvirt-qemu \
libvirt-lxc \
usr.lib.libvirt.virt-aa-helper \ usr.lib.libvirt.virt-aa-helper \
usr.sbin.libvirtd usr.sbin.libvirtd
...@@ -30,6 +31,7 @@ apparmor_DATA = \ ...@@ -30,6 +31,7 @@ apparmor_DATA = \
abstractionsdir = $(apparmordir)/abstractions abstractionsdir = $(apparmordir)/abstractions
abstractions_DATA = \ abstractions_DATA = \
libvirt-qemu \ libvirt-qemu \
libvirt-lxc \
$(NULL) $(NULL)
templatesdir = $(apparmordir)/libvirt templatesdir = $(apparmordir)/libvirt
......
...@@ -5,5 +5,5 @@ ...@@ -5,5 +5,5 @@
#include <tunables/global> #include <tunables/global>
profile LIBVIRT_TEMPLATE { profile LIBVIRT_TEMPLATE {
#include <abstractions/libvirt-qemu> #include <abstractions/libvirt-driver>
} }
# Last Modified: Fri Feb 7 13:01:36 2014
#include <abstractions/base>
/usr/sbin/cron PUx,
/usr/lib/systemd/systemd PUx,
/usr/lib/libsystemd-*.so.* mr,
/usr/lib/libudev-*.so.* mr,
/etc/ld.so.cache mr,
...@@ -246,6 +246,11 @@ use_apparmor(void) ...@@ -246,6 +246,11 @@ use_apparmor(void)
return rc; return rc;
} }
/* If libvirt_lxc is calling us, then consider apparmor is used
* and enforced. */
if (strstr(libvirt_daemon, "libvirt_lxc"))
return 1;
if (access(APPARMOR_PROFILES_PATH, R_OK) != 0) if (access(APPARMOR_PROFILES_PATH, R_OK) != 0)
goto cleanup; goto cleanup;
...@@ -341,7 +346,7 @@ AppArmorSetSecuritySCSILabel(virSCSIDevicePtr dev ATTRIBUTE_UNUSED, ...@@ -341,7 +346,7 @@ AppArmorSetSecuritySCSILabel(virSCSIDevicePtr dev ATTRIBUTE_UNUSED,
/* Called on libvirtd startup to see if AppArmor is available */ /* Called on libvirtd startup to see if AppArmor is available */
static int static int
AppArmorSecurityManagerProbe(const char *virtDriver) AppArmorSecurityManagerProbe(const char *virtDriver ATTRIBUTE_UNUSED)
{ {
char *template = NULL; char *template = NULL;
int rc = SECURITY_DRIVER_DISABLE; int rc = SECURITY_DRIVER_DISABLE;
...@@ -349,9 +354,6 @@ AppArmorSecurityManagerProbe(const char *virtDriver) ...@@ -349,9 +354,6 @@ AppArmorSecurityManagerProbe(const char *virtDriver)
if (use_apparmor() < 0) if (use_apparmor() < 0)
return rc; return rc;
if (virtDriver && STREQ(virtDriver, "LXC"))
return rc;
/* see if template file exists */ /* see if template file exists */
if (virAsprintf(&template, "%s/TEMPLATE", if (virAsprintf(&template, "%s/TEMPLATE",
APPARMOR_DIR "/libvirt") == -1) APPARMOR_DIR "/libvirt") == -1)
......
...@@ -328,18 +328,24 @@ update_include_file(const char *include_file, const char *included_files, ...@@ -328,18 +328,24 @@ update_include_file(const char *include_file, const char *included_files,
*/ */
static int static int
create_profile(const char *profile, const char *profile_name, create_profile(const char *profile, const char *profile_name,
const char *profile_files) const char *profile_files, int virtType)
{ {
char *template; char *template;
char *tcontent = NULL; char *tcontent = NULL;
char *pcontent = NULL; char *pcontent = NULL;
char *replace_name = NULL; char *replace_name = NULL;
char *replace_files = NULL; char *replace_files = NULL;
char *replace_driver = NULL;
const char *template_name = "\nprofile LIBVIRT_TEMPLATE"; const char *template_name = "\nprofile LIBVIRT_TEMPLATE";
const char *template_end = "\n}"; const char *template_end = "\n}";
const char *template_driver = "libvirt-driver";
int tlen, plen; int tlen, plen;
int fd; int fd;
int rc = -1; int rc = -1;
const char *driver_name = "qemu";
if (virtType == VIR_DOMAIN_VIRT_LXC)
driver_name = "lxc";
if (virFileExists(profile)) { if (virFileExists(profile)) {
vah_error(NULL, 0, _("profile exists")); vah_error(NULL, 0, _("profile exists"));
...@@ -371,6 +377,11 @@ create_profile(const char *profile, const char *profile_name, ...@@ -371,6 +377,11 @@ create_profile(const char *profile, const char *profile_name,
goto clean_tcontent; goto clean_tcontent;
} }
if (strstr(tcontent, template_driver) == NULL) {
vah_error(NULL, 0, _("no replacement string in template"));
goto clean_tcontent;
}
/* '\nprofile <profile_name>\0' */ /* '\nprofile <profile_name>\0' */
if (virAsprintfQuiet(&replace_name, "\nprofile %s", profile_name) == -1) { if (virAsprintfQuiet(&replace_name, "\nprofile %s", profile_name) == -1) {
vah_error(NULL, 0, _("could not allocate memory for profile name")); vah_error(NULL, 0, _("could not allocate memory for profile name"));
...@@ -378,14 +389,26 @@ create_profile(const char *profile, const char *profile_name, ...@@ -378,14 +389,26 @@ create_profile(const char *profile, const char *profile_name,
} }
/* '\n<profile_files>\n}\0' */ /* '\n<profile_files>\n}\0' */
if (virAsprintfQuiet(&replace_files, "\n%s\n}", profile_files) == -1) { if ((virtType != VIR_DOMAIN_VIRT_LXC) &&
virAsprintfQuiet(&replace_files, "\n%s\n}", profile_files) == -1) {
vah_error(NULL, 0, _("could not allocate memory for profile files")); vah_error(NULL, 0, _("could not allocate memory for profile files"));
VIR_FREE(replace_name); VIR_FREE(replace_name);
goto clean_tcontent; goto clean_tcontent;
} }
/* 'libvirt-<driver_name>\0' */
if (virAsprintfQuiet(&replace_driver, "libvirt-%s", driver_name) == -1) {
vah_error(NULL, 0, _("could not allocate memory for profile driver"));
VIR_FREE(replace_driver);
goto clean_tcontent;
}
plen = tlen + strlen(replace_name) - strlen(template_name) + plen = tlen + strlen(replace_name) - strlen(template_name) +
strlen(replace_files) - strlen(template_end) + 1; strlen(replace_driver) - strlen(template_driver) + 1;
if (virtType != VIR_DOMAIN_VIRT_LXC)
plen += strlen(replace_files) - strlen(template_end);
if (plen > MAX_FILE_LEN || plen < tlen) { if (plen > MAX_FILE_LEN || plen < tlen) {
vah_error(NULL, 0, _("invalid length for new profile")); vah_error(NULL, 0, _("invalid length for new profile"));
goto clean_replace; goto clean_replace;
...@@ -398,10 +421,14 @@ create_profile(const char *profile, const char *profile_name, ...@@ -398,10 +421,14 @@ create_profile(const char *profile, const char *profile_name,
pcontent[0] = '\0'; pcontent[0] = '\0';
strcpy(pcontent, tcontent); strcpy(pcontent, tcontent);
if (replace_string(pcontent, plen, template_driver, replace_driver) < 0)
goto clean_all;
if (replace_string(pcontent, plen, template_name, replace_name) < 0) if (replace_string(pcontent, plen, template_name, replace_name) < 0)
goto clean_all; goto clean_all;
if (replace_string(pcontent, plen, template_end, replace_files) < 0) if ((virtType != VIR_DOMAIN_VIRT_LXC) &&
replace_string(pcontent, plen, template_end, replace_files) < 0)
goto clean_all; goto clean_all;
/* write the file */ /* write the file */
...@@ -427,6 +454,7 @@ create_profile(const char *profile, const char *profile_name, ...@@ -427,6 +454,7 @@ create_profile(const char *profile, const char *profile_name,
clean_replace: clean_replace:
VIR_FREE(replace_name); VIR_FREE(replace_name);
VIR_FREE(replace_files); VIR_FREE(replace_files);
VIR_FREE(replace_driver);
clean_tcontent: clean_tcontent:
VIR_FREE(tcontent); VIR_FREE(tcontent);
end: end:
...@@ -666,8 +694,8 @@ caps_mockup(vahControl * ctl, const char *xmlStr) ...@@ -666,8 +694,8 @@ caps_mockup(vahControl * ctl, const char *xmlStr)
goto cleanup; goto cleanup;
ctl->hvm = virXPathString("string(./os/type[1])", ctxt); ctl->hvm = virXPathString("string(./os/type[1])", ctxt);
if (!ctl->hvm || STRNEQ(ctl->hvm, "hvm")) { if (!ctl->hvm) {
vah_error(ctl, 0, _("os.type is not 'hvm'")); vah_error(ctl, 0, _("os.type is not defined"));
goto cleanup; goto cleanup;
} }
arch = virXPathString("string(./os/type[1]/@arch)", ctxt); arch = virXPathString("string(./os/type[1]/@arch)", ctxt);
...@@ -1234,18 +1262,20 @@ main(int argc, char **argv) ...@@ -1234,18 +1262,20 @@ main(int argc, char **argv)
if (vah_add_file(&buf, ctl->newfile, "rw") != 0) if (vah_add_file(&buf, ctl->newfile, "rw") != 0)
goto cleanup; goto cleanup;
} else { } else {
virBufferAsprintf(&buf, " \"%s/log/libvirt/**/%s.log\" w,\n", if (ctl->def->virtType == VIR_DOMAIN_VIRT_QEMU) {
LOCALSTATEDIR, ctl->def->name); virBufferAsprintf(&buf, " \"%s/log/libvirt/**/%s.log\" w,\n",
virBufferAsprintf(&buf, " \"%s/lib/libvirt/**/%s.monitor\" rw,\n", LOCALSTATEDIR, ctl->def->name);
LOCALSTATEDIR, ctl->def->name); virBufferAsprintf(&buf, " \"%s/lib/libvirt/**/%s.monitor\" rw,\n",
virBufferAsprintf(&buf, " \"%s/run/libvirt/**/%s.pid\" rwk,\n", LOCALSTATEDIR, ctl->def->name);
LOCALSTATEDIR, ctl->def->name); virBufferAsprintf(&buf, " \"%s/run/libvirt/**/%s.pid\" rwk,\n",
virBufferAsprintf(&buf, " \"/run/libvirt/**/%s.pid\" rwk,\n", LOCALSTATEDIR, ctl->def->name);
ctl->def->name); virBufferAsprintf(&buf, " \"/run/libvirt/**/%s.pid\" rwk,\n",
virBufferAsprintf(&buf, " \"%s/run/libvirt/**/*.tunnelmigrate.dest.%s\" rw,\n", ctl->def->name);
LOCALSTATEDIR, ctl->def->name); virBufferAsprintf(&buf, " \"%s/run/libvirt/**/*.tunnelmigrate.dest.%s\" rw,\n",
virBufferAsprintf(&buf, " \"/run/libvirt/**/*.tunnelmigrate.dest.%s\" rw,\n", LOCALSTATEDIR, ctl->def->name);
ctl->def->name); virBufferAsprintf(&buf, " \"/run/libvirt/**/*.tunnelmigrate.dest.%s\" rw,\n",
ctl->def->name);
}
if (ctl->files) if (ctl->files)
virBufferAdd(&buf, ctl->files, -1); virBufferAdd(&buf, ctl->files, -1);
} }
...@@ -1282,7 +1312,8 @@ main(int argc, char **argv) ...@@ -1282,7 +1312,8 @@ main(int argc, char **argv)
vah_info(ctl->uuid); vah_info(ctl->uuid);
vah_info(tmp); vah_info(tmp);
rc = 0; rc = 0;
} else if ((rc = create_profile(profile, ctl->uuid, tmp)) != 0) { } else if ((rc = create_profile(profile, ctl->uuid, tmp,
ctl->def->virtType)) != 0) {
vah_error(ctl, 0, _("could not create profile")); vah_error(ctl, 0, _("could not create profile"));
unlink(include_file); unlink(include_file);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册