首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在尝试创建一个基于tpm2的自动解锁sh脚本,但是如果找不到文件,脚本就会失败。

我正在尝试创建一个基于tpm2的自动解锁sh脚本,但是如果找不到文件,脚本就会失败。
EN

Stack Overflow用户
提问于 2019-11-25 09:51:30
回答 2查看 769关注 0票数 0

我正在尝试创建一个基于TPM的解锁脚本,使用tpm2工具和Tevora安全引导tpm2的说明。我已经设置了密钥,用cryptsetup luksAddKey secret.bin加载它,然后使用tpm2_unlock -c 0x81000000 --auth pci:sha1:0,2,3,7测试它,并返回secret.bin的值。为了采取额外的措施,为了确保其工作正常,我将secret.bin加载到"/etc/crypttab“中,运行# update-initramfs -u -k all并重新启动。在重新启动时,系统将解锁。

我将以下代码复制到"/etc/initramfs-tools/hooks/tpm2“中

代码语言:javascript
复制
#!/bin/sh -e
if [ "$1" = "prereqs" ]; then exit 0; fi
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/local/bin/tpm2_unseal
copy_exec /usr/local/lib/libtss2-tcti-device.so

我把我的etc/crypttab从cryptname UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none luks附加到cryptname UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none luks,keyscript=/usr/local/bin/passphrase-from-tpm

我重写了以下脚本,因为tpm2-tools命令已经过时,在新命令中进行了编辑,并将其存储在/usr/local/bin/passphrase-from-tpm中:

代码语言:javascript
复制
#!/bin/sh
set -e
echo "Unlocking via TPM" >&2
export TPM2TOOLS_TCTI="device:/dev/tpm0"
/usr/local/bin/tpm2_unseal -c 0x81000000 --auth pcr:sha1:0,2,3,7
if [ $? -eq 0 ]; then
    exit
fi
/lib/cryptsetup/askpass "Unlocking the disk fallback $CRYPTTAB_SOURCE ($CRYPTTAB_NAME)\nEnter passphrase: "

我运行了# update-initramfs -u -k all,然后重新启动。在重新启动时,我得到以下错误:/lib/cryptsetup/scripts/passphrase-from-tpm: line 5: /usr/local/bin/tpm2_unseal: not found

我多次尝试编辑密码从-tpm失败,包括:

  • 将passphrase从-tpm移到"/boot/efi/EFI/BOOT/“,并将密码转到该文件。
  • 修改passphrase from-tpm以使用tpm_unseal的相对文件路径

在我了解如何使用以下方法创建备份linux引导之前:

代码语言:javascript
复制
objcopy \
--add-section .osrel=/etc/os-release --change-section-vma .osrel=0x20000 \
--add-section .cmdline=cmdline.txt --change-section-vma .cmdline=0x30000 \
--add-section .linux="/boot/vmlinuz" --change-section-vma .linux=0x40000 \
--add-section .initrd="/boot/initrd.img" --change-section-vma .initrd=0x3000000 \
/usr/lib/systemd/boot/efi/linuxx64.efi.stub /boot/EFI/BOOT/BOOT_RECX64.EFI

我将被完全锁在系统之外,因为错误,并不得不重新安装Ubuntu约40次。我受了很多苦,想要辞职,但我太固执了,不敢扔旗子。

EN

回答 2

Stack Overflow用户

发布于 2019-12-11 02:29:48

只需将tpm2_unseal复制到/usr/local/bin/

票数 0
EN

Stack Overflow用户

发布于 2020-01-01 00:21:36

我试图使一个工作的设置基本上遵循这些指令,再加上一些其他我已经发现。虽然还没有100%工作,但请检查/etc/initramfs-tools/hooks/tpm2/usr/local/bin/passphrase-from-tpm都标记为可执行文件(sudo chmod ug+x $filename)。

在生成initramfs之后,您可以运行以下命令,以确保与TPM相关的文件实际上在映像中。将文件名中的路径替换为update-initramfs所说的生成的任何内容:

代码语言:javascript
复制
$ lsinitramfs /boot/initrd.img-5.0.0-37-generic | egrep "(tpm|libtss)"
lib/cryptsetup/scripts/passphrase-from-tpm
lib/modules/5.0.0-37-generic/kernel/crypto/asymmetric_keys/tpm_key_parser.ko
lib/modules/5.0.0-37-generic/kernel/crypto/asymmetric_keys/asym_tpm.ko
lib/udev/rules.d/tpm-udev.rules
usr/local/lib/libtss2-sys.so.0
usr/local/lib/libtss2-mu.so.0
usr/local/lib/libtss2-sys.so.0.0.0
usr/local/lib/libtss2-tcti-device.so
usr/local/lib/libtss2-tcti-device.so.0
usr/local/lib/libtss2-tcti-device.so.0.0.0
usr/local/lib/libtss2-mu.so.0.0.0
usr/local/bin/tpm2_unseal

此外,我还修改了/usr/local/bin/passphrase-from-tpm如下:

代码语言:javascript
复制
#!/bin/sh
TPM_DEVICE=/dev/tpm0
TPM_REGISTER=0x81000001
TPM_SEAL_POLICY=sha256:0,2,4,7

export TPM2TOOLS_TCTI="device:$TPM_DEVICE"
if [ "$CRYPTTAB_TRIED" -eq 0 ]; then
    echo "Unlocking via TPM" >&2
    /usr/local/bin/tpm2_unseal -H $TPM_REGISTER -L $TPM_SEAL_POLICY 
    UNSEAL_STATUS=$?
    echo "Unseal status $UNSEAL_STATUS" >&2
    if [ $UNSEAL_STATUS -eq 0 ]; then
        exit
    fi
else
    echo "TPM unlocking previously failed for $CRYPTTAB_SOURCE ($CRYPTTAB_NAME)" >&2
    /lib/cryptsetup/askpass "Enter passphrase for $CRYPTTAB_SOURCE ($CRYPTTAB_NAME): "
fi

请注意,tpm2_unseal的命令行选项用于tpm2-tools的3.x版本。如果使用的是其他版本,则可能需要更新选项。

我在文件的顶部提取了变量中的各种位。修改TPM_REGISTERTPM_SEAL_POLICY以匹配如何创建TPM对象。set -e被移除,因为如果任何命令失败,整个脚本都会退出,如果tpm2_unseal失败,将防止askpass回退运行。

此外,我注意到,如果脚本由于某种原因失败,systemd将再次尝试运行它。如果TPM中的秘密与LUKS键不匹配,这将使系统无法启动,因为解封成功,但解锁失败,而systemd将再次运行脚本。

查看crypttab的手册页,我发现提供给keyscript的环境变量之一是CRYPTTAB_TRIED,它尝试解锁卷的次数。如果CRYPTTAB_TRIED为0,它将尝试使用TPM,如本测试所示(以非根用户的身份运行,因此访问TPM设备失败):

代码语言:javascript
复制
$ export CRYPTTAB_SOURCE=some_device
$ export CRYPTTAB_NAME=some_device_name
$ export CRYPTTAB_TRIED=0
$ ./passphrase-from-tpm
Unlocking via TPM
ERROR:tcti:src/tss2-tcti/tcti-device.c:440:Tss2_Tcti_Device_Init() Failed to open device file /dev/tpm0: Permission denied
ERROR: tcti init allocation routine failed for library: "device" options: "/dev/tpm0"
ERROR: Could not load tcti, got: "device"
Unseal status 1

当它再次尝试运行脚本时,CRYPTTAB_TRIED将大于0,因此它将显示密码提示:

代码语言:javascript
复制
$ export CRYPTTAB_TRIED=1
$ ./passphrase-from-tpm
TPM unlocking previously failed for some_device (some_device_name)
Enter passphrase for some_device (some_device_name):

希望这对你还是有用的,并且对任何试图在Linux上用TPM加密磁盘的人都有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59029079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档