Implement construction of apparmor security labels. The choice between selinux and apparmor model isn't exposed to the user, but guessed depending on what the host supports. --- bin/virt-sandbox-service | 15 ++++++++------- libvirt-sandbox/libvirt-sandbox-builder.c | 32 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/bin/virt-sandbox-service b/bin/virt-sandbox-service index 5a3f6ab..7f72107 100755 --- a/bin/virt-sandbox-service +++ b/bin/virt-sandbox-service @@ -315,24 +315,25 @@ class Container: context.undefine() def get_security_model(self): - # XXX selinux is the default for the while, needs to be configurable someday - model = "selinux" - supported = False + model = None # Make sure we have a connection self.connect() # Loop over the security models from the host capabilities + # The first in "selinux" and "apparmor" will be the returned model + # Those two models can't coexist on a machine configCaps = self.conn.get_capabilities() hostCaps = configCaps.get_host() secmodels = hostCaps.get_secmodels() for secmodel in secmodels: - if secmodel.get_model() == model: - supported = True + if secmodel.get_model() == "selinux": + model = "selinux" + break + elif secmodel.get_model() == "apparmor": + model = "apparmor" break - if not supported: - model = None return model diff --git a/libvirt-sandbox/libvirt-sandbox-builder.c b/libvirt-sandbox/libvirt-sandbox-builder.c index 48fc9bc..bcad652 100644 --- a/libvirt-sandbox/libvirt-sandbox-builder.c +++ b/libvirt-sandbox/libvirt-sandbox-builder.c @@ -358,6 +358,31 @@ static gboolean gvir_sandbox_builder_construct_security_selinux (GVirSandboxBuil return TRUE; } +static gboolean gvir_sandbox_builder_construct_security_apparmor(GVirSandboxBuilder *builder, + GVirSandboxConfig *config, + GVirConfigDomain *domain, + GError **error) +{ + GVirConfigDomainSeclabel *sec = gvir_config_domain_seclabel_new(); + const char *label = gvir_sandbox_config_get_security_label(config); + + gvir_config_domain_seclabel_set_model(sec, "apparmor"); + if (gvir_sandbox_config_get_security_dynamic(config)) { + gvir_config_domain_seclabel_set_type(sec, + GVIR_CONFIG_DOMAIN_SECLABEL_DYNAMIC); + } else { + gvir_config_domain_seclabel_set_type(sec, + GVIR_CONFIG_DOMAIN_SECLABEL_STATIC); + if (label) + gvir_config_domain_seclabel_set_label(sec, label); + } + + gvir_config_domain_set_seclabel(domain, sec); + g_object_unref(sec); + + return TRUE; +} + static gboolean gvir_sandbox_builder_construct_security(GVirSandboxBuilder *builder, GVirSandboxConfig *config, const gchar *statedir G_GNUC_UNUSED, @@ -369,6 +394,7 @@ static gboolean gvir_sandbox_builder_construct_security(GVirSandboxBuilder *buil GVirConfigCapabilitiesHost *hostCapabilities; GList *secmodels, *iter; gboolean supportsSelinux = FALSE; + gboolean supportsAppArmor = FALSE; /* What security models are available on the host? */ if (!(configCapabilities = gvir_connection_get_capabilities(connection, error))) { @@ -383,6 +409,9 @@ static gboolean gvir_sandbox_builder_construct_security(GVirSandboxBuilder *buil if (g_str_equal(gvir_config_capabilities_host_secmodel_get_model( GVIR_CONFIG_CAPABILITIES_HOST_SECMODEL(iter->data)), "selinux")) supportsSelinux = TRUE; + if (g_str_equal(gvir_config_capabilities_host_secmodel_get_model( + GVIR_CONFIG_CAPABILITIES_HOST_SECMODEL(iter->data)), "apparmor")) + supportsAppArmor = TRUE; g_object_unref(iter->data); } @@ -394,6 +423,9 @@ static gboolean gvir_sandbox_builder_construct_security(GVirSandboxBuilder *buil if (supportsSelinux) return gvir_sandbox_builder_construct_security_selinux(builder, config, domain, error); + else if (supportsAppArmor) + return gvir_sandbox_builder_construct_security_apparmor(builder, config, + domain, error); return TRUE; } -- 2.1.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list