On Mon, Jun 10, 2019 at 04:33:57PM -0400, Nayna Jain wrote: > PowerNV secure boot relies on the kernel IMA security subsystem to > perform the OS kernel image signature verification. Since each secure > boot mode has different IMA policy requirements, dynamic definition of > the policy rules based on the runtime secure boot mode of the system is > required. On systems that support secure boot, but have it disabled, > only measurement policy rules of the kernel image and modules are > defined. > > This patch defines the arch-specific implementation to retrieve the > secure boot mode of the system and accordingly configures the IMA policy > rules. > > This patch provides arch-specific IMA policies if PPC_SECURE_BOOT > config is enabled. > > Signed-off-by: Nayna Jain <na...@linux.ibm.com> > --- > arch/powerpc/Kconfig | 14 +++++++++ > arch/powerpc/kernel/Makefile | 1 + > arch/powerpc/kernel/ima_arch.c | 54 ++++++++++++++++++++++++++++++++++ > include/linux/ima.h | 3 +- > 4 files changed, 71 insertions(+), 1 deletion(-) > create mode 100644 arch/powerpc/kernel/ima_arch.c
Hi, This series failed to build against linuxppc/merge tree with `ppc64le_defconfig`, arch/powerpc/platforms/powernv/secboot.c:14:6: error: redefinition of 'get_powerpc_sb_mode' 14 | bool get_powerpc_sb_mode(void) | ^~~~~~~~~~~~~~~~~~~ In file included from arch/powerpc/platforms/powernv/secboot.c:11: ./arch/powerpc/include/asm/secboot.h:15:20: note: previous definition of 'get_powerpc_sb_mode' was here 15 | static inline bool get_powerpc_sb_mode(void) | ^~~~~~~~~~~~~~~~~~~ make[3]: *** [scripts/Makefile.build:278: arch/powerpc/platforms/powernv/secboot.o] Error 1 make[3]: *** Waiting for unfinished jobs.... make[2]: *** [scripts/Makefile.build:489: arch/powerpc/platforms/powernv] Error 2 make[1]: *** [scripts/Makefile.build:489: arch/powerpc/platforms] Error 2 make: *** [Makefile:1071: arch/powerpc] Error 2 make: *** Waiting for unfinished jobs.... Regards, -Satheesh > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index 8c1c636308c8..9de77bb14f54 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -902,6 +902,20 @@ config PPC_MEM_KEYS > > If unsure, say y. > > +config PPC_SECURE_BOOT > + prompt "Enable PowerPC Secure Boot" > + bool > + default n > + depends on PPC64 > + depends on OPAL_SECVAR > + depends on IMA > + depends on IMA_ARCH_POLICY > + help > + Linux on POWER with firmware secure boot enabled needs to define > + security policies to extend secure boot to the OS.This config > + allows user to enable OS Secure Boot on PowerPC systems that > + have firmware secure boot support. > + > endmenu > > config ISA_DMA_API > diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile > index 0ea6c4aa3a20..75c929b41341 100644 > --- a/arch/powerpc/kernel/Makefile > +++ b/arch/powerpc/kernel/Makefile > @@ -131,6 +131,7 @@ ifdef CONFIG_IMA > obj-y += ima_kexec.o > endif > endif > +obj-$(CONFIG_PPC_SECURE_BOOT) += ima_arch.o > > obj-$(CONFIG_AUDIT) += audit.o > obj64-$(CONFIG_AUDIT) += compat_audit.o > diff --git a/arch/powerpc/kernel/ima_arch.c b/arch/powerpc/kernel/ima_arch.c > new file mode 100644 > index 000000000000..1767bf6e6550 > --- /dev/null > +++ b/arch/powerpc/kernel/ima_arch.c > @@ -0,0 +1,54 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2019 IBM Corporation > + * Author: Nayna Jain <na...@linux.ibm.com> > + * > + * ima_arch.c > + * - initialize ima policies for PowerPC Secure Boot > + */ > + > +#include <linux/ima.h> > +#include <asm/secboot.h> > + > +bool arch_ima_get_secureboot(void) > +{ > + bool sb_mode; > + > + sb_mode = get_powerpc_sb_mode(); > + if (sb_mode) > + return true; > + else > + return false; > +} > + > +/* > + * File signature verification is not needed, include only measurements > + */ > +static const char *const default_arch_rules[] = { > + "measure func=KEXEC_KERNEL_CHECK template=ima-modsig", > + "measure func=MODULE_CHECK template=ima-modsig", > + NULL > +}; > + > +/* Both file signature verification and measurements are needed */ > +static const char *const sb_arch_rules[] = { > + "measure func=KEXEC_KERNEL_CHECK template=ima-modsig", > + "measure func=MODULE_CHECK template=ima-modsig", > + "appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig|modsig > template=ima-modsig", > +#if !IS_ENABLED(CONFIG_MODULE_SIG) > + "appraise func=MODULE_CHECK appraise_type=imasig|modsig > template=ima-modsig", > +#endif > + NULL > +}; > + > +/* > + * On PowerPC, file measurements are to be added to the IMA measurement list > + * irrespective of the secure boot state of the system. Signature > verification > + * is conditionally enabled based on the secure boot state. > + */ > +const char *const *arch_get_ima_policy(void) > +{ > + if (IS_ENABLED(CONFIG_IMA_ARCH_POLICY) && arch_ima_get_secureboot()) > + return sb_arch_rules; > + return default_arch_rules; > +} > diff --git a/include/linux/ima.h b/include/linux/ima.h > index fd9f7cf4cdf5..a01df076ecae 100644 > --- a/include/linux/ima.h > +++ b/include/linux/ima.h > @@ -31,7 +31,8 @@ extern void ima_post_path_mknod(struct dentry *dentry); > extern void ima_add_kexec_buffer(struct kimage *image); > #endif > > -#if (defined(CONFIG_X86) && defined(CONFIG_EFI)) || defined(CONFIG_S390) > +#if (defined(CONFIG_X86) && defined(CONFIG_EFI)) || defined(CONFIG_S390) \ > + || defined(CONFIG_PPC_SECURE_BOOT) > extern bool arch_ima_get_secureboot(void); > extern const char * const *arch_get_ima_policy(void); > #else > -- > 2.20.1 >