更多新鲜技术资讯,欢迎关注公众号: 深度极客
了解更多开源技术,请关注以上公众号
相关术语
缩写 | 全称 | 描述 |
---|---|---|
CryFS | CryFS | 一种安全的文件加密的工具 |
Fuse框架 | Filesystem In UserSpace | 一个实现在用户空间的文件系统框架 |
loop | loop | 像块设备一样访问一个文件 |
dev-mapper | device mapper | Linux内核提供的块设备映射框架 |
加密方式现状
在Linux上有较多加密方式,比如基于FUSE框架、堆栈式文件系统、设备映射等,以下将对各种加密方式进行阐述。
如上图所以,各个加密方式的区别实质上就是加密位置的不同。加密位置大致分为三类,图中标识为1的是堆栈式文件系统层,标识为2的是dev-mapper
层,标识为3的是FUSE框架。
三种加密方式的实现原理有所不同,以下进行逐个说明:
-
基于FUSE框架实现加密
不同于其它加密方式,该方式需要基于框架接口在用户态自己实现一套文件系统,FUSE涉及三个模块:
– FUSE内核模块<内核态>
–
LibFuse
模块<用户态>– 用户实现模块<用户态>
图-2 FUSE框架原理图 如上图所示,FUSE内核模块实现了
VFS
虚拟文件系统接口,从上层接收文件操作请求,传递给在用户态的LibFuse
,LibFuse
再传递给应用程序。文件系统应用实现了框架接口,最终以后台进程的形式维护加密系统,该方式具有代表性的实现是CryFS
。<优点>
基于Fuse框架实现方式自由度较高,可以按要求创建指定大小的块,调用第三方或自己实现加密算法,可以添加文件操作日志等。因为脱离于内核,所以可以实现跨平台。总之,可以根据具体需求进行定制化开发。
<缺点>
通过该方式加密可能会造成除数据加解密以外的其它问题,因为通过该方式的实现需要重写一套文件系统,如果在实现时未遵循通用准则或发生错误,则在获取文件信息时可能会出现不正确的情况。
此外,根据调研,基于此方式实现的文件系统效率大大低于
ext4
等文件系统,特别是如果针对文件元数据进行加密后,删除1G
文件会等待数秒的时间。 -
堆栈式文件系统加密
堆栈式文件系统实现在已有的文件系统之上,在用户写入数据之前获取原始数据,并进行加密处理;在读取硬盘数据时进行解密处理再传递给上层,对用户来说文件的操作完全不受影响。该方案中具有代表性的实现是
eCryptfs
和EncFS
。
<优点>
堆栈式文件系统存在于VFS
和文件系统之间,该方式不会修改已存在的文件系统,且相较于块加密来说,并不需要预先创建空间,可以在运行时动态扩容;在运行速度方面要高于通过Fuse加密,所有数据是存放在Block里面,复制、删除文件效率都较Fuse快很多。
<缺点>
文件存取效率方面要低于块加密。
基于该方式实现的工具普遍不具备对文件目录、文件大小加密等功能,可能让攻击者进行目录对比,判断出存储内容。
-
块设备加密
块设备加密是运行在文件系统层之下,确保写入特定块设备的所有内容均已加密。用这种方式加密意味着就算整个块设备处于脱机状态,它的硬盘内容看起来就是一堆随机数据,没有办法确定里面的文件内容。
该方式比较有代表性的实现是
dm-cryp
t和VeraCrypt
。
图-4 Device mapper层级图 <优点>
块设备加密位置靠近底层,不关注加密内容,效率相较于其它加密方式要高很多,且不会改变原来的文件系统,不存在兼容性问题。
<缺点>
基于块设备加密需要预先创建一个固定大小的分区或loop文件,该方式决定了其无法进行加密空间的动态扩展,缺少灵活性,且在使用前需要等待分区或loop文件的建立,较为耗时。
预先分配还会存在一个资源浪费的问题,比如预分配了
10G
的空间但是实际使用的只有10M
,在多用户的情况下该问题更为明显。
下表对三种加密方式进行了比较:
比较项 | 块设备加密 | 堆栈式文件系统加密 | 基于Fuse加密 |
---|---|---|---|
加密对象 | 块设备 | 文件 | 文件 |
加密数据存储容器 | 硬盘或分区 / 一个作为 loop device的文件 | 已经存在于现有文件系统上的目录 | 已经存在于现有文件系统上的目录 |
与文件系统的关系 | 运行于文件系统层之下,不用关心存储数据内容 | 运行于已有的文件系统层之上, 在读写的时候自动进行加/解密处理 | 基于框架接口自己实现了一套文件系统 |
文件元数据(文件个数、大小等)被加密 | 是 | 否 (文件名和目录名可以加密) | 是否加密取决于具体实现 |
可以加密整块设备或分区 | 是 | 否 | 否 |
可以在不用预分配的前提下进行使用 | 否 | 是 | 是 |
可以在不访问块设备的前提下进行加密,例如NFS或Samba共享,云存储等 | 否 | 是 | 是 |
加密工具现状
基于FUSE
框架实现的加密工具最具代表性的就是CryFS
,这里不再赘述。以下将针对基于其它加密方式实现的工具进行介绍:
-
EncFS
EncFS
的使用非常类似CryFS
,都是创建基础目录和挂载目录,将文件的真实数据存放在基础目录中。但根据Taylor Hornby
的安全审核,Encfs
的当前实施存在漏洞或可能容易受到多种攻击。 例如,具有对加密数据具有读/写访问权限的攻击者可能会降低随后加密的数据的解密复杂性,而不会被合法用户注意到,或者可能会使用时序分析来推断信息。EncFS
还有一个比较严重的问题,它不会对文件的目录结构和大小进行加密,攻击人员可以根据目录结构和文件大小进行比对,猜测加密的内容。 -
eCryptfs
该工具比
EncFS
效率稍高,工作在内核空间,但没有完整性检查,和EncFS
一样,没有对文件目录结构进行加密。 -
gocryptfs
gocryptfs
是用go语言开发的一套加密方式,它的灵感来自于EncFS
,没有已知的安全漏洞,安全性较高,并得到EncFS
开发人员的推荐。缺点和
EncFS
一样,没有对文件目录结构进行加密。 -
VeraCrypt
该工具是一款免费开源跨平台的实时磁盘文件加密工具,它是基于知名的开源加密工具
TrueCrypt
项目衍生而来。缺点是不支持完整性检查,非root权限不能创建或者销毁存储容器,并且不支持动态扩容,在易用性上不如其它加密工具。
下表对各工具进行了对比:
比较项 | CryFS | gocryptfs | EncFS | eCryptfs | VeraCrypt |
---|---|---|---|---|---|
支持局部数据修改 | yes | yes | yes | yes | no |
没有已知的安全风险 | yes | yes | no | yes | yes |
加密元数据和文件大小 | yes | no | no | no | yes |
加密目录结构 | yes | no | no | no | yes |
支持动态扩容 | yes | yes | yes | yes | no |
不用预分配容器 | yes | yes | yes | yes | no |
【小结】
经过分析比较,适用于本地加密并且具备动态扩容的加密方式为堆栈式加密和FUSE加密,但是堆栈式文件系统的普遍问题是没有对文件的元数据进行加密。
更多新鲜技术资讯,欢迎关注公众号: 深度极客