eCryptfs 是在 Linux 内核 2.6.19 版本中,由IBM公司的Halcrow,Thompson等人引入的一个功能强大的企业级加密文件系统,它支持文件名和文件内容的加密。

一、eCryptfs架构设计

图片摘自《eCryptfs: a Stacked Cryptographic Filesystem》

eCryptfs的架构设计如图所示。eCryptfs堆叠在底层文件系统之上,用户空间的eCryptfs daemon和内核的keyring共同负责秘钥的管理,当用户空间发起对加密文件的写操作时,由VFS转发给eCryptfs ,eCryptfs通过kernel Crypto API(AES,DES)对其进行加密操作,再转发给底层文件系统。读则相反。

eCryptfs 的加密设计受到OpenPGP规范的影响,其核心思想有以下两点:

1.文件名与内容的加密

eCryptfs 采用对称秘钥加密算法来加密文件名及文件内容(如AES,DES等),秘钥FEK(FileEncryption Key)是随机分配的。相对多个加密文件使用同一个FEK,其安全性更高。

2.FEK的加密

eCryptfs 使用用户提供的口令(Passphrase)、公开密钥算法(如 RSA 算法)或 TPM(Trusted Platform Module)的公钥来加密保护FEK。加密后的FEK称EFEK(Encrypted File Encryption Key),口令/公钥称为 FEFEK(File Encryption Key Encryption Key)。

二、eCryptfs的使用

这里在ubuntu下演示eCryptfs的建立流程。

1.  安装用户空间应用程序ecryptfs-utils

2. 发起mount指令,在ecryptfs-utils的辅助下输入用户口令,选择加密算法,完成挂载。挂载成功后,将对my_cryptfs目录下的所有文件进行加密处理。

3. 在加密目录下新增文件,当umount当前挂载目录后,再次查看该目录下文件时,可以看到文件已被加密处理过。

三、eCryptfs的加解密流程

图片摘自《eCryptfs: a Stacked Cryptographic Filesystem》

eCryptfs对数据的加解密流程如图所示,对称密钥加密算法以块为单位进行加解密,如AES-128。eCryptfs 将加密文件分成多个逻辑块,称为 extent,extent 的大小默认等于物理页page的大小。加密文件的头部存放元数据Metadata,包括File Size,Flag,EFEK等等,目前元数据的最小长度是8192个字节。当eCryptfs发起读操作解密时,首先解密FEKEK拿到FEK,然后将加密文件对应的 extent读入到Page Cache,通过 Kernel Crypto API 解密;写操作加密则相反。

下面我们基于eCryptfs代码调用流程,简单跟踪下读写的加解密过程:

1.  eCryptfs_open流程

ecryptfs_open的函数调用流程如图所示,open函数主要功能是解析底层文件Head的metadata,从metadata中取出EFEK,通过kernel crypto解密得到FEK,保存在ecryptfs_crypt_stat结构体的key成员中,并初始化ecryptfs_crypt_stat对象,以便后续的读写加解密操作。具体的可以跟踪下ecryptfs_read_metadata函数的逻辑。

2.  eCryptfs_read流程

ecryptfs_decrypt_page()核心代码

crypt_extent()核心代码

四、eCryptfs的缺点

1、性能问题。我们知道,堆叠式文件系统,对于性能的影响是无法忽略的,并且eCryptfs还涉及了加解密的操作,其性能问题应该更为突出。从公开资料显示,对于读操作影响较小,写操作性能影响很大。这是因为,eCryptfs的Page cache中存放的是明文,对于一段数据,只有首次读取需要解密,后续读操作将没有这些开销。但对于每次写入的数据,涉及的加密操作开销就会较大。

2、安全隐患

上面讲到,eCryptfs的Page cache中存放的是明文,如果用户空间的权限设置不当或被攻破,那么这段数据将会暴露给所有应用程序。这部分是使用者需要考虑优化的方向。

五、结语

本文主要对eCryptfs的整体架构做了简单阐述,可能在一些细节上还不够详尽,有兴趣的同学可以一起学习。近些年,随着处理器和存储性能的不断增强,eCryptfs的性能问题也在一直得到改善,其易部署、易使用、安全高效的优点正在日益凸显。

参考文献:

1、eCryptfs:a Stacked Cryptographic Filesystem,Mike Halcrow,April 1, 2007

长按关注

内核工匠微信

Linux 内核黑科技 | 技术文章 | 精选教程

Linux加密文件系统eCryptfs介绍相关推荐

  1. Linux及文件系统基本介绍

    Linux及文件系统基本介绍 1   互联网行业现状 在服务器端市场: 超级计算机 2014年11月的数据显示前500系统中的485个系统都在运行着 Linux 的发布系统,而仅仅只有一台运行着 Wi ...

  2. linux加密文件系统

    [导读]本文将详细介绍利用dm-crypt来创建加密文件系统的方法.与其它创建加密文件系统的方 法相比,dm-crypt系统有着无可比拟的优越性:它的速度更快,易用性更强.除此之外,它的适用面也很广, ...

  3. linux中的fs文件夹,linux上使用eCryptFS加密文件夹的方法

    从前有一个摄影师,他不懂加密重要文件,也不懂修电脑,结果你懂的.以下就介绍下linux的加密方法及eCryptFS: 加密的类型 我们基本上有两种不同的方法可以对文件和目录进行加密.一种方法是,文件系 ...

  4. linux下efs加密技术,在Linux系统中的加密文件系统应用(EFS)

    在Linux系统中的加密文件系统应用(EFS) 开源系统在企业中尤其是在服务器的构建和数据存储中得到了普遍的应用和推广,其安全问题得到了大家的关注.基于这些考虑,开源系统在数据安全方面提供了许多优秀和 ...

  5. 文件系统加密 嵌入式Linux,基于Linux的NAND Flash加密文件系统的设计与实现

    摘要: NAND Flash以其大容量,低成本,低功耗,抗震荡在非易失存储介质中占据重要地位,已经被广泛应用于消费型电子,航空设备等领域.但是由于NANDFlash的物理特性不同于磁盘存储设备,需要为 ...

  6. linux系统移植篇(四)—— 根文件系统使用介绍

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  7. linux中文件系统相关命令,linux磁盘、文件系统相关命令介绍

    分区管理工具介绍 1. fdisk:列出指定磁盘设备上的分区情况 格式:fdisk -l [-u] [device...] fdisk device 子命令:管理功能 p: print, 显示已有分区 ...

  8. Linux 加密解密技术基础及OpenSSL介绍

    Linux 加密解密技术基础 基础概念 信息安全防护的目标 安全防护环节 安全攻击类型(STRIDE) 安全设计的基本原则 常用的安全技术 安全的解决方案 1.加密和解密 2.服务 3.密钥算法和协议 ...

  9. linux系统加密服务,玩转Ubuntu Linux之加密文件系统篇

    本文将详细介绍利用dm-crypt来创建加密文件系统的方法.与其它创建加密文件系统的方法相比,dm-crypt系统有着无可比拟的优越性:它的速度更快,易用性更强.除此之外,它的适用面也很广,能够运行在 ...

最新文章

  1. Redis为什么这么快?一文深入了解Redis内存模型!
  2. android读取短信内容简书,Android 获取App信息
  3. review what i studied `date` - 2017-3-31
  4. 华为云TaurusDB性能挑战赛-java赛题mvn编译时报错:不支持 diamond 运算符
  5. cacti linux cpu datasource,Cacti 0.8.8b 硬盘、网络流量、cpu、内存告警配置
  6. HashMap底层实现及原理
  7. spring boot面试_Spring Boot面试问题
  8. 山石网科-Hillstone-SC-***(SSL-***)之配置终结篇
  9. Effective C++笔记_条款35 考虑virtual 函数以外的其他选择
  10. App_Offline.htm 功能,app_offline.htm 是怎样产生的?
  11. C++入侵电脑远程控制,体验一把做黑客的感觉!
  12. C++ 语言 std::is_same
  13. 自动控制系统的典型环节
  14. Granted QOS different to Requested QOS
  15. 超详细图文保姆级教程:App开发新手入门(一)
  16. 侠客群控引擎二次开发SDK可用方法大全(持续更新)
  17. python3.6 opencv3.4.3使用surf特征出错【解决方案】
  18. Android修改字体大小
  19. 【CC】| 创建三维模型教程
  20. 场景特征描述子(全局特征)-GIST

热门文章

  1. Java锁与线程的那些“不可描述”的事儿
  2. c语言switch函数的作用,c语言的switchcase语句
  3. C 语言实现简易区块链
  4. 赛扬J4105和赛扬N5095哪个好
  5. Bailian1664 Placing apples【递推+记忆化递归】
  6. 弘辽科技:拼多多24小时不发货怎么办?如何发货?
  7. 基于Eclipse+Java+Swing+Mysql图书信息管理系统
  8. 中国省数据字典表sql
  9. python删除指定元素 多个_Python List remove()删除多个元素
  10. 蓝桥杯OJ示例题目之A+B问题——掌握获取输入的基本方法(Python)