mbox series

[v10,0/8] Enroll kernel keys thru MOK

Message ID 20220126025834.255493-1-eric.snowberg@oracle.com
Headers show
Series Enroll kernel keys thru MOK | expand

Message

Eric Snowberg Jan. 26, 2022, 2:58 a.m. UTC
Back in 2013 Linus requested a feature to allow end-users to have the 
ability "to add their own keys and sign modules they trust". This was
his *second* order outlined here [1]. There have been many attempts 
over the years to solve this problem, all have been rejected.  Many 
of the failed attempts loaded all preboot firmware keys into the kernel,
including the Secure Boot keys. Many distributions carry one of these 
rejected attempts [2], [3], [4]. This series tries to solve this problem 
with a solution that takes into account all the problems brought up in 
the previous attempts.

On UEFI based systems, this series introduces a new Linux kernel keyring 
containing the Machine Owner Keys (MOK) called machine. It also defines
a new MOK variable in shim. This variable allows the end-user to decide 
if they want to load MOK keys into the machine keyring. 

By default, nothing changes; MOK keys are not loaded into the machine
keyring.  They are only loaded after the end-user makes the decision 
themselves.  The end-user would set this through mokutil using a new 
--trust-mok option [5]. This would work similar to how the kernel uses 
MOK variables to enable/disable signature validation as well as use/ignore 
the db. Any kernel operation that uses either the builtin or secondary 
trusted keys as a trust source shall also reference the new machine 
keyring as a trust source.

Secure Boot keys will never be loaded into the machine keyring.  They
will always be loaded into the platform keyring.  If an end-user wanted 
to load one, they would need to enroll it into the MOK.

Unlike previous versions of this patch set, IMA support has been removed
to simplify the series. After acceptance, a follow-on series will add IMA 
support.

Steps required by the end user:

Sign kernel module with user created key:
$ /usr/src/kernels/$(uname -r)/scripts/sign-file sha512 \
   machine_signing_key.priv machine_signing_key.x509 my_module.ko

Import the key into the MOK
$ mokutil --import machine_signing_key.x509

Setup the kernel to load MOK keys into the .machine keyring
$ mokutil --trust-mok

Then reboot, the MokManager will load and ask if you want to trust the
MOK key and enroll the MOK into the MOKList.  Afterwards the signed kernel
module will load.

I have included  a link to the mokutil [5] changes I have made to support 
this new functionality.  The shim changes have now been accepted
upstream [6].

Upstream shim is located here [7], the build instructions are here [8].
TLDR:

$ git clone --recurse-submodules https://github.com/rhboot/shim
$ cd shim
$ make

After building shim, move shimx64.efi and mmx64.efi to the vendor or 
distribution specific directory on your EFI System Partition (assuming
you are building on x86). The instructions above are the minimal
steps needed to build shim to test this feature. It is assumed
Secure Boot shall not be enabled for this testing. To do testing
with Secure Boot enabled, all steps in the build instructions [8]
must be followed.

Instructions for building mokutil (including the new changes):

$ git clone -b mokvars-v3 https://github.com/esnowberg/mokutil.git
$ cd mokutil/
$ ./autogen.sh
$ make

[1] https://marc.info/?l=linux-kernel&m=136185386310140&w=2
[2] https://lore.kernel.org/lkml/1479737095.2487.34.camel@linux.vnet.ibm.com/
[3] https://lore.kernel.org/lkml/1556221605.24945.3.camel@HansenPartnership.com/
[4] https://lore.kernel.org/linux-integrity/1e41f22b1f11784f1e943f32bf62034d4e054cdb.camel@HansenPartnership.com/
[5] https://github.com/esnowberg/mokutil/tree/mokvars-v3
[6] https://github.com/rhboot/shim/commit/4e513405b4f1641710115780d19dcec130c5208f
[7] https://github.com/rhboot/shim
[8] https://github.com/rhboot/shim/blob/main/BUILDING

Eric Snowberg (8):
  integrity: Fix warning about missing prototypes
  integrity: Introduce a Linux keyring called machine
  integrity: add new keyring handler for mok keys
  KEYS: store reference to machine keyring
  KEYS: Introduce link restriction for machine keys
  efi/mokvar: move up init order
  integrity: Trust MOK keys if MokListTrustedRT found
  integrity: Only use machine keyring when uefi_check_trust_mok_keys is
    true

 certs/system_keyring.c                        | 44 ++++++++++-
 drivers/firmware/efi/mokvar-table.c           |  2 +-
 include/keys/system_keyring.h                 | 14 ++++
 security/integrity/Kconfig                    | 13 ++++
 security/integrity/Makefile                   |  1 +
 security/integrity/digsig.c                   | 15 +++-
 security/integrity/integrity.h                | 17 +++-
 .../platform_certs/keyring_handler.c          | 18 ++++-
 .../platform_certs/keyring_handler.h          |  5 ++
 security/integrity/platform_certs/load_uefi.c |  4 +-
 .../platform_certs/machine_keyring.c          | 77 +++++++++++++++++++
 11 files changed, 202 insertions(+), 8 deletions(-)
 create mode 100644 security/integrity/platform_certs/machine_keyring.c


base-commit: e783362eb54cd99b2cac8b3a9aeac942e6f6ac07

Comments

Jarkko Sakkinen Feb. 8, 2022, 9:28 a.m. UTC | #1
On Wed, Jan 26, 2022 at 05:06:09PM -0500, Mimi Zohar wrote:
> Hi Jarkko,
> 
> > > Thank you. I'll pick these soon. Is there any objections?
> 
> No objections.
> > 
> > Mimi brought up that we need a MAINTAINERS update for this and also
> > .platform.
> > 
> > We have these:
> > 
> > - KEYS/KEYRINGS
> > - CERTIFICATE HANDLING
> > 
> > I would put them under KEYRINGS for now and would not consider further
> > subdivision for the moment.
> 
> IMA has dependencies on the platform_certs/ and now on the new .machine
> keyring.  Just adding "F: security/integrity/platform_certs/" to the
> KEYS/KEYRINGS record, ignores that dependency.  The discussion wouldn't
> even be on the linux-integrity mailing list.
> 
> Existing requirement:
> - The keys on the .platform keyring are limited to verifying the kexec
> image.
> 
> New requirements based on Eric Snowbergs' patch set:
> - When IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is enabled,
> the MOK keys will not be loaded directly onto the .machine keyring or
> indirectly onto the .secondary_trusted_keys keyring.
> 
> - Only when a new IMA Kconfig explicitly allows the keys on the
> .machine keyrings, will the CA keys stored in MOK be loaded onto the
> .machine keyring.
> 
> Unfortunately I don't think there is any choice, but to define a new
> MAINTAINERS entry.  Perhaps something along the lines of:
> 
> KEYS/KEYRINGS_INTEGRITY
> M:     Jarkko Sakkinen <jarkko@kernel.org>
> M:     Mimi Zohar <zohar@linux.ibm.com>
> L:      keyrings@vger.kernel.org
> L:      linux-integrity@vger.kernel.org
> F:      security/integrity/platform_certs

WFM. BTW, the patches are now in my tree:

git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git

I can add any tags requested. I'll mirror this at some point to linux-next.

/Jarkko
Mimi Zohar Feb. 8, 2022, 3:26 p.m. UTC | #2
(Updated subject line)

On Tue, 2022-02-08 at 10:28 +0100, Jarkko Sakkinen wrote:
> On Wed, Jan 26, 2022 at 05:06:09PM -0500, Mimi Zohar wrote:

> > > Mimi brought up that we need a MAINTAINERS update for this and also
> > > .platform.
> > > 
> > > We have these:
> > > 
> > > - KEYS/KEYRINGS
> > > - CERTIFICATE HANDLING
> > > 
> > > I would put them under KEYRINGS for now and would not consider further
> > > subdivision for the moment.
> > 
> > IMA has dependencies on the platform_certs/ and now on the new .machine
> > keyring.  Just adding "F: security/integrity/platform_certs/" to the
> > KEYS/KEYRINGS record, ignores that dependency.  The discussion wouldn't
> > even be on the linux-integrity mailing list.
> > 
> > Existing requirement:
> > - The keys on the .platform keyring are limited to verifying the kexec
> > image.
> > 
> > New requirements based on Eric Snowbergs' patch set:
> > - When IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is enabled,
> > the MOK keys will not be loaded directly onto the .machine keyring or
> > indirectly onto the .secondary_trusted_keys keyring.
> > 
> > - Only when a new IMA Kconfig explicitly allows the keys on the
> > .machine keyrings, will the CA keys stored in MOK be loaded onto the
> > .machine keyring.
> > 
> > Unfortunately I don't think there is any choice, but to define a new
> > MAINTAINERS entry.  Perhaps something along the lines of:
> > 
> > KEYS/KEYRINGS_INTEGRITY
> > M:     Jarkko Sakkinen <jarkko@kernel.org>
> > M:     Mimi Zohar <zohar@linux.ibm.com>
> > L:      keyrings@vger.kernel.org
> > L:      linux-integrity@vger.kernel.org
> > F:      security/integrity/platform_certs
> 
> WFM. BTW, the patches are now in my tree:
> 
> git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd.git
> 
> I can add any tags requested. I'll mirror this at some point to linux-next.

Thanks,  Jarkko.
Jarkko Sakkinen Feb. 20, 2022, 7 p.m. UTC | #3
On Wed, Jan 26, 2022 at 05:06:09PM -0500, Mimi Zohar wrote:
> Hi Jarkko,
> 
> > > Thank you. I'll pick these soon. Is there any objections?
> 
> No objections.
> > 
> > Mimi brought up that we need a MAINTAINERS update for this and also
> > .platform.
> > 
> > We have these:
> > 
> > - KEYS/KEYRINGS
> > - CERTIFICATE HANDLING
> > 
> > I would put them under KEYRINGS for now and would not consider further
> > subdivision for the moment.
> 
> IMA has dependencies on the platform_certs/ and now on the new .machine
> keyring.  Just adding "F: security/integrity/platform_certs/" to the
> KEYS/KEYRINGS record, ignores that dependency.  The discussion wouldn't
> even be on the linux-integrity mailing list.
> 
> Existing requirement:
> - The keys on the .platform keyring are limited to verifying the kexec
> image.
> 
> New requirements based on Eric Snowbergs' patch set:
> - When IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is enabled,
> the MOK keys will not be loaded directly onto the .machine keyring or
> indirectly onto the .secondary_trusted_keys keyring.
> 
> - Only when a new IMA Kconfig explicitly allows the keys on the
> .machine keyrings, will the CA keys stored in MOK be loaded onto the
> .machine keyring.
> 
> Unfortunately I don't think there is any choice, but to define a new
> MAINTAINERS entry.  Perhaps something along the lines of:
> 
> KEYS/KEYRINGS_INTEGRITY
> M:     Jarkko Sakkinen <jarkko@kernel.org>
> M:     Mimi Zohar <zohar@linux.ibm.com>
> L:      keyrings@vger.kernel.org
> L:      linux-integrity@vger.kernel.org
> F:      security/integrity/platform_certs
> 
> thanks,
> 
> Mimi

This would work for me.

BR, Jarkko
Mimi Zohar Feb. 22, 2022, 11:59 a.m. UTC | #4
On Sun, 2022-02-20 at 20:00 +0100, Jarkko Sakkinen wrote:
> On Wed, Jan 26, 2022 at 05:06:09PM -0500, Mimi Zohar wrote:

> > > 
> > > Mimi brought up that we need a MAINTAINERS update for this and also
> > > .platform.
> > > 
> > > We have these:
> > > 
> > > - KEYS/KEYRINGS
> > > - CERTIFICATE HANDLING
> > > 
> > > I would put them under KEYRINGS for now and would not consider further
> > > subdivision for the moment.
> > 
> > IMA has dependencies on the platform_certs/ and now on the new .machine
> > keyring.  Just adding "F: security/integrity/platform_certs/" to the
> > KEYS/KEYRINGS record, ignores that dependency.  The discussion wouldn't
> > even be on the linux-integrity mailing list.
> > 
> > Existing requirement:
> > - The keys on the .platform keyring are limited to verifying the kexec
> > image.
> > 
> > New requirements based on Eric Snowbergs' patch set:
> > - When IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is enabled,
> > the MOK keys will not be loaded directly onto the .machine keyring or
> > indirectly onto the .secondary_trusted_keys keyring.
> > 
> > - Only when a new IMA Kconfig explicitly allows the keys on the
> > .machine keyrings, will the CA keys stored in MOK be loaded onto the
> > .machine keyring.
> > 
> > Unfortunately I don't think there is any choice, but to define a new
> > MAINTAINERS entry.  Perhaps something along the lines of:
> > 
> > KEYS/KEYRINGS_INTEGRITY
> > M:     Jarkko Sakkinen <jarkko@kernel.org>
> > M:     Mimi Zohar <zohar@linux.ibm.com>
> > L:      keyrings@vger.kernel.org
> > L:      linux-integrity@vger.kernel.org
> > F:      security/integrity/platform_certs
> > 
> 
> This would work for me.

Thanks, Jarkko.  Are you planning on upstreaming this change, as you
previously said, or would you prefer I do it?

thanks,

Mimi
Jarkko Sakkinen Feb. 22, 2022, 12:26 p.m. UTC | #5
On Tue, Feb 22, 2022 at 06:59:25AM -0500, Mimi Zohar wrote:
> On Sun, 2022-02-20 at 20:00 +0100, Jarkko Sakkinen wrote:
> > On Wed, Jan 26, 2022 at 05:06:09PM -0500, Mimi Zohar wrote:
> 
> > > > 
> > > > Mimi brought up that we need a MAINTAINERS update for this and also
> > > > .platform.
> > > > 
> > > > We have these:
> > > > 
> > > > - KEYS/KEYRINGS
> > > > - CERTIFICATE HANDLING
> > > > 
> > > > I would put them under KEYRINGS for now and would not consider further
> > > > subdivision for the moment.
> > > 
> > > IMA has dependencies on the platform_certs/ and now on the new .machine
> > > keyring.  Just adding "F: security/integrity/platform_certs/" to the
> > > KEYS/KEYRINGS record, ignores that dependency.  The discussion wouldn't
> > > even be on the linux-integrity mailing list.
> > > 
> > > Existing requirement:
> > > - The keys on the .platform keyring are limited to verifying the kexec
> > > image.
> > > 
> > > New requirements based on Eric Snowbergs' patch set:
> > > - When IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is enabled,
> > > the MOK keys will not be loaded directly onto the .machine keyring or
> > > indirectly onto the .secondary_trusted_keys keyring.
> > > 
> > > - Only when a new IMA Kconfig explicitly allows the keys on the
> > > .machine keyrings, will the CA keys stored in MOK be loaded onto the
> > > .machine keyring.
> > > 
> > > Unfortunately I don't think there is any choice, but to define a new
> > > MAINTAINERS entry.  Perhaps something along the lines of:
> > > 
> > > KEYS/KEYRINGS_INTEGRITY
> > > M:     Jarkko Sakkinen <jarkko@kernel.org>
> > > M:     Mimi Zohar <zohar@linux.ibm.com>
> > > L:      keyrings@vger.kernel.org
> > > L:      linux-integrity@vger.kernel.org
> > > F:      security/integrity/platform_certs
> > > 
> > 
> > This would work for me.
> 
> Thanks, Jarkko.  Are you planning on upstreaming this change, as you
> previously said, or would you prefer I do it?
> 
> thanks,
> 
> Mimi

This is the problem I'm encountering:

https://lore.kernel.org/keyrings/YhLNYxBTbKW62vtC@iki.fi/

BR, Jarkko
Mimi Zohar Feb. 22, 2022, 12:32 p.m. UTC | #6
On Tue, 2022-02-22 at 13:26 +0100, Jarkko Sakkinen wrote:
> On Tue, Feb 22, 2022 at 06:59:25AM -0500, Mimi Zohar wrote:
> > On Sun, 2022-02-20 at 20:00 +0100, Jarkko Sakkinen wrote:
> > > On Wed, Jan 26, 2022 at 05:06:09PM -0500, Mimi Zohar wrote:
> > 
> > > > > 
> > > > > Mimi brought up that we need a MAINTAINERS update for this and also
> > > > > .platform.
> > > > > 
> > > > > We have these:
> > > > > 
> > > > > - KEYS/KEYRINGS
> > > > > - CERTIFICATE HANDLING
> > > > > 
> > > > > I would put them under KEYRINGS for now and would not consider further
> > > > > subdivision for the moment.
> > > > 
> > > > IMA has dependencies on the platform_certs/ and now on the new .machine
> > > > keyring.  Just adding "F: security/integrity/platform_certs/" to the
> > > > KEYS/KEYRINGS record, ignores that dependency.  The discussion wouldn't
> > > > even be on the linux-integrity mailing list.
> > > > 
> > > > Existing requirement:
> > > > - The keys on the .platform keyring are limited to verifying the kexec
> > > > image.
> > > > 
> > > > New requirements based on Eric Snowbergs' patch set:
> > > > - When IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is enabled,
> > > > the MOK keys will not be loaded directly onto the .machine keyring or
> > > > indirectly onto the .secondary_trusted_keys keyring.
> > > > 
> > > > - Only when a new IMA Kconfig explicitly allows the keys on the
> > > > .machine keyrings, will the CA keys stored in MOK be loaded onto the
> > > > .machine keyring.
> > > > 
> > > > Unfortunately I don't think there is any choice, but to define a new
> > > > MAINTAINERS entry.  Perhaps something along the lines of:
> > > > 
> > > > KEYS/KEYRINGS_INTEGRITY
> > > > M:     Jarkko Sakkinen <jarkko@kernel.org>
> > > > M:     Mimi Zohar <zohar@linux.ibm.com>
> > > > L:      keyrings@vger.kernel.org
> > > > L:      linux-integrity@vger.kernel.org
> > > > F:      security/integrity/platform_certs
> > > > 
> > > 
> > > This would work for me.
> > 
> > Thanks, Jarkko.  Are you planning on upstreaming this change, as you
> > previously said, or would you prefer I do it?
> > 
> This is the problem I'm encountering:
> 
> https://lore.kernel.org/keyrings/YhLNYxBTbKW62vtC@iki.fi/

That's the answer to a different question. :)  I was asking about the
MAINTAINERS record.
Mimi Zohar Feb. 22, 2022, 1:43 p.m. UTC | #7
On Tue, 2022-02-22 at 13:26 +0100, Jarkko Sakkinen wrote:
> This is the problem I'm encountering:
> 
> https://lore.kernel.org/keyrings/YhLNYxBTbKW62vtC@iki.fi/

Try using the Message-Id: <
20220126025834.255493-1-eric.snowberg@oracle.com>
Jarkko Sakkinen Feb. 23, 2022, 3:32 p.m. UTC | #8
On Tue, Feb 22, 2022 at 07:32:20AM -0500, Mimi Zohar wrote:
> On Tue, 2022-02-22 at 13:26 +0100, Jarkko Sakkinen wrote:
> > On Tue, Feb 22, 2022 at 06:59:25AM -0500, Mimi Zohar wrote:
> > > On Sun, 2022-02-20 at 20:00 +0100, Jarkko Sakkinen wrote:
> > > > On Wed, Jan 26, 2022 at 05:06:09PM -0500, Mimi Zohar wrote:
> > > 
> > > > > > 
> > > > > > Mimi brought up that we need a MAINTAINERS update for this and also
> > > > > > .platform.
> > > > > > 
> > > > > > We have these:
> > > > > > 
> > > > > > - KEYS/KEYRINGS
> > > > > > - CERTIFICATE HANDLING
> > > > > > 
> > > > > > I would put them under KEYRINGS for now and would not consider further
> > > > > > subdivision for the moment.
> > > > > 
> > > > > IMA has dependencies on the platform_certs/ and now on the new .machine
> > > > > keyring.  Just adding "F: security/integrity/platform_certs/" to the
> > > > > KEYS/KEYRINGS record, ignores that dependency.  The discussion wouldn't
> > > > > even be on the linux-integrity mailing list.
> > > > > 
> > > > > Existing requirement:
> > > > > - The keys on the .platform keyring are limited to verifying the kexec
> > > > > image.
> > > > > 
> > > > > New requirements based on Eric Snowbergs' patch set:
> > > > > - When IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY is enabled,
> > > > > the MOK keys will not be loaded directly onto the .machine keyring or
> > > > > indirectly onto the .secondary_trusted_keys keyring.
> > > > > 
> > > > > - Only when a new IMA Kconfig explicitly allows the keys on the
> > > > > .machine keyrings, will the CA keys stored in MOK be loaded onto the
> > > > > .machine keyring.
> > > > > 
> > > > > Unfortunately I don't think there is any choice, but to define a new
> > > > > MAINTAINERS entry.  Perhaps something along the lines of:
> > > > > 
> > > > > KEYS/KEYRINGS_INTEGRITY
> > > > > M:     Jarkko Sakkinen <jarkko@kernel.org>
> > > > > M:     Mimi Zohar <zohar@linux.ibm.com>
> > > > > L:      keyrings@vger.kernel.org
> > > > > L:      linux-integrity@vger.kernel.org
> > > > > F:      security/integrity/platform_certs
> > > > > 
> > > > 
> > > > This would work for me.
> > > 
> > > Thanks, Jarkko.  Are you planning on upstreaming this change, as you
> > > previously said, or would you prefer I do it?
> > > 
> > This is the problem I'm encountering:
> > 
> > https://lore.kernel.org/keyrings/YhLNYxBTbKW62vtC@iki.fi/
> 
> That's the answer to a different question. :)  I was asking about the
> MAINTAINERS record.

Aaaaa... sorry! Yeah, please do it :-)

BR, Jarkko
Jarkko Sakkinen Feb. 23, 2022, 3:33 p.m. UTC | #9
On Tue, Feb 22, 2022 at 08:43:18AM -0500, Mimi Zohar wrote:
> On Tue, 2022-02-22 at 13:26 +0100, Jarkko Sakkinen wrote:
> > This is the problem I'm encountering:
> > 
> > https://lore.kernel.org/keyrings/YhLNYxBTbKW62vtC@iki.fi/
> 
> Try using the Message-Id: <
> 20220126025834.255493-1-eric.snowberg@oracle.com>
> 
> -- 
> thanks,
> 
> Mimi

OK, now the patch set is fully applied. Thank you Mimi, and Eric, apologies
for the confusion.

BR, Jarkko