I apologize in advance for the formatting, this is my first time using a
mailing list and I don't know how to format it well.

I can't get systemd-cryptsetup to accept the cryptsetup.pkcs11-pin
credential. It doesn't seem to get used by systemd-cryptsetup, I still have
to manually unlock it at boot time.

For testing, I've set a pin 4321, in /boot/efi/key.txt  (this is the pin to
unlock the pkcs11 device)

I'm using system-cryptsetup version 257.x that I built on another
machine and copied over (with the libraries and updated ldconfig) I would
update the entire systemd but I'm not sure how to do that (yet)

The base version of systemd on the system is 255.x.

Here is some output trying the cryptsetup.pkcs11-pin credential - when I do
this... it still prompts for the pin.

davew@speed:~$ sudo systemctl status systemd-cryptsetup@os_crypt.service
● systemd-cryptsetup@os_crypt.service - Cryptography Setup for os_crypt
     Loaded: loaded (/etc/crypttab; generated)
    Drop-In: /etc/systemd/system/systemd-cryptsetup@os_crypt.service.d
             └─override.conf
     Active: active (exited) since Wed 2025-01-15 15:09:43 UTC; 17s ago
       Docs: man:crypttab(5)
             man:systemd-cryptsetup-generator(8)
             man:systemd-cryptsetup@.service(8)
    Process: 521 ExecStartPre=/bin/bash -c echo
"cryptsetup.pkcs11-pin=$(cat
${CREDENTIALS_DIRECTORY}/cryptsetup.pkcs11-pin)" (code=exited,
status=0/SUCCESS)
    Process: 550 ExecStart=/usr/bin/systemd-cryptsetup attach os_crypt
/dev/disk/by-uuid/c7dad40e-973a-4381-9bcb-6c4477429f95 none
luks,pkcs11-uri=auto (code=exited>
   Main PID: 550 (code=exited, status=0/SUCCESS)
        CPU: 193ms

Jan 15 15:09:37 speed systemd[1]: Starting
systemd-cryptsetup@os_crypt.service - Cryptography Setup for os_crypt...
Jan 15 15:09:38 speed bash[521]: cryptsetup.pkcs11-pin=4321
Jan 15 15:09:43 speed systemd-cryptsetup[550]: Successfully logged into
security token 'LUKS'.
Jan 15 15:09:43 speed systemd-cryptsetup[550]: Successfully decrypted key
with security token.
Jan 15 15:09:43 speed systemd[1]: Finished
systemd-cryptsetup@os_crypt.service - Cryptography Setup for os_crypt.

davew@speed:~$ /usr/bin/systemd-cryptsetup --version
systemd 257 (257.2)
-PAM -AUDIT +SELINUX -APPARMOR +IMA +IPE +SMACK -SECCOMP -GCRYPT -GNUTLS
+OPENSSL -ACL +BLKID -CURL -ELFUTILS -FIDO2 -IDN2 -IDN -IPTC -KMOD
+LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS -LIBFDISK +PCRE2 -PWQUALITY -P11KIT
-QRENCODE -TPM2 -BZIP2 -LZ4 -XZ +ZLIB -ZSTD -BPF_FRAMEWORK -BTF -XKBCOMMON
+UTMP +SYSVINIT -LIBARCHIVE

davew@speed:~$ systemd --version
systemd 255 (255.4-1ubuntu8.4)
+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS
+OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD
+LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2
+LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT
default-hierarchy=unified

davew@speed:~$ cat /etc/systemd/system/systemd-cryptsetup@os_crypt.service.d
/override.conf
[Unit]
After=boot-efi.mount

[Service]
LoadCredential=cryptsetup.pkcs11-pin:/boot/efi/key.txt
ExecStartPre=/bin/bash -c 'echo "cryptsetup.pkcs11-pin=$(cat
${CREDENTIALS_DIRECTORY}/cryptsetup.pkcs11-pin)"'

davew@speed:~$ sudo cat /boot/efi/key.txt
4321

Below, I was able to get this to work by running it all manually in the
override... but then I may as well get rid of the crypttab and just set up
the service manually.

This is a contrived example, I will have a socket listening and responding
to requests

davew@speed:~$ sudo cat
/etc/systemd/system/systemd-cryptsetup@os_crypt.service.d/override.conf
[Unit]
After=boot-efi.mount

[Service]
LoadCredential=cryptsetup.pkcs11-pin:/boot/efi/key.txt
Environment=PINFILE=%d/cryptsetup.pkcs11-pin
ExecStartPre=/bin/bash -c 'echo "cryptsetup.pkcs11-pin=$(cat
${CREDENTIALS_DIRECTORY}/cryptsetup.pkcs11-pin)"'
ExecStartPre=/bin/bash -c 'echo "PINFILE HERE: $PINFILE"'
ExecStart=
ExecStart=/bin/bash -c "PIN=$(cat $PINFILE) /usr/bin/systemd-cryptsetup
attach os_crypt /dev/disk/by-uuid/c7dad40e-973a-4381-9bcb-6c4477429f95 none
luks,pkcs11-uri=auto"

Thanks,

David.


On Wed, Jan 15, 2025 at 12:37 PM Andrei Borzenkov <arvidj...@gmail.com>
wrote:

> On Wed, Jan 15, 2025 at 2:31 PM David White <dr.white...@gmail.com> wrote:
> >
> > Hi there,
> >
> > Just want some help with setting credentials for systemd-cryptsetup@.service
> services.
> >
> > I have a crypttab file with the following:
> >
> > (I set a label for this volume with a udev rule as I have to use a label)
> >
>
> I am not sure I understand it. Label is a property of the filesystem;
> how do you set it using "udev rule"?
>
> > os_crypt  LABEL=os_luks  none
> try-empty-password=1,luks,pkcs11-uri=auto,discard
> >
> > I read in the systemd-cryptsetup documentation that I should be able to
> pass credential "cryptsetup.pkcs11-pin"
> >
> > I couldn't figure out from the documentation how to do this.
> >
> > I assume I create a drop-in for systemd-cryptsetup@os_crypt.service
> >
> > and add the credential there:
> >
> > LoadCredential=cryptsetup.pkcs11-pin:/path/to/unix/socket
> >
> > Would that work?
>
> For this to work you need some process listening on the
> /path/to/unix/socket and answering the request.
>
> > If not, how would I go about passing a pkcs11 pin to cryptsetup.
> >
>
> You can simply drop your credentials into any standard directory like
> /etc/credstore. systemd-cryptsetup@xxx.service already has
> ImportCredentials=cryptsetup.*.
>
> The catch is that systemd-cryptsetup only tries the single generic
> credential name. There is no provision for different pins (via
> credentials) for different devices. As long as you only have one
> token, it is OK. But now I wonder if it could be a reason for failing
> to use different tokens to unlock different volumes concurrently.
>

Reply via email to