用cryptsetup/LUKS进行全盘加密

本指南展示了如何配置LUKS加密卷,在启动时用`Nitrokey Pro <https://shop.nitrokey.com/shop/product/nk-pro-2-nitrokey-pro-2-3>`__或`Nitrokey Storage <https://shop.nitrokey.com/shop/product/nitrokey-storage-2-56>`__验证。

为了提供一些背景资料,cryptsetup-initramfs现在支持使用Nitrokey Pro和Nitrokey Storage等OpenPGP智能卡来解锁LUKS加密的卷。一旦你完成设置,你只需要在启动时插入Nitrokey并输入用户密码,而不是输入常规的磁盘加密口令。

这些说明已经在Ubuntu 20.04和Debian 10上进行了测试。

警告

下面的指南有可能会把你的电脑锁住。你应该意识到这些风险,我们建议你在第二台电脑上使用下面的脚本,或者在完全备份后使用,因为你可能会丢失你的数据。

要求

  • 一台至少有一个LUKS加密卷的Ubuntu或Debian电脑。

请参阅下面的章节,以确定哪种方法与本指南兼容。

  • 一个Nitrokey Pro 2或Nitrokey Storage 2 `初始化<openpgp.html>`_的键。

已知问题

到目前为止,该脚本只适用于手动分区的卷,即由未加密的``/boot``分区和加密的根``/`` 分区组成。

请不要选择你所使用的操作系统为本指南提供的自动全盘加密功能。在Ubuntu和Debian上使用安装界面自动进行分区时,你将面临反复的错误。

说明

  1. 安装依赖项

    $ sudo apt install scdaemon opensc gnupg2
    
  2. 创建智能卡-鲁克斯目录

    $ mkdir smartcard-luks && cd smartcard-luks
    
  3. 下载智能卡-鲁克斯-脚本

    $ wget https://raw.githubusercontent.com/daringer/smartcard-key-luks/main/smartcard-key-luks
    $ sudo chmod +x smartcard-key-luks
    
  4. 导出公钥

    要从GnuPG的钥匙圈中导出你的公钥。

    $ gpg2 --armor --export KeyID > pubkey.asc
    

    如果你已经将公钥上传到钥匙服务器(或将其储存在其他地方),你应该以你最习惯的方式检索它,并继续进行第5步。

  5. 为你的根分区确定并验证正确的LUKS设备名称。

    $ cat /etc/crypttab
    # if there is only one entry, you want the 1st column of this entry
    

    提示

    通常这应该是`nvme0n1p3_crypt`(用于NitroPC)或`sda3_crypt`(用于NitroPads)。 你可以而且应该通过检查`/etc/crypttab`中提到的UUID是指定的分区,即`/dev/disks/by-uuid/`中的符号链接。

  6. 以luks设备名称(例如:nvme0n1p3_crypt)和`pubkey.asc`为参数执行脚本。

    $ sudo ./smartcard-key-luks nvme0n1p3_crypt pubkey.asc
    

一旦你用OpenPGP公钥作为参数运行该脚本,它就会自动设置一个新的LUKS秘密,用该公钥进行加密,并设置crypttab、LUKS、initramfs和GRUB。

首先,你会被提示``User PIN``。

img1

一旦你解锁了Nitrokey,你会被提示你的``OLD passphrase``。这是你在安装时输入的加密卷的口令。

img2

备注

这是在你丢失Nitrokey或无法使用的情况下的一种后备选择。到目前为止,它还没有经过测试,用户必须意识到,如果后备方法不奏效,就有可能被锁在电脑外。

一旦你输入了口令,脚本就会在大约一分钟内完成设置。不要打断脚本,否则你可能会在重启后被锁定在你的电脑之外。

img3

完成了!

现在你必须重新启动,你应该能够使用你的Nitrokey来解锁你的加密驱动器。

使用方法

重新启动后,系统会提示你输入用户密码。

img5

输入你的用户密码以解锁硬盘

img6

进一步提示

更改密码锁

一旦完成这个设置,你就不应该再使用(gnome)*disks*工具来改变(后备)密码。正确的方法是像这样直接调用*cryptsetup*。

$ sudo cryptsetup luksChangeKey /dev/nvme0n1p3

`nvme0n1p3`是你为之设置钥匙的分区。

使用多个键

使用多个(硬件)安全密钥是很容易的,这样每个密钥都能独立解锁LUKS驱动器。只要导出多个公钥,同时*将多个密钥*传给设置脚本,像这样。

$ sudo ./smartcard-key-luks nvme0n1p3_crypt pubkey-1.asc pubkey-2.asc

设置持卡人姓名

在启动时输入PIN码以解密LUKS根分区时,会向用户展示一个持卡人。请使用``$ gpg --edit-card``并在提示中输入 ``admin<xid="189"></x>`和``name``来设置OpenPGP卡(Nitrokey Storage 2或Nitrokey Pro 2)的持卡人。

替换/删除钥匙

不可能直接添加/删除钥匙。因此,你需要删除/删除旧的设置,然后用指定的钥匙重新运行设置。

从luks-device(nvme0n1p3)中删除密钥文件(路径,如果你使用了上面的脚本)。

$ sudo cryptsetup luksRemoveKey /dev/nvme0n1p3 /etc/cryptsetup-initramfs/cryptkey.gpg

删除密钥文件本身。

$ sudo rm /etc/cryptsetup-initramfs/cryptkey.gpg

重新运行上述设置。

用X509证书解锁LUKS2

SystemD支持使用X509证书解锁LUKS2分区,在`Vladimir Timofeenko的个人博客上有一篇关于如何实现这一功能的精彩博客文章。