On Disk Encryption
Published on Oct 13, 2014
胡乱翻译自On Disk Encryption with Red Hat Enterprise Linux,个人笔记,随便看看。
硬盘加密
目标
我们的愿景是:在数据不在使用时保密硬盘数据。
情景
- 电脑丢失
- U盘丢失
- 一个月才用一次的个人金融信息
- 敏感隐私数据存储
不保护
- 应用不断读取和写入的数据(依靠权限控制、SElinux等)
- 在互联网上传输的数据(TLS)
- 键盘输入嗅探
两种基本方式
dm-crypt
: 块层级的加密。- 加密整个卷
- 通过设备映射实现
- 把加密后的块设备以虚拟明文块设备呈现
eCryptfs
: 文件系统加密- 加密单个文件
- 作为文件系统层实现
- 呈现明文文件
dm-crypt和LUKS块设备加密
dm-crypt和LUKS块设备加密
- =dm-crypt=提供块加密能力
- =LUKS=:Linux Unified Key Setup。一种硬盘加密标准。定义密钥管理和在硬盘上的格式。
应用场景1:保护用户文件
- 加密=/home=分区(比如’/dev/sda3’)
- 让所安装的OS不加密
演示
警告:不要试,这个例子就看看。会摧毁/home下数据你可以试试下个例子
首先别忘了加载必要的内核模块
modprobe aes modprobe dm_crypt
-
初始化随机数据
dd if=/dev/urandom of=/dev/sda3
-
格式化LUKS加密层:
cryptsetup luksFormat /dev/sda3
-
打开LUKS加密层:
cryptsetup luksOpen /dev/sda3 home_plaintext
-
格式化文件系统:
mkfs.ext4 /dev/mapper/home_plaintext
-
挂载准备好的文件系统,写入=/etc/fstab=:
/dev/mapper/home_plaintext /home ext4 defaults 0 0
-
在加密硬盘上注册,写入=/etc/crypttab=
home_plaintext /dev/sda3
应用场景2:一个文件加密容器
仅仅加密文件。
演示:
-
创建一个100M的文件:
dd if=/dev/urandom of=crypt.img bs=1M count=100
-
把文件和设备连接起来:
losetup /dev/loop0 crypt.img
-
格式化LUKS加密层:
cryptsetup luksFormat /dev/loop0
-
打开LUKS加密层:
cryptsetup luksOpen /dev/loop0 container
-
格式化文件系统(可以先用=dm-table=或者=ls /dev/mapper=来检查)。
mkfs.ext4 /dev/mapper/container
-
挂载文件系统
mount /dev/mapper/container /mnt
- 这时就可以向=/mnt=下写入想加密的文件了。
-
使用完毕后,卸载分区
umount /mnt
-
关闭luks磁盘:
cryptsetup luksClose container
-
设备文件脱钩:
losetup -d /dev/loop0
这时你的文件就加密保存在=container=中。
ecrypt-fs
eCryptfs文件系统
场景:创建一个隐私文件夹
- 创建一个=~/Private=内的文件是加密的。
- =~/Private=外的文件都是明文的
展示
首先别忘了加载内核模块,如果没有默认加载的话:
modprobe ecryptfs
-
创建一个表文件夹’/Private’和里文件夹’/.Private’
mkdir -m 700 ~/.Private mkdir -m 500 ~/Private
-
将里文件夹挂载到表文件夹上:
mount -t ecryptfs .Private Private
- 对表文件夹操作写入等等
-
卸载表文件夹,只剩下加密后的里文件夹
umount ~/Private
为最终用户创建私密文件夹
ecryptfs-util提供了方便的脚本:
ecryptfs-setup-private
ecryptfs-mount-private
ecryptfs-umount-private
提供了几个便利:
- 提升挂载和卸载权限
- 需要是组=ecryptfs=中的成员
- 用登录密码封装FEKEK(文件加密密钥密钥)
暂不讨论,我这里出错了。