是否可以使用密钥文件而不是密码来加密硬盘?


14

研究硬盘加密。解决方案似乎是使用密码使用LUKS进行dm-crypt。我使用安装在磁盘池中的多个独立硬盘进行读取。在这种情况下,我必须多次输入密码。

我是否可以使用密钥文件对硬盘进行加密,或者将其放在USB驱动器上,并在必要时将其插入?

Answers:


11

最好的方法之一是使用带有加密密钥的智能卡来解锁加密块设备的密钥。您只需输入一次密码(在工具中称为“ PIN”,但这实际上是密码),之后将被缓存。这样具有的额外优势是,您可以使用自己拥有的东西(智能卡本身无法从中提取私钥)和您自己知道的东西(密码)来保护加密的数据。

/etc/crypttab像这样格式化您的:

mapper-name /dev/disk/raw-device /var/lib/filename-containing-encrypted-key \
    luks,keyscript=/lib/cryptsetup/scripts/decrypt_opensc

在Debian和衍生产品中,initramfs-tools将注意到关键字,并将用于访问智能卡的所有必要工具和守护程序自动复制到initramfs。

有关设置智能卡和创建(和加密)密钥的信息,请参见/usr/share/doc/cryptsetup/README.opensc.gz

为此,您可以使用Yubikey 4Yubikey NEO

实施注意事项:此功能具有粗糙的边缘,显然不能立即使用,因此YMMV。上一次成功实现此目标时,我不得不添加以下技巧:

  • 禁用,systemd因为它灾难性地尝试从中接管设置加密设备的整个过程,/etc/crypttab但不知道是什么keyscript导致了很大的失败。幸运的是,在Debian中,您仍然可以选择退出systemd
  • 安装此fixer-upper脚本是/etc/initramfs-tools/hooks/yubipin因为内置功能未安装足够的支持,无法从initramfs中使Yubikey可用。您可能需要对此进行调整。

    #!/bin/sh
    
    PREREQ=cryptroot
    
    prereqs()
    {
        echo "$PREREQ"
    }
    
    case $1 in
    prereqs)
        prereqs
        exit 0
        ;;
    esac
    
    # /scripts/local-top/cryptopensc calls pcscd with the wrong path
    ln -s ../usr/sbin/pcscd ${DESTDIR}/sbin/pcscd
    mkdir -p "${DESTDIR}/usr/lib/x86_64-linux-gnu"
    # opensc-tool wants this dynamically, copy_exec doesn't know that
    cp -pL /usr/lib/x86_64-linux-gnu/libpcsclite.so.1 "${DESTDIR}/usr/lib/x86_64-linux-gnu/libpcsclite.so.1"
    mkdir -p "${DESTDIR}/lib/x86_64-linux-gnu"
    # without this, pcscd aborts with a pthread_cancel error
    cp -pL /lib/x86_64-linux-gnu/libgcc_s.so.1 "${DESTDIR}/lib/x86_64-linux-gnu/libgcc_s.so.1"
    # this gets copied as a dangling symlink, fix it
    rm "${DESTDIR}/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist"
    cp -pL /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist "${DESTDIR}/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist"
    # pcscd needs this to open the reader once it has found it
    cp -pL /lib/x86_64-linux-gnu/libusb-1.0.so.0 "${DESTDIR}/lib/x86_64-linux-gnu/libusb-1.0.so.0"
    
  • 安装另一个脚本/etc/initramfs-tools/scripts/local-bottom/killpcscd进行清理:

    #!/bin/sh
    
    set -e
    
    PREREQ=cryptopensc
    
    prereqs()
    {
        echo "$PREREQ"
    }
    
    case $1 in
        prereqs)
            prereqs
            exit 0
            ;;
    esac
    
    # because cryptopensc does not do it properly
    killall pcscd
    

1
使用智能卡和荣誉来实现此目标的动机非常好,但是我要说的是一种特定于发行版的方法,其中涉及更改初始化系统和第三方hack脚本,这些脚本被推到具有不可读路径的系统目录中,不能被视为解决方案。使用密码文件的问题。突显了这些软件令人难以置信的混乱。
dbanet

@dbanet,我完全同意,我希望其他人也会来并添加答案,说明如何以其他更简单的方式执行此操作。然后,OP可以选择自己喜欢的。
Celada's

dbanet和@Celada,正是我的想法。这太复杂了,即使我设法做到这一点,它也是专有的,这意味着另一家供应商将有另一种方法。:(
Nithin

3

可以将luks密码简单地存储在文件中。

我在家用计算机上使用它;根文件系统位于常规的luks卷上,该卷在启动时用密码解锁。另一个驱动器包含带有生成密码的luks卷。

此附加卷由位于加密的根文件系统上的密码文件解锁。如果根文件系统已解锁,则它将在引导过程中自动解锁。

我的/etc/crypttab样子是这样的:

crypt-root UUID=c5a2cf25-0aae-457e-874f-fca7ea3d5742 none luks
crypt-data UUID=96d79323-246d-49e0-9149-ec3a4cfc1c1e /etc/crypt-data.key luks

第三个字段是密钥none文件,/etc/crypt-data.key用于根文件系统,但用于数据文件系统。/etc/crypt-data.key包含luks密码:

Tm90IHJlYWxseSBteSBwYXNzd29yZC4K

注意,换行符或任何其他空格将作为密码的一部分!注意生成此文件时不要尾随换行符。另外,请确保它具有严格的权限:

-rw------- 1 root root 59 Sep 14 23:57 /etc/crypt-data.key

您应该能够对多个卷重复此方法(您可以选择使用不同的密码或一个共享密码)。


您还能提到如何配置LUKS以使用密钥文件而不是密码吗?
Nithin

@Nithin密钥文件是我的示例中的第三个字段/etc/crypttab。我添加了一些额外的文字,使内容更清晰。
marcelm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.