mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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:
1 parent
668ba1f85b
commit
08cffe6696
7 files changed
+79
-21
No files matched your search
@@ -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
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||