[tpm2] Re: System design question

Roberts, William C <william.c.roberts at intel.com> Mon, 22 Aug 2022 16:02:49 +0000
Newsgroups dev.linux.lists.tpm2
Message-ID <[email protected]>
On Mon, 2022-08-22 at 13:08 +0000, Roberts, William C wrote:
> On Sun, 2022-08-21 at 09:17 +0200, Felix Rubio Dalmau wrote:
> > Hi everybody,
> > 
> > I am playing with a QEMU VM that uses swtpm. My goal is to make a
> > stable, easily maintainable setup to have ZFS native full disk
> > encription, and I am facing a problem:
> > 
> > * I was relying on GRUB2 signature-checking capabilities to make
> > sure
> > that, besides the kernel (that is checked by Secure Boot anyway),
> > initramfs had not been tampered with. However, this introduces yet
> > a
> > new (GPG) private key that needs to be stored, initramfs needs to
> > be
> > signed when changed, etc.
> > * Recently I have learned that from kernel 5.10 on, the
> > measurements
> > of initramfs can be found on PCR9, so I modified my PCR-based
> > policy
> > to make use of registers 0,1,7 and 9 and I am planning to remove
> > the
> > GRUB2 checks. But the problem now is: After generating the
> > policies,
> > which I do by....
> > 
> > ```bash
> > # Recreate the PCR-based policy
> > tpm2_startauthsession -S session.ctx
> > tpm2_policypcr -S session.ctx -L regular.policy -l sha256:0,1,7,9
> > tpm2_policypassword -S session.ctx -L regular.policy
> > tpm2_flushcontext session.ctx
> > 
> > # session for auth based on rescue password
> > tpm2_startauthsession -S session.ctx
> > tpm2_policysecret -S session.ctx -L rescue.policy -c o
> > '<tpm_ownerpass>'
> > tpm2_flushcontext session.ctx
> > 
> > # compound both policies using OR
> > tpm2_startauthsession -S session.ctx
> > tpm2_policyor -S session.ctx -L compound.policy
> > sha256:rescue.policy,regular.policy
> > tpm2_flushcontext session.ctx
> > 
> > # create the seal object (the FS password is requested to the user)
> > tpm2_create -C prim.ctx -c key.ctx -u key.pub -r key.priv -L
> > compound.policy -i- -p '<disk_unlock_password>' -a
> > 'fixedtpm|fixedparent'
> > 
> > # persist the object to the TPM
> > tpm2_evictcontrol -c key.ctx 0x81010001 -P '<tpm_ownerpass>'
> > ```
> > 
> > ... then I need to store regular.policy and rescue.policy in
> > initramfs, which will produce a different hash next time.
> > 
> > Therefore, the question is: is there any way I can store the
> > policies
> > in the TPM itself, so that I do not have to rebuild initramfs? Do
> > you
> > guys think this is not the way to go, and there is a better
> > approach?
> > 
> 
> Policy Hashes are stable and can be computed without the use of the
> tpm. 
> You don't really need to save those policy files as they are just the
> hash. Polcies are enforced by ensuring the hash generated on the
> sessoion via policy commands matches the policy field in the public
> portion of the object and that additional state, dependent on the
> policy commands, is also verified (like policy secret password).
> 
> tpm2 policysecret -S s.ctx -co -L policy.dat
> 0d84f55daf6e43ac97966e62c9bb989d3397777d25c5f749868055d65394f952
> 
> xxd -p -c256 policy.dat 
> 0d84f55daf6e43ac97966e62c9bb989d3397777d25c5f749868055d65394f952
> 
> The policy files are just a way to move the digest between tools.
> 
> So really all that needs to occur is the code/script needs to be in
> place that does the normal PCR flow or rescue flow. The create call
> can
> be hardcoded to the known hash, that isn't changing and can be
> included
> in the filesystem when generated. If that doesn;t work we could
> support
> embedding the raw hex hash into the create command as an argument
> rather than a file argument.

FYI I have support for embedding the digest as a hex string value to
the -L policy argument on the various tools here:
  - https://github.com/tpm2-software/tpm2-tools/pull/3117


> 
> > Thank you very much!
> > Felix
> > 
> > _______________________________________________
> > tpm2 mailing list -- tpm2(a)lists.01.org
> > To unsubscribe send an email to tpm2-leave(a)lists.01.org
> > %(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
> _______________________________________________
> tpm2 mailing list -- tpm2(a)lists.01.org
> To unsubscribe send an email to tpm2-leave(a)lists.01.org
> %(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s