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

Jump to content
< Dm-crypt (简体中文)

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

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

## 总览

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

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

## 分区

这个例子说的是对 `/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#crypttab 和 Dm-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

Category:

- Data-at-rest encryption (简体中文)

Hidden category:

- Pages with broken section links