xsm: add a default policy to .init.data

This adds a Kconfig option and support for including the XSM policy from
tools/flask/policy in the hypervisor so that the bootloader does not
need to provide a policy to get sane behavior from an XSM-enabled
hypervisor.  The policy provided by the bootloader, if present, will
override the built-in policy.

Enabling this option only builds the policy if checkpolicy is available
during compilation of the hypervisor; otherwise, it does nothing.  The
XSM policy is not moved out of tools because that remains the primary
location for installing and configuring the policy.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reviewed-by: Doug Goldstein <cardoe@cardoe.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Julien Grall <julien.grall@arm.com>
This commit is contained in:
Daniel De Graaf authored and Andrew Cooper committed 2016-06-24 15:53:22 +01:00
1 parent 668ba1f85b
commit 08cffe6696
7 files changed
+79 -21

No files matched your search

+9 -7
View File
@@ -712,13 +712,15 @@ enabled by running either:
with untrusted guests. If a policy is provided by the bootloader, it will be
loaded; errors will be reported to the ring buffer but will not prevent
booting. The policy can be changed to enforcing mode using "xl setenforce".
* `enforcing`: This requires a security policy to be provided by the bootloader
and will enter enforcing mode prior to the creation of domain 0. If a valid
policy is not provided, the hypervisor will not continue booting.
* `late`: This disables loading of the security policy from the bootloader.
FLASK will be enabled but will not enforce access controls until a policy is
loaded by a domain using "xl loadpolicy". Once a policy is loaded, FLASK will
run in enforcing mode unless "xl setenforce" has changed that setting.
* `enforcing`: This will cause the security server to enter enforcing mode prior
to the creation of domain 0. If an valid policy is not provided by the
bootloader and no built-in policy is present, the hypervisor will not continue
booting.
* `late`: This disables loading of the built-in security policy or the policy
provided by the bootloader. FLASK will be enabled but will not enforce access
controls until a policy is loaded by a domain using "xl loadpolicy". Once a
policy is loaded, FLASK will run in enforcing mode unless "xl setenforce" has
changed that setting.
* `disabled`: This causes the XSM framework to revert to the dummy module. The
dummy module provides the same security policy as is used when compiling the
hypervisor without support for XSM. The xsm\_op hypercall can also be used to
+13 -13
View File
@@ -141,21 +141,21 @@ only type enforcement is used and the user and role are set to system_u and
system_r for all domains.
The FLASK security framework is mostly configured using a security policy file.
This policy file is not normally generated during the Xen build process because
it relies on the SELinux compiler "checkpolicy"; run
It relies on the SELinux compiler "checkpolicy"; if this is available, the
policy will be compiled as part of the tools build. If hypervisor support for a
built-in policy is enabled ("Compile Xen with a built-in security policy"), the
policy will be built during the hypervisor build.
make -C tools/flask/policy
The policy is generated from definition files in tools/flask/policy. Most
changes to security policy will involve creating or modifying modules found in
tools/flask/policy/modules/. The modules.conf file there defines what modules
are enabled and has short descriptions of each module.
to compile the example policy included with Xen. The policy is generated from
definition files under this directory. Most changes to security policy will
involve creating or modifying modules found in tools/flask/policy/modules/. The
modules.conf file there defines what modules are enabled and has short
descriptions of each module.
The XSM policy file needs to be copied to /boot and loaded as a module by grub.
The exact position of the module does not matter as long as it is after the Xen
kernel; it is normally placed either just above the dom0 kernel or at the end.
Once dom0 is running, the policy can be reloaded using "xl loadpolicy".
If not using the built-in policy, the XSM policy file needs to be copied to
/boot and loaded as a module by grub. The exact position and filename of the
module does not matter as long as it is after the Xen kernel; it is normally
placed either just above the dom0 kernel or at the end. Once dom0 is running,
the policy can be reloaded using "xl loadpolicy".
The example policy included with Xen demonstrates most of the features of FLASK
that can be used without dom0 disaggregation. The main types for domUs are:
+4
View File
@@ -155,6 +155,10 @@ SECTIONS
*(.init.data.rel)
*(.init.data.rel.*)
__xsm_init_policy_start = .;
*(.init.xsm_policy)
__xsm_init_policy_end = .;
. = ALIGN(8);
__ctors_start = .;
*(.init_array)
+5
View File
@@ -167,6 +167,11 @@ SECTIONS
*(.init.data)
*(.init.data.rel)
*(.init.data.rel.*)
__xsm_init_policy_start = .;
*(.init.xsm_policy)
__xsm_init_policy_end = .;
. = ALIGN(4);
__trampoline_rel_start = .;
*(.trampoline_rel)
+17
View File
@@ -143,6 +143,23 @@ config FLASK_AVC_STATS
If unsure, say Y.
config XSM_POLICY
bool "Compile Xen with a built-in security policy"
default y
depends on XSM
---help---
This includes a default XSM policy in the hypervisor so that the
bootloader does not need to load a policy to get sane behavior from an
XSM-enabled hypervisor. If this is disabled, a policy must be
provided by the bootloader or by Domain 0. Even if this is enabled, a
policy provided by the bootloader will override it.
This requires that the SELinux policy compiler (checkpolicy) be
available when compiling the hypervisor; if this tool is not found, no
policy will be added.
If unsure, say Y.
# Enable schedulers
menu "Schedulers"
visible if EXPERT = "y"
+17
View File
@@ -27,6 +27,23 @@ $(FLASK_H_FILES): $(FLASK_H_DEPEND)
$(AV_H_FILES): $(AV_H_DEPEND)
$(CONFIG_SHELL) policy/mkaccess_vector.sh $(AWK) $(AV_H_DEPEND)
ifeq ($(CONFIG_XSM_POLICY),y)
HAS_CHECKPOLICY := $(shell checkpolicy -h 2>&1 | grep -q xen && echo y || echo n)
obj-$(HAS_CHECKPOLICY) += policy.o
endif
LDFLAGS += --accept-unknown-input-arch
POLICY_SRC := $(XEN_ROOT)/tools/flask/policy/xenpolicy-$(XEN_FULLVERSION)
policy.bin: FORCE
$(MAKE) -C $(XEN_ROOT)/tools/flask/policy
cmp -s $(POLICY_SRC) $@ || cp $(POLICY_SRC) $@
policy.o: policy.bin
$(OBJCOPY) -S -I binary -O elf64-little --rename-section=.data=.init.xsm_policy $< $@
.PHONY: clean
clean::
rm -f $(ALL_H_FILES) *.o $(DEPS)
+14 -1
View File
@@ -36,6 +36,17 @@ static inline int verify(struct xsm_operations *ops)
return 0;
}
extern char __xsm_init_policy_start[], __xsm_init_policy_end[];
static void __init xsm_policy_init(void)
{
if ( policy_size == 0 && __xsm_init_policy_end != __xsm_init_policy_start )
{
policy_buffer = __xsm_init_policy_start;
policy_size = __xsm_init_policy_end - __xsm_init_policy_start;
}
}
static int __init xsm_core_init(void)
{
if ( verify(&dummy_xsm_ops) )
@@ -46,6 +57,7 @@ static int __init xsm_core_init(void)
}
xsm_ops = &dummy_xsm_ops;
xsm_policy_init();
flask_init();
return 0;
@@ -98,7 +110,8 @@ int __init xsm_dt_init(void)
ret = xsm_core_init();
xfree(policy_buffer);
if ( policy_buffer != __xsm_init_policy_start )
xfree(policy_buffer);
return ret;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.