dm-crypt/加密非根文件系统
以下是使用 dm-crypt 加密次要(即非根)文件系统的示例。
概述
加密次要文件系统通常仅保护敏感数据,而将操作系统和程序文件保持未加密状态。这对于加密外部介质(如 USB 驱动器)非常有用,以便可以安全地将其移动到不同的计算机上。用户也可以根据谁有权访问而选择分别加密不同的数据集。
由于 dm-crypt 是一个块级加密层,它仅加密整个块设备,例如分区和回环设备 (loop devices)。加密单个文件需要文件系统级加密层,例如 eCryptfs 或 EncFS。有关保护私有数据的通用信息,请参阅 静态数据加密。
分区
本示例涵盖了 /home 分区的加密,但它也可以应用于任何其他包含用户数据的同类非根分区。
/home 目录放在一个分区上,或者为所有用户的 /home 目录创建一个公共分区。假设分区已经存在。如果该分区之前包含数据,您可以考虑安全擦除分区(dm-crypt 特定方法)。擦除单个分区而非整个磁盘仍可能泄露部分数据。
然后使用以下命令设置 LUKS 头部:
# cryptsetup options luksFormat device
将 device 替换为之前创建的分区。有关可用 options 等详细信息,请参阅 dm-crypt/设备加密#LUKS 模式的加密选项。
要访问加密分区,请使用设备映射器 (device mapper) 将其解锁:
# cryptsetup open device name
解锁分区后,它将出现在 /dev/mapper/name。现在使用以下命令创建您选择的文件系统:
# mkfs.fstype /dev/mapper/name
将文件系统挂载到 /home;如果该分区仅供单个用户访问,则挂载到 /home/username,请参阅 #手动挂载与卸载。
手动挂载与卸载
挂载分区:
# cryptsetup open device name # mount /dev/mapper/name /mnt/home
卸载分区:
# umount /mnt/home # cryptsetup close name
自动解锁与挂载
有三种不同的方案可以实现解锁分区并挂载其文件系统的自动化流程。
在启动时
通过使用 /etc/crypttab 配置文件,systemd 的自动解析会在启动时执行解锁。如果您想为所有用户的家目录使用一个公共分区,或自动挂载另一个加密块设备,这是推荐的方案。
参考信息请参阅 dm-crypt/系统配置#crypttab,配置示例请参阅 dm-crypt/系统配置#在启动时挂载。
在用户登录时
文件容器
Cryptsetup 操作对象是设备,因此在使用文件容器时需要一个回环设备 (loop device)。但 cryptsetup 可以在后台处理回环设备的管理(参见 Gentoo:Custom Initramfs#Encrypted keyfile),用户无需手动调用 losetup。
首先,使用 dd 和合适的随机数生成器创建一个加密文件容器:
$ dd if=/dev/urandom of=bigsecret.img bs=100M count=1 iflag=fullblock
这将创建一个大小为 100 mebibytes 的文件 bigsecret.img。
确保不要遗漏 iflag=fullblock 选项,否则 dd 可能会返回部分读取。详见 dd#部分读取:复制的数据小于请求的大小。
为了避免以后不得不调整容器大小,请确保容器大小大于待加密文件的总大小,再加上内部文件系统/元数据开销以及 LUKS 头部。如果您将使用 LUKS 模式,仅其元数据头部就需要高达 16 mebibytes。创建的文件如果小于 LUKS2 头部(16 MiB),在尝试打开设备时会提示 Requested offset is beyond real size of device bigsecret.img 错误。
后续步骤与 #分区 中描述的相同,但请使用 bigsecret.img 代替 device。
在后台,cryptsetup 将负责寻找一个空闲的回环设备并将文件附加到该设备上。卸载后,应相应地关闭文件容器;cryptsetup 随后也会分离所使用的回环设备。
使用 losetup 进行手动挂载与卸载
要手动挂载一个内部包含 LUKS 和 ext4 文件系统的文件容器,首先寻找一个未使用的回环设备:
# losetup --find
然后将文件容器附加到回环设备,例如 loop0:
# losetup /dev/loop0 bigsecret.img
/dev/loop0: No such file or directory 错误,您需要先以 root 身份使用 modprobe loop 加载内核模块。在目前的内核(3.2 及以后)中,回环设备是按需创建的。请以 root 身份使用 losetup -f 请求一个新的回环设备。现在继续进行常规的 cryptsetup 操作:
# cryptsetup open /dev/loop0 secret # mount -t ext4 /dev/mapper/secret /mnt/secret
按照相反的顺序操作以正确卸载容器:
# umount /mnt/secret # cryptsetup close secret
分离所使用的回环设备:
# losetup --detach /dev/loop0