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