我正在调试 cryptsetup 的奇怪行为:
假设文件中存储了正确的密码pw。我现在预计,--test-passphrase如果它作为标准输入传入,那么总是会成功(即不打印输出)。但事实证明它随机失败:
# cryptsetup luksOpen --test-passphrase /dev/nvme0n1p2 < pw
# cryptsetup luksOpen --test-passphrase /dev/nvme0n1p2 < pw
No key available with this passphrase.
# cryptsetup luksOpen --test-passphrase /dev/nvme0n1p2 < pw
# cryptsetup luksOpen --test-passphrase /dev/nvme0n1p2 < pw
No key available with this passphrase.
# cryptsetup luksOpen --test-passphrase /dev/nvme0n1p2 < pw
# cryptsetup luksOpen --test-passphrase /dev/nvme0n1p2 < pw
No key available with this passphrase.
# cryptsetup luksOpen --test-passphrase /dev/nvme0n1p2 < pw
# cryptsetup luksOpen --test-passphrase /dev/nvme0n1p2 …Run Code Online (Sandbox Code Playgroud) 我双启动 Fedora 和 Windows Vista 并希望它们共享一个分区,以便我可以在 Linux 和 Windows 中处理相同的文件,并且我需要对所有内容进行加密。
由于 TrueCrypt 已过时,我使用VeraCrypt加密了共享驱动器。Windows 可以在登录时轻松安装卷。
我试图在 Linux 中做同样的事情,但没有运气,因为我不知道如何使用crypttab该veracrypt选项,或者即使它有一个选项。
cryptsetup工作正常,因为只需要添加--veracrypt选项,但crypttab似乎没有。
cryptsetup --veracrypt open --type tcrypt /dev/sdX veracrypt-volume
Run Code Online (Sandbox Code Playgroud)
如何挂载 VeraCrypt 卷crypttab?还有可能吗?
我通过创建了一个加密的容器
#!/bin/bash
dd if=/dev/zero of=$1 bs=1 count=0 seek=$2
MAPPER=$(mktemp -up /dev/mapper)
LOOPDEV=$(losetup --find --show $1)
cryptsetup luksFormat $LOOPDEV
cryptsetup luksOpen $LOOPDEV $(basename $MAPPER)
mkfs.ext3 $MAPPER
cryptsetup luksClose $MAPPER
losetup -d $LOOPDEV
Run Code Online (Sandbox Code Playgroud)
例如,container指定给此脚本的文件将包含通过 .ext3 加密的 ext3 文件系统cryptsetup luksFormat。
要安装它,我目前使用另一个脚本,例如dm.mount container /mnt/decrypted:
#!/bin/bash
set -e
MAPPER=$(mktemp -up /dev/mapper)
LOOPDEV=$(losetup --find --show $1)
cryptsetup luksOpen $LOOPDEV $(basename $MAPPER) || losetup -d $LOOPDEV
mount $MAPPER $2 || (
cryptsetup luksClose $MAPPER
losetup -d $LOOPDEV
)
Run Code Online (Sandbox Code Playgroud)
并卸载它dm.umount /mnt/decrypted …
我已经问过一次关于Linux中多个 HDD 的 LUKS 解锁:LUKS 和多个硬盘驱动器。
现在我想知道如何安全存储用于自动解锁关联分区的密钥文件。
我的计划是(如果可能的话):
使用需要密码短语的 LUKS 加密小型 USB 驱动器
使用密码在启动时将其解锁为第一个驱动器
将其挂载到给定的挂载点,例如 /test(这可能吗?)
现在可以安全地读取密钥文件:/test/keyfile
使用密钥文件解锁其他驱动器而无需询问密码
Luks关闭USB驱动器以确保其他驱动器解锁后的一定程度的安全
像往常一样自动挂载 /、/usr、/var 和其他挂载点
这能行吗?基本上,我将 LUKS 密钥文件存储在密码加密的 LUKS USB 驱动器上,该驱动器只要求输入一次密码,而所有其他驱动器无需进一步操作即可解锁。我不确定是否有某种方法可以先解锁 USB 驱动器,然后安装,然后其他驱动器才尝试访问密钥文件。此外,在自动化方面,我认为 /etc/fstab 和 /etc/crypttab 应该可以在其他驱动器安装之前访问,但是如果整个 / 文件系统是 LUKS 加密的,则这是不可能的。
除非有可能完全手动配置 LUKS 的工作方式:
LuksOpen /dev/sdc1 usb_keyfile
挂载 /dev/mapper/usb_keyfile /keyfile (这可能吗?)
LuksOpen --keyfile /keyfile/key /dev/sda1 disk1
LuksOpen --keyfile /keyfile/key /dev/sdb1 disk2
Luks关闭 /dev/sdc1
基本上能够在加载所需模块后立即运行 shell 脚本并禁用自动 LUKS 密码提示。
其他详细信息
我决定用 LUKS+LVM 加密我的根分区。
我的 ThinkPad 设置:
但是我读得越多,我对以下两个主题的了解就越少:
由于cryptsetupFAQ中的引用,我打算使用 SHA1 而不是 2/512(如某些人建议的那样):
5.20 LUKS 坏了!它使用 SHA-1!
不它不是。SHA-1(学术上)因发现冲突而被破坏,但不能在密钥派生函数中使用它。并且该碰撞漏洞仅供非迭代使用。并且您需要逐字逐句的哈希值。
这基本上意味着,如果您已经有一个插槽密钥,并且您已将 PBKDF2 迭代计数设置为 1(通常 > 10'000),您可以(也许)派生出不同的密码短语,为您提供相同的插槽 -钥匙。但是如果你有槽钥匙,你就可以解锁钥匙槽并获得万能钥匙,打破一切。所以基本上,这个 SHA-1 漏洞允许你在已经打开一个 LUKS 容器的情况下,费力地打开它。
这里真正的问题是人们不了解加密,并声称某些东西被破坏了只是因为使用了某些已被破坏用于特定不同用途的机制。该机制的使用方式非常重要。一次使用而被破坏的散列对于其他用途来说是完全安全的,这就是它。
我读为“除了 SHA-1 之外,没有任何意义”。但后来有人告诉我,事实并非如此。所以我不再知道该怎么想了。
此外,我找不到任何信息,一旦磁盘解锁并登录系统,密码是否对磁盘读/写/搜索性能有任何影响。
那么密码的复杂性是只影响密码输入阶段的“性能”,还是系统正常使用时的“性能”呢?
这几天我一直在阅读这个,但我读得越多,我就越困惑。我读到的一切都说 AES 是最快的,而 Serpent 是最慢的。但不是根据我的笔记本电脑:
$ cryptsetup benchmark
Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 344926 iterations per second
PBKDF2-sha256 198593 iterations per second …Run Code Online (Sandbox Code Playgroud) 我有一个基于 Debian 7.4(稳定)的服务器,配置为使用加密的(RAID1 + LVM)根分区(/boot 是未加密的常规分区),我在其中安装了 dropbear SSH 服务器,因此我可以远程输入 LUKS 加密密码。
除了根分区/卷之外,我还有其他 RAID1+cryptsetup+LVM 卷,我希望能够使用相同的密码打开它们。我用谷歌搜索,发现我可以使用脚本/lib/cryptsetup/scripts/decrypt_keyctl来缓存密码并使用相同的密码打开多个卷。但是我如何使用这个脚本和在 initramfs 阶段输入的密码?
我正在编写一个脚本,从 debootstrap 创建一个完全加密的可清洗系统。它做得很好,但是出来的initramfs图像没有正确地拾取 cryptroot。使用 qemu 启动映像后,我进入了一个 busybox shell,我必须使用cryptsetup以下命令手动解锁 luks 加密:
cryptsetup luksOpen /dev/sda1 system
/scripts/local-premount/flashback
exit
Run Code Online (Sandbox Code Playgroud)
(闪回做了一些 btrfs 快照魔术来忘记每次启动时所做的更改)
在此之后,qemu 中的引导继续正常进行,然后我就能够生成一个好的initramfs映像。我将其复制到 btrfs @root.base 子卷,从那时起一切都很好。
我需要帮助弄清楚为什么 cryptsetup/cryptroot 部分没有通过以下方式在 chroot 环境中被拾取update-initramfs:
echo "CRYPTSETUP=y" >> /usr/share/initramfs-tools/conf-hooks.d/cryptsetup
echo "export CRYPTSETUP=y" >> /usr/share/initramfs-tools/conf-hooks.d/cryptsetup
update-initramfs -ut
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西,我写了一个很好的 fstab 和 crypttab,甚至尝试在 grub.cfg 中显式设置 cryptdevice。参考脚本的具体版本。
下面是我创建 fstab 和 crypttab 的方法:
export partuuid=$(blkid $partition | sed -re 's/.*: UUID="([^"]+)".*/\1/')
export decruuid=$(blkid /dev/mapper/$decrypted | sed -re 's/.*: UUID="([^"]+)".*/\1/') …Run Code Online (Sandbox Code Playgroud) 我正在开发 yocto 发行版,包括 2.3.2 版本中的 cryptsetup
我在具有 1 GB RAM 的主板上运行此类发行版,在尝试打开无法正确调试的加密分区时遇到“内存不足”错误。有任何想法吗?
我的发行版从具有 3 个分区的 mSD 运行;第三个 (30 MB) 是加密的。
我使用ArchLinux 指南中描述的步骤来加密该分区,使用 ext3 而不是 ext4
# cryptsetup -y -v luksFormat /dev/sda2
# cryptsetup open /dev/sda2 cryptroot
# mkfs.ext3 /dev/mapper/cryptroot
Run Code Online (Sandbox Code Playgroud)
但尝试在我的主板上打开该分区会引发错误:
cryptsetup --debug open /dev/mmcblk0p3 cryptroot
# cryptsetup 2.3.2 processing "cryptsetup --debug open /dev/mmcblk0p3 cryptroot"
# Running command open.
# Locking memory.
# Installing SIGINT/SIGTERM handler.
# Unblocking interruption on signal.
# Allocating context for crypt device /dev/mmcblk0p3.
# Trying …Run Code Online (Sandbox Code Playgroud) 我已经为以下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 …
我已使用以下命令在运行 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 加密驱动器吗?
提前致谢