From: Ahmad Fatoum <a.fat...@barebox.org>

The enforcement of security policies to be up-to-date and removal of
implicit syncing nudges users into checking in the actual security
policy into version control. To allow the policies to live outside the
barebox tree, introduce CONFIG_SECURITY_POLICY_PATH that takes a
space-separated list of configs.

For now, the option is very strict: All files referenced must be placed
into security/ in the barebox source directory. Different build rules
sharing the same source directory can install their configs with
different names and customize via CONFIG_SECURITY_POLICY_PATH which options
to include.

sconfigpost also supports iterating over directories, but this feature
is left out for now, as it needs more extensive testing to verify that
targets are rebuilt as often as needed and not more.

Signed-off-by: Ahmad Fatoum <a.fat...@pengutronix.de>
---
 security/Kconfig.policy | 15 +++++++++++++++
 security/Makefile       | 37 +++++++++++++++++++++++++++++++++++++
 security/policy.c       |  3 +++
 3 files changed, 55 insertions(+)

diff --git a/security/Kconfig.policy b/security/Kconfig.policy
index 
6c5cb5687c17c5a66f8757191c00d1c3d75a9312..bf938a9f3dd87fc21009f0260f3cf8be7937bd36
 100644
--- a/security/Kconfig.policy
+++ b/security/Kconfig.policy
@@ -80,6 +80,21 @@ config SECURITY_POLICY_DEFAULT_PANIC
 
 endchoice
 
+config SECURITY_POLICY_PATH
+       string
+       depends on SECURITY_POLICY
+       prompt "Paths to additional security policies"
+       help
+         Space separated list of security policies that should be
+         compiled into barebox and registered. This option currently
+         requires each security policy to match security/*.sconfig, i.e.
+         be directly located in the security/ directory of the source
+         source tree and have the .sconfig extension.
+         If left empty, only security policies explicitly provided
+         and registered by board code will be available.
+
+         Absolute paths are disallowed.
+
 config SECURITY_POLICY_NAMES
        bool
 
diff --git a/security/Makefile b/security/Makefile
index 
16b328266a1b35861ee263e8026fc8ebd704aedb..3e92fb776fb2aed36cb79ee267b02c7c279eabce
 100644
--- a/security/Makefile
+++ b/security/Makefile
@@ -8,6 +8,9 @@ obj-pbl-$(CONFIG_HAVE_OPTEE)    += optee.o
 obj-$(CONFIG_BLOBGEN)          += blobgen.o
 obj-$(CONFIG_PASSWORD)         += password.o
 
+# Default password handling
+# ---------------------------------------------------------------------------
+#
 ifdef CONFIG_PASSWORD
 
 ifeq ($(CONFIG_PASSWORD_DEFAULT),"")
@@ -29,3 +32,37 @@ include/generated/passwd.h: FORCE
 
 $(obj)/password.o: include/generated/passwd.h
 endif # CONFIG_PASSWORD
+
+# External security policy handling
+# ---------------------------------------------------------------------------
+
+external-policy := $(foreach p, \
+       $(call remove_quotes,$(CONFIG_SECURITY_POLICY_PATH)), \
+               $(p:security/%=%))
+
+external-policy-tmp := $(addsuffix .tmp,$(external-policy))
+real-external-policy-tmp := $(addprefix $(obj)/,$(external-policy-tmp))
+
+ifneq ($(external-policy),)
+obj-y  += default.sconfig.o
+extra-y        += default.sconfig.c
+always-y += policy-list
+$(foreach p, $(external-policy), \
+       $(if $(findstring /,$p),$(error \
+       CONFIG_SECURITY_POLICY_PATH contains path separators.\
+       $(newline)"$p" must start with security/)))
+$(foreach p, $(external-policy), \
+       $(if $(wildcard $(srctree)/$(src)/$p),,$(error \
+       CONFIG_SECURITY_POLICY_PATH contains non-existent files.\
+       $(newline)"$p" does not exit in $$(srctree)/security)))
+endif
+
+$(obj)/policy-list: $(addprefix $(src)/,$(external-policy)) FORCE
+       $(call if_changed,gen_order_src)
+
+targets += $(external-policy-tmp)
+
+$(obj)/default.sconfig.c: $(real-external-policy-tmp) FORCE
+       +$(Q)$(foreach p, $(real-external-policy-tmp), \
+               $(call noop_cmd,security_checkconfig,$p) ;)
+       $(call if_changed_dep,sconfigpost_c,$(real-external-policy-tmp))
diff --git a/security/policy.c b/security/policy.c
index 
10d6148866ab2eba6cc8ff0d78e99025d83ed3e8..774e64968cbab2d5e63155caacebf0a2d31627da
 100644
--- a/security/policy.c
+++ b/security/policy.c
@@ -238,6 +238,9 @@ static int security_init(void)
        dev_add_param_string(&security_device, "policy", param_set_readonly,
                             security_policy_get_name, &policy_name, NULL);
 
+       if (*CONFIG_SECURITY_POLICY_PATH)
+               security_policy_add(default);
+
        return 0;
 }
 pure_initcall(security_init);

-- 
2.39.5


Reply via email to