[PATCH RFC 07/17] security: policy: support externally provided configs
Ahmad Fatoum
a.fatoum at pengutronix.de
Thu Aug 14 06:06:52 PDT 2025
From: Ahmad Fatoum <a.fatoum at 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.fatoum at pengutronix.de>
---
security/Kconfig.policy | 15 +++++++++++++++
security/Makefile | 36 ++++++++++++++++++++++++++++++++++++
security/policy.c | 3 +++
3 files changed, 54 insertions(+)
diff --git a/security/Kconfig.policy b/security/Kconfig.policy
index 6c5cb5687c17..36875ea198d1 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 security policies to have the .sconfig extension
+ and be located in the barebox source tree's security/
+ directory.
+ 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 16b328266a1b..c7896ed74fb3 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,36 @@ 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)
+
+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 be a file name relative to 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 10d6148866ab..774e64968cba 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
More information about the barebox
mailing list