dm-crypt/加密非root文件系统
以下是一些用 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
自动解锁并挂载[编辑 | 编辑源代码]
有三种不同方法来进行自动化解锁分区并挂载文件系统。
启动时解锁[编辑 | 编辑源代码]
配置 /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 设备。
使用 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