我尝试使用密钥文件和密钥脚本在 Ubuntu Server (20.04) 上自动启动 luks 容器。两个选项的“/etc/crypttab”条目如下。
密钥文件:
dm_crypt-0 /dev/sda3 /root/keyfile luks
关键脚本:
dm_crypt-0 /dev/sda3 none luks,keyscript=/root/lukopen.sh
使用 keyfile crypttab 行时,它在重启时会被忽略,我必须使用密钥手动进入。使用 keyscript crypttab 行时,我收到致命错误(脚本没有返回任何内容)并且操作系统挂起。
密钥文件和脚本位于根目录中。密钥脚本返回密钥文件的内容。脚本返回的数据中的最后一个字符不是换行符。我在脚本中使用了“echo -n”。
我明白这可能在某种程度上不利于安全。我的硬件是嵌入式解决方案,我只需要在驱动器由另一个系统供电的情况下保护驱动器。暴力破解未加密的驱动器并重设 sudo 密码太容易了,所以我宁愿使用某种加密来阻止这种情况。
我已经为此奋斗了好几天,如能提供任何关于如何运行这两种方法的指示,我将不胜感激。
我目前的想法是,keyscript 行中的“none”可能需要一些内容,而 bash 在密钥请求时可能未启动并运行。密钥文件示例中的问题可能是 luks 密钥文件中的顺序问题。无论如何,我不知道我不知道什么。
提前致谢。
答案1
Pavel Kogan 在 2015 年发布的两篇精彩文章这里关于 Arch Linux luks 和这里关于他设计的 Debian 改进,以及 @davidgo 的提醒,为我提供了 luks 加密自动启动解决方案。这就是它对我的作用。
在使用标准 luks 选项构建的新 Ubuntu 服务器 20.04 上创建一个密钥文件作为密钥使用,然后使用 cryptsetup 将其添加到下一个 luks 密钥槽。
dd bs=512 count=4 if=/dev/urandom of=/crypto_keyfile.bin
cryptsetup luksAddKey /dev/sda3 /crypto_keyfile.bin
nano 进入 /etc/crypttab 文件并使用您自己的加密驱动器逻辑分区名称和主分区驱动器输入
dm_crypt-0 /dev/sda3 /crypto_keyfile.bin luks,keyscript=/bin/cat
这修复了我做错的第二件事。我没有意识到 crypttab 行中的第三个条目(通常被视为“none”)实际上是 keyscript 等式调用的可执行文件(在本例中为“cat”)的参数。
第三件事,如果我没有读过 Pavel 的文档,我就不会考虑,那就是为了让物理密钥文件可见,需要有一个钩子供 initramfs 使用。我复制了 Pavel 的简单脚本 crypto_keyfile
#!/bin/sh
cp /crypto_keyfile.bin "${DESTDIR}"
放入 /etc/initramfs-tools/hooks/ 并使其可执行。
chmod +x /etc/initramfs-tools/hooks/crypto_keyfile
我做的最后一件事是更新 initramfs
update-initramfs -u
当我回到命令行时,我重新启动了 Linux,这次它不需要密码就可以加载。
当我将驱动器从嵌入式硬件中取出并将其放入单独的系统中并尝试安装它时,它会要求输入密码来安装磁盘,这是我想要的功能。