dm-crypt/加密非root文件系统
以下是一些用 dm-crypt 加密辅助(secondary)文件系统(即,非根文件系统)的例子。
加密辅助文件系统不会对操作系统、程序文件进行加密,因此通常只用于单独保护敏感数据。对于USB驱动器等外部介质,进行加密可确保在不同计算机上使用时,数据安全不受威胁。此外,也可按照数据访问人员将数据分类,分别使用不同的密钥加密。
dm-crypt 是块级别加密层,其将加密整个块设备(例如,分区和回环设备)。
若要加密单个文件,需要使用文件系统层级的加密。例如使用eCryptfs 或 EncFS。有关保护隐私数据的更多信息,参见静态数据加密。
本例介绍的是对 /home 分区的加密,但相关方法也可以应用到其它包含用户数据的非根分区。
/home目录单独分配一个分区,也可以所有用户的/home目录共享一个分区。下文假定用于/home目录的分区已经创建。若该分区曾用于其它用途,因而包含了数据,可能需要使用dm-crypt专用方案安全擦除分区。注意,只擦除一个分区,而不擦除整个磁盘,可能仍会泄露一些数据。
建立 LUKS 头:
# cryptsetup options luksFormat device
device应对应已创建的分区。options的取值参见Dm-crypt/设备加密#LUKS_模式的加密选项。
使用设备映射器对设备进行解密,以对加密的分区进行操作:
# cryptsetup open device name
分区解密之后,会被映射成块设备 /dev/mapper/name。之后,建立文件系统:
# mkfs.fstype /dev/mapper/name
若所有用户共享/home目录,则可将创建好的文件系统挂载到/home;若该文件系统是某个用户专用的,则挂载到/home/username。参见 #手动挂载和卸载。
挂载分区:
# cryptsetup open device name # mount /dev/mapper/name /mnt/home
卸载:
# umount /mnt/home # cryptsetup close name
有三种不同方法来自动化解锁分区并挂载文件系统。
配置 /etc/crypttab 文件,systemd会在系统启动过程中自动解析该文件,并以此解密相应设备。若要挂载所有用户共用的home分区,或要自动挂载其它加密的块设备,推荐使用本方法。
可参考Dm-crypt/系统配置#crypttab。此外,Dm-crypt/系统配置#在启动时挂载中提供了示例配置。
Cryptsetup 对设备进行操作。因此,若要使用文件容器,需要配置回环设备。好在,在后台,cryptsetup可自动管理回环设备(请见 Gentoo:Custom_Initramfs#Encrypted_keyfile),无需手动调用 losetup。
$ dd if=/dev/urandom of=bigsecret.img bs=100M count=1 iflag=fullblock
这会创建大小为 100 MiB 的 bigsecret.img 文件。
注意,不要遗漏iflag=fullblock选项。否则,可能出现“部分读”问题。详见dd#Partial_read:_copied_data_is_smaller_than_requested。
要避免之后调整容器大小的麻烦,在创建文件容器时,确保其大小大于要加密的文件的总大小、文件系统内部数据/元数据开销和LUKS头的总和。若使用LUKS,则仅其元数据就可能需要多达16MiB的空间。创建一个小于 LUKS头(16MiB)大小的文件容器会在打开设备时报错Requested offset is beyond real size of device bigsecret.img。
之后的操作和#分区中的相同,但要将 device 替换为 bigsecret.img。
cryptsetup 会自动寻找可用的回环设备设备并将文件附加到设备上。在卸载之后,文件容器应该相应地关闭,cryptsetup之后会分离使用的回环设备。
首先,查找未使用的回环设备:
# 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