标签: cryptsetup

如何在登录时按用户解密 LUKS 加密设备?

我已经为以下luks@.service服务创建了systemd

[Unit]
Description=Cryptography Setup for '%I'
After=cryptsetup-pre.target
After=dev-mapper-%i.device
Before=cryptsetup.target
Before=umount.target
BindsTo=dev-mapper-%i.device
BindsTo=dev-mapper-%i.luks.device
Conflicts=umount.target
DefaultDependencies=no
IgnoreOnIsolate=true
RequiresMountsFor=/home

[Service]
ExecStart=/usr/lib/systemd/systemd-cryptsetup attach '%I.luks' '/dev/mapper/%I' '%h/%I/secret.key' 'luks,header=%h/%I/header'
ExecStop=/usr/lib/systemd/systemd-cryptsetup detach '%I.luks'
KillMode=none
RemainAfterExit=yes
TimeoutSec=0
Type=oneshot

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

这个想法是只为给定的用户解密某些 LUKS 加密的xxx设备xxx.luks,例如:

systemctl --user enable luks@xxx
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使用

systemctl --user start luks@xxx
Run Code Online (Sandbox Code Playgroud)

失败,因为它总是返回退出代码1而不说明实际原因。对我来说很明显问题可能出在权限上。那是我确信,为了手动触发cryptsetup luksOpen ...,必须提升外壳,例如使用sudo. 确实,如果我发出

sudo systemctl start luks@xxx
Run Code Online (Sandbox Code Playgroud)

它的作用就像一个魅力,同样

sudo systemctl enable luks@xxx
Run Code Online (Sandbox Code Playgroud)

将在启动阶段工作。

注意:
对于这种系统范围的安装,当然需要通过替换%h为给予者用户的实际主目录来修改服务,这很丑陋,无论如何都不能达到最终目的。

现在,我知道pam_mount哪个能够以每个用户为基础进行类似的安装(我不能使用它,因为它不支持分离的 LUKS …

login d-bus systemd luks cryptsetup

7
推荐指数
1
解决办法
1556
查看次数

luksOpen 不使用密钥文件解密,除非提供 --key-file 参数

我有一个加密卷,我最初以交互方式为其设置了密码,它可以很好地解密分区。我通过以下两种方式使用密钥文件添加了更多密钥:

cryptsetup --keyfile=passphrase luksAddKey /dev/sdax
cryptsetup --luksAddKey /dev/sdax passphrase
Run Code Online (Sandbox Code Playgroud)

其中 passphrase 是包含密钥的文件,/dev/sdax 是加密卷。

然后我检查了密码是否有效使用

cat passphrase | cryptsetup --test-passphrase luksOpen /dev/sdax
dd if=passphrase bs=1 count=256 | cryptsetup --test-passphrase luksOpen /dev/sdax
Run Code Online (Sandbox Code Playgroud)

但他们都失败了:“此密码没有可用的密钥。” 使用 --key-file 选项的以下命令有效:

cryptsetup --test-passphrase --key-file passphrase luksOpen /dev/sdax 
Run Code Online (Sandbox Code Playgroud)

在这一点上,我尝试查看传递密码内容的方法是否与唯一有效的密码(交互设置)一起使用。

echo "manually written working passphrase" > interactive_pass
cat interactive_pass | cryptsetup luksAddKey /dev/sdax
Run Code Online (Sandbox Code Playgroud)

这次它工作得很好。这两种方法和两个密钥文件有什么区别?我需要第一种管道文件内容的方法来处理从密钥文件添加的密码,因为它似乎是在 crypttab 中使用脚本时唯一可能的方法。是否可以?

luks cryptsetup disk-encryption

7
推荐指数
1
解决办法
8141
查看次数

使用 LUKS2 和 FIDO2 密钥安装外部硬盘驱动器

我已使用以下命令在运行 Fedora 34 的计算机上使用 LUKS2 加密了外部硬盘驱动器cryptsetup

当我现在插入硬盘并输入密码时,驱动器已成功解锁,我可以访问我的文件。此外,我希望能够使用 FIDO2 安全密钥解锁驱动器。我已使用以下命令添加密钥作为解锁选项:

sudo systemd-cryptenroll --fido2-device=auto /dev/sdc1
Run Code Online (Sandbox Code Playgroud)

在该文件的文档中/etc/crypttab,我找到了如何在启动过程中自动解锁此类驱动器。

不幸的是,我没有找到任何有关如何使用 FIDO2 密钥手动解锁此类驱动器的文档。当我尝试使用 解锁它时cryptsetup open /dev/sdc1 myLuks,我必须输入密码。在手册中cryptsetup我找不到与--fido2-device这两者类似的参数。

有人可以解释如何使用 FIDO2 密钥手动解锁 LUKS2 加密驱动器吗?

提前致谢

fedora luks cryptsetup disk-encryption

7
推荐指数
1
解决办法
2224
查看次数

Cryptsetup 升级后找不到 libgcrypt.so

我正在运行带有 dm-crypt + luks 的 Fedora Core 13,所有这些都是 Fedora distos 的标准配置。

升级 libgcrypt.so 后,cryptsetup 在启动时抱怨说它找不到它期望的库 ( /lib)。

所以我用 live cd 启动,解密那个驱动器的根分区,并安装我的旧硬盘驱动器,然后我在那里 chroot 。

我运行了 cryptsetup,正如预期的那样,它以与启动时相同的错误轰炸了......我修复了符号链接,并测试了 cryptsetup。有效。

当我重新启动时,同样的错误再次出现......我认为我的更改没有被保存。所以我重新启动到实时操作系统,再次安装了 hdd 和 chroot,令我惊讶的是,我找到了我离开它的符号链接并且 cryptsetup 工作。

有人能告诉我为什么会这样吗?为什么 cryptsetup 仍在 /lib 中寻找该文件,而在它明显存在时却找不到它?!

PS 我还尝试在 /lib 中复制 libgcrypt 库文件,并尝试从源代码重新编译 cryptsetup,它都可以 100% 工作,直到我重新启动,然后再次出现该错误!

我想只是重建那个盒子,但我想我会先问你们?有人遇到过类似的问题吗?

cryptsetup

6
推荐指数
1
解决办法
386
查看次数

将只读 LUKS 分区重新映射为读写

可以使用--readonly-r选项调用 cryptsetup ,这将设置只读映射:

cryptsetup --readonly luksOpen /dev/sdb1 sdb1
Run Code Online (Sandbox Code Playgroud)

以只读方式打开设备后,我可以稍后将其重新映射为读写吗?显然,我的意思是将它映射为读写而不先关闭它,然后再打开它。我可以重新映射它而不必再次输入密码吗?

如果这是不可能的,这只是 cryptsetup 不支持这一点,还是有一些更基本的层面?

dm-crypt cryptsetup device-mapper disk-encryption

6
推荐指数
1
解决办法
4132
查看次数

我可以对多个驱动器使用 luks 分离标头吗?

我可以为多个驱动器使用同一个 LUKS 分离标头吗?
这样做我应该注意什么?如果驱动器根本不同(不同的尺寸、制造等),这也可能吗?

原因:我想在带有 LUKS 的单个系统中使用多个驱动器,但从安全角度来看,使用不同的标头没有任何好处。但也许有技术原因不这样做?

luks cryptsetup

6
推荐指数
1
解决办法
2461
查看次数

如何使用 cryptsetup luksFormat 命令自动回答“是”?

如何以非交互方式运行 cryptsetup luksFormat

当LUKS格式化分区时,我收到消息

# cryptsetup luksFormat /dev/sdb

WARNING!
========
This will overwrite data on /dev/sdb irrevocably.

Are you sure? (Type uppercase yes): YES
Run Code Online (Sandbox Code Playgroud)

紧随其后Enter passphrase:

我怎样才能自动回答YES这个问题“你确定吗?

command-line scripting luks cryptsetup

6
推荐指数
1
解决办法
3524
查看次数

LUKS 丢弃/TRIM:冲突的内核命令行选项

我的各种方式之间的混淆LUKS/ dmcrypt/cryptsetup丢弃/ TRIM操作可以通过Linux的内核命令行来实现。

  1. dracut手册页

    rd.luks.allow-discards

    允许在所有 LUKS 分区上使用丢弃 (TRIM) 请求。

  2. systemd-cryptsetup-generator手册页

    luks.options=, rd.luks.options=

    ... 如果只指定了没有 UUID 的选项列表,则它们适用于其他地方未指定的任何 UUID,并且 /etc/crypttab 中没有条目。...

    此处rd.luks.options=discard推荐该参数。

  3. 关于 LUKS 和 SSDArch wiki 部分 显示了第三个以冒号分隔的字段:

    cryptdevice=/dev/sdaX:root:allow-discards

问题:

  1. discard和 和有allow-discards什么区别?前者是强制性的,后者是可选的吗?
  2. luks.options=rd.luks.options=申请给定cryptdevice=/dev/sda2(例如不是 UUID)?如果cryptdevice=给了一个 UUID,那算不算“在别处指定的”?
  3. 请问luks.options=rd.luks.options=覆盖/添加/添加如果cryptsetup=已经给出了选择?
  4. rd.luks.allow-discards如果到处都需要 TRIM,那么使用似乎最简单的方法有什么缺点吗?

dm-crypt luks cryptsetup kernel-parameters

6
推荐指数
1
解决办法
4220
查看次数

为什么我的 LUKS 分区在不要求密码的情况下被挂载?

在我的系统上,我有两个加密磁盘:

  1. 包含 raspbian 拉伸根分区的 crypt
  2. usb-crypt 是一个外部 USB 磁盘。在该磁盘上使用 LVM。

两个磁盘都使用相同的密码保护,但主密钥根据“cryptsetup luksDump”不同。两个磁盘均未使用密钥文件进行配置(每个 LUKS 容器仅使用一个密钥槽)。

当系统启动时,它要求输入密码“crypt”,但 usb-crypt 会自动挂载而不要求输入密码。注意:我从一个未加密的根分区开始,通过该设置,我在启动过程中被要求输入 usb-crypt 的密码。

下面是详细的设置:

$ sudo dmsetup ls --target crypt
crypt   (254, 0)
usb-crypt       (254, 1)

$ sudo cat /etc/fstab
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mapper/crypt  /            ext4    defaults,noatime  0       1
# ...
UUID=b9fb061f-0877-4d2c-bd3c-9c155b8f88a5       /mountpoint       ext4            rw,auto                 0       0

$ sudo cat /etc/crypttab 
# <target name> <source device>         <key file>      <options>
crypt   /dev/mmcblk0p2  none    luks
usb-crypt       UUID=31fb8df7-6148-4408-90a2-93b8ec752fa0       none    luks
Run Code Online (Sandbox Code Playgroud)

虽然只需要输入一次密码很方便,但我很惊讶看到这种行为。我本来希望被要求提供这两个密码。

这与在两个磁盘上使用相同的密码有关吗?还是U盘的主密钥自动保存在“crypt”的加密根分区的某处?如果有人可以解释这里发生了什么,并可能对相关日志文件等提供一些提示,我将不胜感激。

提前致谢!

luks cryptsetup raspbian

6
推荐指数
1
解决办法
1529
查看次数

“cryptsetup:错误:无法解析设备”与“cryptsetup:警告:在 /etc/crypttab 中找不到目标‘sda3_crypt’”相结合

ubuntu 20.04 上设置休眠并将其修改为适用于加密交换分区后,我遇到了几个问题:

首先,从休眠状态重新启动后,我收到“放弃等待挂起/恢复设备”以及“未找到卷组 luks”。幸运的是,我之后可以正常启动系统。

尽管如此,当再次执行上述网站的步骤时,我在执行时收到以下错误和警告sudo update-initramfs -c -k all

update-initramfs: Generating /boot/initrd.img-5.4.0-56-generic
cryptsetup: ERROR: Couldn't resolve device 
    /dev/disk/by-uuid/5834cf70-0919-4c53-98a6-355d69bbd6a4
cryptsetup: ERROR: Couldn't resolve device 
    UUID=5834cf70-0919-4c53-98a6-355d69bbd6a4
cryptsetup: WARNING: target 'sda3_crypt' not found in /etc/crypttab
update-initramfs: Generating /boot/initrd.img-5.4.0-58-generic
cryptsetup: ERROR: Couldn't resolve device 
    /dev/disk/by-uuid/5834cf70-0919-4c53-98a6-355d69bbd6a4
cryptsetup: ERROR: Couldn't resolve device 
    UUID=5834cf70-0919-4c53-98a6-355d69bbd6a4
cryptsetup: WARNING: target 'sda3_crypt' not found in /etc/crypttab
Run Code Online (Sandbox Code Playgroud)

请注意,UUID=5834cf70-0919-4c53-98a6-355d69bbd6a4属于以前未加密的交换分区sda3。我用我知道的每个配置文件(见下文)UUID中的加密分区之一替换了它sda3_crypt

我希望通过以下打印输出可以解决问题。涉及的配置文件内容(关于swap分区)是:

1. /etc/fstab

/dev/mapper/sda3_crypt none swap sw …
Run Code Online (Sandbox Code Playgroud)

encryption swap initramfs cryptsetup disk-encryption

6
推荐指数
1
解决办法
4154
查看次数