[systemd-devel] Fedora 38 and signed PCR binding
Aleksandar Kostadinov
akostadi at redhat.com
Sat Feb 10 20:35:42 UTC 2024
And one strange thing --tpm2-public-key-pcrs=11 doesn't seem to change
how TMP is enrolled:
$ sudo systemd-cryptenroll --wipe-slot=tpm2 --tpm2-device=auto
--tpm2-pcrs="" /dev/sda3
🔐 Please enter current passphrase for disk /dev/sda3: ***
This PCR set is already enrolled, executing no operation.
$ sudo systemd-cryptenroll --wipe-slot=tpm2 --tpm2-pcrs=""
--tpm2-device=auto --tpm2-public-key-pcrs=11 /dev/sda3
🔐 Please enter current passphrase for disk /dev/sda3: ***
This PCR set is already enrolled, executing no operation.
On Sat, Feb 10, 2024 at 10:23 PM Aleksandar Kostadinov
<akostadi at redhat.com> wrote:
>
> Thanks a lot for the answers. Because without them I have no clue how
> to progress. I'd highly appreciate your further guidance!
>
> On Fri, Nov 17, 2023 at 7:13 PM Dan Streetman <ddstreet at ieee.org> wrote:
> > <...>
> > If you don't specify --tpm2-pcrs= at all, it will bind to PCR 7, even
> > if you bind to a signature as well (at least this is the current
> > behavior).
> >
> > If you want to bind only to a signature, you should use --tpm2-pcrs=""
> > (i.e. empty string) to prevent binding to PCR 7.
>
> Got it. I see now with the luksDump what you mean
>
> How about crypttab? I tried this to no avail:
>
> luks-<ID> UUID=<UUID> none
> discard,tpm2-device=auto,tpm2-measure-pcr=yes,tpm2-pcrs=
>
> > <...>
> > let's try manually unlocking it just to make sure the enrollment was
> > ok, so after enrolling it try:
> >
> > systemd-cryptsetup [attach] test /dev/sda3 - tpm2-device=auto,headless=true
>
> Couldn't find signature for this PCR bank, PCR index and public key.
> Set cipher aes, mode xts-plain64, key size 512 bits for device /dev/sda3.
> Couldn't find signature for this PCR bank, PCR index and public key.
> No TPM2 metadata matching the current system state found in LUKS2
> header, falling back to traditional unlocking.
> Password querying disabled via 'headless' option.
>
> I used `cryptsetup luksDump` to see the metadata and `cryptsetup
> token` to eliminate stray token values. So now I only have two
> keyslots - one for simple password and one for the TPM. And a single
> token. I'll just paste it here, probably I later would need to
> regenerate the volume to avoid exposure.
>
> Keyslots:
> 0: luks2
> Key: 512 bits
> Priority: normal
> Cipher: aes-xts-plain64
> Cipher key: 512 bits
> PBKDF: argon2id
> Time cost: 4
> Memory: 375564
> Threads: 2
> Salt: fe 66 09 e8 71 ce 58 42 1d 5b 35 18 1f 3d fa bc
> 01 7e 04 22 36 91 f3 68 fe 79 d2 02 f5 f6 08 a4
> AF stripes: 4000
> AF hash: sha256
> Area offset:32768 [bytes]
> Area length:258048 [bytes]
> Digest ID: 0
> 2: luks2
> Key: 512 bits
> Priority: normal
> Cipher: aes-xts-plain64
> Cipher key: 512 bits
> PBKDF: pbkdf2
> Hash: sha512
> Iterations: 1000
> Salt: 80 b9 1b e9 1d 11 e4 5b c3 93 ca 29 c1 d4 6d 8b
> 62 e1 40 78 d3 ca c2 be 6b c8 d9 1d cd 2d 9c bf
> AF stripes: 4000
> AF hash: sha512
> Area offset:548864 [bytes]
> Area length:258048 [bytes]
> Digest ID: 0
> Tokens:
> 2: systemd-tpm2
> tpm2-hash-pcrs:
> tpm2-pcr-bank: sha256
> tpm2-pubkey:
> 2d 2d 2d 2d 2d 42 45 47 49 4e 20 50 55 42 4c 49
> 43 20 4b 45 59 2d 2d 2d 2d 2d 0a 4d 49 49 42 49
> 6a 41 4e 42 67 6b 71 68 6b 69 47 39 77 30 42 41
> 51 45 46 41 41 4f 43 41 51 38 41 4d 49 49 42 43
> 67 4b 43 41 51 45 41 36 44 6f 5a 5a 79 34 4d 43
> 47 69 50 51 34 65 68 38 4e 47 48 0a 59 6d 30 70
> 59 66 77 62 43 6f 39 56 79 56 74 61 56 78 47 4c
> 6c 55 44 2f 53 38 44 52 57 32 43 4f 2f 4e 37 58
> 64 75 69 6f 68 7a 79 57 4c 4a 63 4a 46 73 35 79
> 70 7a 36 4d 2b 4c 6e 55 4a 6d 41 4a 0a 6b 75 44
> 78 43 39 67 47 72 4a 53 6e 58 48 34 55 30 6b 32
> 34 66 54 42 39 50 6f 70 6f 71 31 57 62 63 6e 51
> 30 6f 62 71 70 36 70 51 72 6d 4e 4b 6b 2f 63 49
> 34 46 4c 6d 2f 44 79 71 7a 66 31 45 43 0a 75 6a
> 68 37 62 54 72 4c 35 32 79 34 2f 2f 6f 67 65 33
> 58 78 78 30 63 38 64 73 42 53 47 33 2b 33 71 2f
> 79 46 6a 54 71 4d 6e 36 4a 34 62 38 6b 6a 36 52
> 2b 35 75 64 53 55 78 52 57 43 6e 37 72 4b 0a 76
> 33 47 2b 73 41 55 4a 59 72 6d 70 78 79 38 59 63
> 35 75 38 43 71 52 72 4c 39 69 7a 44 45 6c 53 6b
> 47 53 56 49 5a 4a 45 71 68 43 31 31 4b 37 44 4b
> 77 2b 6d 44 6a 79 35 31 62 30 45 55 61 54 51 0a
> 2f 51 51 45 66 31 44 41 7a 4d 48 71 71 56 6a 73
> 70 74 6b 39 7a 53 36 4b 7a 36 2b 4a 52 47 78 47
> 2b 44 41 77 4f 35 2b 52 61 61 66 70 41 4a 55 47
> 7a 30 68 62 2f 4b 71 34 6c 69 34 63 53 5a 61 4a
> 0a 51 77 49 44 41 51 41 42 0a 2d 2d 2d 2d 2d 45
> 4e 44 20 50 55 42 4c 49 43 20 4b 45 59 2d 2d 2d
> 2d 2d 0a
> tpm2-pubkey-pcrs: 11
> tpm2-primary-alg: ecc
> tpm2-blob: 00 7e 00 20 58 3d 8a 4d 57 a6 2d 48 45 58 ba 25
> 8d 22 5f 6b 62 c8 28 1e c0 b7 90 e3 62 98 30 27
> 19 c4 4b 68 00 10 92 fd 29 49 88 6f 6e 0d 30 51
> be 63 c5 8e c3 2b d8 5b 9c 14 3b 11 33 d6 77 95
> 0a 01 5c 10 c0 d0 1a ff 34 df ea cf 21 a6 49 c9
> c3 78 c9 1c a6 66 9c bd 25 62 5c 1a a2 14 19 58
> 74 09 e0 b8 f9 b0 9d 06 ec 60 95 9b 81 21 5d 1a
> 6a 40 57 a8 7d 08 5a c6 6e 62 c8 7e 18 5f d4 01
> 00 4e 00 08 00 0b 00 00 00 12 00 20 3f 8d 42 3c
> f9 cc ad 73 49 2f cb 95 3a bb 98 23 9f 99 9a b2
> 9e 7a d8 30 22 43 04 82 44 87 46 0e 00 10 00 20
> 61 af 05 72 67 27 21 1b c3 29 e7 e8 50 d9 70 3e
> 20 3f 68 1f cf 05 0a 79 31 aa a0 9f c7 69 96 0a
> tpm2-policy-hash:
> 3f 8d 42 3c f9 cc ad 73 49 2f cb 95 3a bb 98 23
> 9f 99 9a b2 9e 7a d8 30 22 43 04 82 44 87 46 0e
> tpm2-pin: false
> tpm2-salt: false
> tpm2-srk: true
> Keyslot: 2
>
> It seems correct to me and I see no warnings anymore when sunning
> cryptsetup. But how can I double check the configuration on the TPM
> side matches this?
>
> btw in my ukify command that you can see in earlier messages, I use
> --phases='enter-initrd' which could explain why it wont work in the
> test mode. But I also tried adding more phases to no avail
>
> * --phases='enter-initrd:leave-initrd
> enter-initrd:leave-initrd:sysinit
> enter-initrd:leave-initrd:sysinit:ready'
>
> > <...>
> > > Strange is that in `journalctl -b` I still see "Couldn't find
> > > signature for this PCR bank, PCR index and public key." So I wonder
> > > what could be broken and how to fix it. How to inspect the initrd
> > > inside the UKI?
> >
> > well you built the initrd before running ukify, so just take a look at
> > it before you build the uki
>
> Good point. I was thinking more about inspecting the measurements
> signarute file(s) in the uki if this makes sense. I still don't
> understand how this signing is supposed to work.
More information about the systemd-devel
mailing list