dm-crypt/加密非根文件系统
以下是使用 dm-crypt 加密辅助(即非根)文件系统的示例。
概述
加密辅助文件系统通常只保护敏感数据,而保持操作系统和程序文件不加密。这对于加密外部介质(如 USB 驱动器)非常有用,以便可以安全地将其移动到不同的计算机。人们也可以选择根据谁有权访问数据来分别加密数据集。
由于 dm-crypt 是一个块级别加密层,它只加密整个块设备,例如分区和循环设备。加密单个文件需要文件系统级别的加密层,例如eCryptfs 或 EncFS。有关保护私有数据的一般信息,请参阅静态数据加密。
分区
本示例涵盖了 /home
分区的加密,但它也可以应用于任何其他包含用户数据的可比较的非根分区。
/home
目录放在一个分区上,或者为所有用户的 /home
目录创建一个公共分区。假设分区已存在。如果它以前包含数据,您可以考虑安全擦除分区(dm-crypt 特定方法)。擦除单个分区而不是整个磁盘仍然可能会泄漏一些数据。
然后使用以下命令设置 LUKS 标头
# cryptsetup options luksFormat device
将 device
替换为先前创建的分区。有关可用 options
等详细信息,请参阅dm-crypt/Device encryption#LUKS 模式的加密选项。
要访问加密分区,请使用设备映射器解锁它,使用
# 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
自动解锁和挂载
有三种不同的解决方案可以自动化解锁分区和挂载其文件系统的过程。
在启动时
使用 /etc/crypttab
配置文件,解锁在启动时通过 systemd 的自动解析发生。如果您想为所有用户的 home 分区使用一个公共分区或自动挂载另一个加密块设备,这是推荐的解决方案。
有关参考信息,请参阅 dm-crypt/System configuration#crypttab,有关示例设置,请参阅 dm-crypt/System configuration#在启动时挂载。
在用户登录时
文件容器
Cryptsetup 使用设备进行操作,因此在使用文件容器时需要循环设备。但是 cryptsetup 可以在后台处理循环设备管理(请参阅 Gentoo:Custom Initramfs#加密密钥文件),用户不需要手动调用 losetup。
首先,从使用 dd 创建加密文件容器开始,使用适当的随机数生成器
$ dd if=/dev/urandom of=bigsecret.img bs=100M count=1 iflag=fullblock
这将创建文件 bigsecret.img
,大小为 100 mebibytes。
确保不要省略 iflag=fullblock
选项,否则 dd 可能会返回部分读取。有关详细信息,请参阅 dd#部分读取:复制的数据小于请求的数据。
为了避免以后需要调整大小容器,请确保使其大于要加密的文件总大小,加上内部文件系统/元数据开销,加上 LUKS 标头。如果您要使用 LUKS 模式,则仅其元数据标头就需要高达 16 mebibytes。创建小于 LUKS2 标头 (16 MiB) 的文件在尝试打开设备时会给出 Requested offset is beyond real size of device bigsecret.img
错误。
后续步骤与 #分区 中描述的步骤相同,但不要使用 device
,而是使用 bigsecret.img
。
在后台,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