dm-crypt (简体中文)/Encrypting a non-root file system (简体中文)

From ArchWiki

翻译状态:本文是 Dm-crypt/Encrypting a non-root file system翻译。上次翻译日期:2022-08-11。如果英文版本有所更改,则您可以帮助同步翻译。

以下是一些用 dm-crypt 加密辅助文件系统(例如非 root 文件系统)的例子。

总览

在不加密操作系统和程序文件时加密辅助文件系统,通常只用于保护敏感数据。这对于加密外部介质很有用,例如 USB 驱动器,从而使它可以安全地在不同电脑使用。也可以根据谁有权限访问数据单独加密数据集。

因为 dm-crypt 是一个块级别加密层,它加密整个块设备,分区loop 设备。加密文件系统级加密层的单文件,例如 eCryptfsEncFS。请见静态数据加密获取有关保护隐私数据的通用建议。

分区

这个例子说的是对 /home 分区的加密,但是也可以应用到其他非根分区的、包含用户数据的分区。

提示: 你可能在一个分区上有某个用户专用的 /home 目录,或者是所有用户共用这个分区作为 /home 目录。

首先要保证分区是空的(上面没有建立文件系统)。如果有文件系统,删除这个分区并重新建立一个空的分区。然后对其安全擦除,参见 Dm-crypt/Drive preparation#Secure erasure of the hard disk drive.

接下来建立包含加密容器的分区。

建立 LUKS 头:

# cryptsetup options luksFormat device

device 替换成之前建立的分区。参见 Dm-crypt/Device encryption#Encryption options for LUKS mode 来知道 options 可以写什么。

为了对加密分区进行操作,用设备映射器来解锁它:

# cryptsetup open device name

解锁分区之后,它会被映射成块设备 /dev/mapper/name,现在要建立 文件系统

# mkfs.fstype /dev/mapper/name

把文件系统挂载到 /home;或者如果它是某个用户专用的的话,挂载到 /home/username,参见 #手动挂载和卸载

提示: 卸载并挂载一次来确定映射没有问题。

手动挂载和卸载

挂载分区:

# cryptsetup open device name
# mount -t fstype /dev/mapper/name /mnt/home

卸载:

# umount /mnt/home
# cryptsetup close name
提示: GVFS 也可以挂载加密分区。用支持 gvfs 的文件管理器(比如 Thunar)挂载该分区的时候,密码对话框就会弹出来。对于其他桌面环境,zulucryptAUR 也提供了图形界面。

自动解锁并挂载

有三种不同方法来进行自动化解锁分区并挂载文件系统。

启动时解锁

配置 /etc/crypttab 文件,systemd 的自动解析会在启动过程中自动解锁。如果home分区是所有用户一起用的(或者要自动挂载其他加密块设备),这种方法是最推荐使用的。

详细的设置例子请参考 Dm-crypt/System configuration#crypttabDm-crypt/System configuration#Mounting at boot time

用户登录时解锁

如果整个分区都是某个用户专用的 home 目录,则推荐使用 pam-exec

使用 pam_mount

文件容器

Cryptsetup 对设备进行操作,因此使用文件容器使需要一个 loop 设备。但是 cryptsetup 可以在后台负责管理 loop 设备(请见 Gentoo:Custom_Initramfs#Encrypted_keyfile),用户不需要手动调用 losetup

首先,用 dd 创建一个加密容器,并使用一个恰当的 随机数生成器:

$ dd if=/dev/urandom of=bigsecret.img bs=100M count=1 iflag=fullblock

这会创建 100 MB 的 bigsecret.img 文件。

确保没有忽略 iflag=fullblock 选项,否则 dd 可能只会返回部分读取。详情请见 dd#Partial read[损坏的链接:无效的章节]

要想避免之后必须调整容器大小,确保使其大于要加密的文件的总大小,加上内部文件系统/元数据开销和 LUKS header。如果你要使用 LUKS 模式,仅其元数据 header 就需要多达 16MB。创建一个小于 LUKS header (16MiB) 的文件会在打开设备时报错 Requested offset is beyond real size of device bigsecret.img

接下来的操作和#分区中所述的一样,但是要将 device 替换为 bigsecret.img

cryptsetup 会在后台寻找一个可用的 loop 设备并且将文件附加到设备上。在卸载之后,文件容器应该相应地关闭,cryptsetup 之后会分离使用的 loop 设备。

提示: 带有 dm-crypt 加密的容器是非常灵活的。请看看功能特性和 Tomb 的文档。它提供了一个 dm-crypt 的脚本包装用于快速灵活的处理。

使用 losetup 手动挂载和卸载

首先找到一个未使用的 loop 设备,手动挂载带有 LUKS 加密和 ext4 文件系统的文件容器:

# losetup --find

然后将文件容器附加到 loop 设备,例如 loop0:

# losetup /dev/loop0 bigsecret.img
注意: 如果报错 /dev/loop0: No such file or directory,你需要先以 root 用户执行命令 modprobe loop 加载内核模块。最近(Kernel 3.2) loop 设备是按需创建的。以 root 用户执行 losetup -f 命令请求新的 loop 设备。

现在执行普通的 cryptsetup 操作:

# cryptsetup open /dev/loop0 secret
# mount -t ext4 /dev/mapper/secret /mnt/secret

以相反的顺序执行以正确卸载容器:

 # umount /mnt/secret
 # cryptsetup close secret

要想分离使用的 loop 设备:

 # losetup --detach /dev/loop0