|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] flask: create unified "flask=" boot parameter
This unifies the flask_enforcing and flask_enabled boot parameters into
a single parameter with additional states. Defined options are:
force - require policy to be loaded at boot time and enforce it
late - bootloader policy is not used; later loadpolicy is enforcing
permissive - a missing or broken policy does not panic
disabled - revert to dummy (no XSM) policy. Was flask_enabled=0
The default mode remains "permissive" and the flask_enforcing boot
parameter is retained for compatibility. If flask_enforcing=1 is
specified and flask= is not, the bootloader policy will be loaded in
enforcing mode if present, but errors will disable access controls until
a successful loadpolicy instead of causing a panic at boot.
Suggested-by: Julien Grall <julien.grall@xxxxxxxxxx>
Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
docs/man/xl.pod.1 | 4 ++--
docs/misc/xsm-flask.txt | 48 +++++++++++++++++++---------------------
xen/xsm/flask/flask_op.c | 34 ++++++++++++++++++++++++----
xen/xsm/flask/hooks.c | 22 ++++++++++--------
xen/xsm/flask/include/security.h | 8 ++++++-
5 files changed, 75 insertions(+), 41 deletions(-)
diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 6b89ba8..48b8f98 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -1441,8 +1441,8 @@ Determine if the FLASK security module is loaded and
enforcing its policy.
=item B<setenforce> I<1|0|Enforcing|Permissive>
Enable or disable enforcing of the FLASK access controls. The default is
-permissive and can be changed using the flask_enforcing option on the
-hypervisor's command line.
+permissive, but this can be changed to enforcing by specifying
"flask=enforcing"
+or "flask=late" on the hypervisor's command line.
=item B<loadpolicy> I<policy-file>
diff --git a/docs/misc/xsm-flask.txt b/docs/misc/xsm-flask.txt
index 9559028..efe8d50 100644
--- a/docs/misc/xsm-flask.txt
+++ b/docs/misc/xsm-flask.txt
@@ -400,28 +400,26 @@ may require multiple passes to find all required ranges.
Additional notes on XSM:FLASK
-----------------------------
-1) xen command line parameters
-
- a) flask_enforcing
-
- The default value for flask_enforcing is '0'. This parameter causes
the
- platform to boot in permissive mode which means that the policy is
loaded
- but not enforced. This mode is often helpful for developing new
systems
- and policies as the policy violations are reported on the xen console
and
- may be viewed in dom0 through 'xl dmesg'.
-
- To boot the platform into enforcing mode, which means that the policy is
- loaded and enforced, append 'flask_enforcing=1' on the grub line.
-
- This parameter may also be changed through the flask hypercall.
-
- b) flask_enabled
-
- The default value for flask_enabled is '1'. This parameter causes the
- platform to enable the FLASK security module under the XSM framework.
- The parameter may be enabled/disabled only once per boot. If the
parameter
- is set to '0', only a reboot can re-enable flask. When flask_enabled
is '0'
- the DUMMY module is enforced.
-
- This parameter may also be changed through the flask hypercall. But may
- only be performed once per boot.
+The xen command line accepts these values for the "flask=" parameter:
+
+ * permissive [default]
+ This is intended for development and is not suitable for use 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".
+ * force or enforcing
+ This requires a security policy to be provided by the bootloader and will
+ enable enforcing prior to the creation of domain 0. If a valid policy is
+ not provided, the hypervisor will not continue booting.
+ * late
+ This disabled 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" or similar commands. Once a
+ policy is loaded, FLASK will run in enforcing mode unless "xl setenforce"
+ has disabled this.
+ * 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 be used to
+ switch to this mode after boot, but there is no way to re-enable FLASK
+ once the dummy module is loaded.
diff --git a/xen/xsm/flask/flask_op.c b/xen/xsm/flask/flask_op.c
index 0e89360..8db9b1e 100644
--- a/xen/xsm/flask/flask_op.c
+++ b/xen/xsm/flask/flask_op.c
@@ -24,11 +24,12 @@
#define _copy_to_guest copy_to_guest
#define _copy_from_guest copy_from_guest
-int flask_enforcing = 0;
-integer_param("flask_enforcing", flask_enforcing);
+int __read_mostly flask_bootparam = FLASK_BOOTPARAM_DEFAULT;
+static void parse_flask_param(char *s);
+custom_param("flask", parse_flask_param);
-int flask_enabled = 1;
-integer_param("flask_enabled", flask_enabled);
+int __read_mostly flask_enforcing = 0;
+integer_param("flask_enforcing", flask_enforcing);
#define MAX_POLICY_SIZE 0x4000000
@@ -60,6 +61,26 @@ extern int ss_initialized;
extern struct xsm_operations *original_ops;
+static void __init parse_flask_param(char *s)
+{
+ if ( !strcmp(s, "force") || !strcmp(s, "enforcing") )
+ {
+ flask_enforcing = 1;
+ flask_bootparam = FLASK_BOOTPARAM_FORCE;
+ }
+ else if ( !strcmp(s, "late") )
+ {
+ flask_enforcing = 1;
+ flask_bootparam = FLASK_BOOTPARAM_LATELOAD;
+ }
+ else if ( !strcmp(s, "disabled") )
+ flask_bootparam = FLASK_BOOTPARAM_DISABLED;
+ else if ( !strcmp(s, "permissive") )
+ flask_bootparam = FLASK_BOOTPARAM_PERMISSIVE;
+ else
+ panic("Invalid value specified for flask= boot parameter");
+}
+
static int domain_has_security(struct domain *d, u32 perms)
{
struct domain_security_struct *dsec;
@@ -502,6 +523,7 @@ static int flask_security_load(struct xen_flask_load *load)
{
int ret;
void *buf = NULL;
+ bool_t is_reload = ss_initialized;
ret = domain_has_security(current->domain, SECURITY__LOAD_POLICY);
if ( ret )
@@ -526,6 +548,10 @@ static int flask_security_load(struct xen_flask_load *load)
if ( ret )
goto out;
+ if ( !is_reload )
+ printk(XENLOG_INFO "Flask: Policy loaded, continuing in %s mode.\n",
+ flask_enforcing ? "enforcing" : "permissive");
+
xfree(bool_pending_values);
bool_pending_values = NULL;
ret = 0;
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index dad5deb..00c8843 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -1628,28 +1628,32 @@ static struct xsm_operations flask_ops = {
static __init void flask_init(void)
{
- int ret = 0;
+ int ret = -ENOENT;
- if ( !flask_enabled )
+ if ( flask_bootparam == FLASK_BOOTPARAM_DISABLED )
{
- printk("Flask: Disabled at boot.\n");
+ printk(XENLOG_INFO "Flask: Disabled at boot.\n");
return;
}
- printk("Flask: Initializing.\n");
-
avc_init();
original_ops = xsm_ops;
if ( register_xsm(&flask_ops) )
panic("Flask: Unable to register with XSM");
- ret = security_load_policy(policy_buffer, policy_size);
+ if ( policy_size && flask_bootparam != FLASK_BOOTPARAM_LATELOAD )
+ ret = security_load_policy(policy_buffer, policy_size);
+
+ if ( ret && flask_bootparam == FLASK_BOOTPARAM_FORCE )
+ panic("Unable to load FLASK policy");
- if ( flask_enforcing )
- printk("Flask: Starting in enforcing mode.\n");
+ if ( ret )
+ printk(XENLOG_INFO "Flask: Access controls disabled until policy is
loaded.\n");
+ else if ( flask_enforcing )
+ printk(XENLOG_INFO "Flask: Starting in enforcing mode.\n");
else
- printk("Flask: Starting in permissive mode.\n");
+ printk(XENLOG_INFO "Flask: Starting in permissive mode.\n");
}
xsm_initcall(flask_init);
diff --git a/xen/xsm/flask/include/security.h b/xen/xsm/flask/include/security.h
index dea0143..bd2a4bc 100644
--- a/xen/xsm/flask/include/security.h
+++ b/xen/xsm/flask/include/security.h
@@ -35,7 +35,13 @@
#define POLICYDB_VERSION_MIN POLICYDB_VERSION_BASE
#define POLICYDB_VERSION_MAX POLICYDB_VERSION_BOUNDARY
-extern int flask_enabled;
+#define FLASK_BOOTPARAM_DEFAULT 0
+#define FLASK_BOOTPARAM_PERMISSIVE 0
+#define FLASK_BOOTPARAM_FORCE 1
+#define FLASK_BOOTPARAM_LATELOAD 2
+#define FLASK_BOOTPARAM_DISABLED 3
+
+extern int flask_bootparam;
extern int flask_mls_enabled;
int security_load_policy(void * data, size_t len);
--
2.1.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |