我已经为以下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 …
我有一个加密卷,我最初以交互方式为其设置了密码,它可以很好地解密分区。我通过以下两种方式使用密钥文件添加了更多密钥:
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 中使用脚本时唯一可能的方法。是否可以?
我已使用以下命令在运行 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 加密驱动器吗?
提前致谢
我正在运行带有 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% 工作,直到我重新启动,然后再次出现该错误!
我想只是重建那个盒子,但我想我会先问你们?有人遇到过类似的问题吗?
可以使用--readonly或-r选项调用 cryptsetup ,这将设置只读映射:
cryptsetup --readonly luksOpen /dev/sdb1 sdb1
Run Code Online (Sandbox Code Playgroud)
以只读方式打开设备后,我可以稍后将其重新映射为读写吗?显然,我的意思是将它映射为读写而不先关闭它,然后再打开它。我可以重新映射它而不必再次输入密码吗?
如果这是不可能的,这只是 cryptsetup 不支持这一点,还是有一些更基本的层面?
我可以为多个驱动器使用同一个 LUKS 分离标头吗?
这样做我应该注意什么?如果驱动器根本不同(不同的尺寸、制造等),这也可能吗?
原因:我想在带有 LUKS 的单个系统中使用多个驱动器,但从安全角度来看,使用不同的标头没有任何好处。但也许有技术原因不这样做?
如何以非交互方式运行 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这个问题“你确定吗?
我的各种方式之间的混淆LUKS/ dmcrypt/cryptsetup丢弃/ TRIM操作可以通过Linux的内核命令行来实现。
rd.luks.allow-discards允许在所有 LUKS 分区上使用丢弃 (TRIM) 请求。
该systemd-cryptsetup-generator手册页
luks.options=, rd.luks.options=... 如果只指定了没有 UUID 的选项列表,则它们适用于其他地方未指定的任何 UUID,并且 /etc/crypttab 中没有条目。...
此处rd.luks.options=discard推荐该参数。
关于 LUKS 和 SSD的Arch wiki 部分 显示了第三个以冒号分隔的字段:
cryptdevice=/dev/sdaX:root:allow-discards
问题:
discard和 和有allow-discards什么区别?前者是强制性的,后者是可选的吗?luks.options=或rd.luks.options=申请给定cryptdevice=/dev/sda2(例如不是 UUID)?如果cryptdevice=给了一个 UUID,那算不算“在别处指定的”?luks.options=或rd.luks.options=覆盖/添加/添加如果cryptsetup=已经给出了选择?rd.luks.allow-discards如果到处都需要 TRIM,那么使用似乎最简单的方法有什么缺点吗?在我的系统上,我有两个加密磁盘:
两个磁盘都使用相同的密码保护,但主密钥根据“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”的加密根分区的某处?如果有人可以解释这里发生了什么,并可能对相关日志文件等提供一些提示,我将不胜感激。
提前致谢!
在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) cryptsetup ×10
luks ×7
dm-crypt ×2
command-line ×1
d-bus ×1
encryption ×1
fedora ×1
initramfs ×1
login ×1
raspbian ×1
scripting ×1
swap ×1
systemd ×1