问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

eCryptfs-你的下一个加密系统,何必是bitlocker

创作时间:
作者:
@小白创作中心

eCryptfs-你的下一个加密系统,何必是bitlocker

引用
1
来源
1.
https://www.n2ptr.space/2024/04/17/eCryptfs-%E4%BD%A0%E7%9A%84%E4%B8%8B%E4%B8%80%E4%B8%AA%E5%8A%A0%E5%AF%86%E7%B3%BB%E7%BB%9F%EF%BC%8C%E4%BD%95%E5%BF%85%E6%98%AFbitlocker/

eCryptfs是Linux内核原生的一种堆叠式加密文件系统,它在文件被写入或从下层文件系统读取时对其加密和解密。本文将详细介绍eCryptfs的架构设计、加密解密流程、使用方法以及优缺点。

什么是eCryptfs

eCryptfs是Linux内核原生的一种堆叠式加密文件系统(stacked cryptographic filesystem)。堆叠式文件系统是指以现有挂载的文件系统(称为下层文件系统-lower filesystems)为基础,在其之上构建新的文件系统。eCryptfs是一种堆叠式文件系统,它在文件被写入或从下层文件系统读取时对其加密和解密操作。

eCryptfs的架构设计

eCryptfs是夹在底层文件系统和VFS(Virtual Filesystem Switch)之间的一层加密功能,并且属于Kernel的一部分。当应用程序尝试读写加密的目录的时候,eCryptfs通过与Kernel的Crypto API、Keyring以及Userspace里面eCryptfs daemon的通信进行加密和解密操作。其中Userspace的eCryptfs daemon和Kernel的Keyring共同负责秘钥的管理,而Crypto API则负责使用密钥对数据进行加密和解密。

eCryptfs的加密解密流程

关于密钥

eCryptfs的加密解密涉及到使用“有层次结构”的密钥(a hierarchy of keys),在认证流程中涉及到三种密钥:

  • FEK(File Encryption Key):由系统生成,用来加密下层文件系统的文件
  • FEKEK(File Encryption Key Encryption Key):由用户指定,用来加密FEK
  • EFEK(Encrypted File Encryption Key):FEK经过FEKEK加密之后生成的Key,保存在文件系统中

关于加密方式

eCryptfs默认采用AES加密,这是一种分块加密算法,在上图中加密之后的分块对应的是Encrypted Data Extent;在加密文件的头部存储了加密文件的信息(包含EFEK),其对应的解密后文件也遵循相同的结构。

加密/解密流程

  1. 用户提供FEKEK,系统用这个密钥解密储存再Header里面的EFEK,得到FEK
  2. eCryptfs使用这个密钥通过Crypto API解密在底层文件系统的加密文件,将其保存到eCryptfs File里面一个叫做Page Cache的地方
  3. 用户可以直接像访问没有加密的目录一样访问eCryptfs。如果要加密的话,流程则正好相反

简单的eCryptfs使用

eCryptfs Utils

Ubuntu官方使用的加密方法,一般用来加密/home这个目录。在安装Ubuntu的时候有个加密主目录的选项,就是使用这个工具加密的,默认底层目录始终是/.Private/。

挂载和解挂载命令如下:

ecryptfs-mount-private
ecryptfs-umount-private

用户可以在shell里面通过

ecryptfs-setup-private

工具设置开机的时候是否自动挂载加密的目录。

ecryptfs-simple

比eCryptfs Utils自由度更高一点的eCryptfs管理工具,允许用户指定底层目录(需要另外安装)。

挂载:

ecryptfs-simple -a /path/to/foo /path/to/bar

解挂载:既可以输入底层目录的路径,也可以输入挂载点的路径

ecryptfs-simple -u /path/to/foo # 底层目录路径
ecryptfs-simple -u /path/to/bar # 挂载点路径

手动加密和解密

eCryptfs使用mount和umount命令来挂载和解挂载目录

sudo mount -t ecryptfs /secret /secret # 挂载目录
sudo umount -t ecryptfs /secret # 解挂载目录

第一个secret是底层文件系统的地址,第二个secret则是eCryptfs的挂载点。这两个地址的名称可以不同,但是建议采用相同的名称来实现一个叫Layover Mount的东西(大概的意思就是挂载之后就看不到原来的底层文件夹了?)。

在挂载期间,我们对/secret的访问实际上是对eCryptfs里面的/secret做访问,读写数据也是在eCryptfs中进行。而解挂载之后,我们就会看到加密之后的文件,通过常规手段自然是无法读取的。

和前两个管理工具的区别似乎就是可以指定一些比较详细的参数,比如加密方式之类的。

设置自动挂载方案以及加密算法的方法见[Arch Wiki:eCryptfs](设置自动挂载方案以及加密算法的方法见Arch Wiki:eCryptfs)

eCryptfs的优缺点

优点

  • 不需要单独开辟加密的分区,加密的单位不是驱动器而是目录
  • 底层文件系统的文件可以共享给其他用户,因为文件头部包含EFEK,只要有对方便有合适的FEKEK就能解密,灵活性高

缺点

  • 性能问题:eCryptfs对读操作性能影响较小,对写操作性能影响较大。这是因为其在读取文件的时候可以反复访问存储在Page Cache里面解密后文件,但是每次写入都必须进行一次加密操作
  • 安全问题:eCryptfs的Page Cache里面存储的是明文,它是通过权限的设置来保证不被其他应用程序读取的。如果权限设置不当,这些数据可能会暴露给未经授权的应用程序
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号