什么是 Encryption at rest

Encryption at rest是一个安全相关的概念,在网络上并没有找到一个统一的翻译方式,我个人把他翻译成 “静止数据加密”。

要了解Encryption at rest,首先我们要知道Data at rest,这个概念在维基百科上有很详细的解释。这里我简单总结一下。根据数据的状态可以将其分为3类,使用中的数据(data in use),传输中的数据(data in transit)和静止数据(Data at rest)。传输中的数据很好理解,就是通过网络或内存传输的数据。而警示数据和使用中数据的界限并不明确,一般认为静止数据是不会频繁变动的数据,而使用中的则是会频繁进行增删改查的数据,有的观点会认为使用中数据是静止数据的一个子集,因为使用中数据也需要在数据库或其他地方进行持久化。

静止数据包括很多种不同的类型,常见的包括数据库文件,系统缓存文件,临时文件。此外,excel表格,文档也都属于这一范畴,这些文件可以是在硬盘上,也可以在优盘,网络云存储,DVD等存储介质中。

知道了Data at rest后,Encryption at rest就很好理解了。是的,Encryption at rest就是指对静止数据进行加密。

为什么要做 Encryption at rest

我们都知道系统安全很重要,但是却时常忽略了存储在物理介质上的数据,而这些数据一旦泄露后果十分严重。如果未加密的数据库文件被未授权用户获得,他可以完整还原数据库中的数据。这是为什么Encryption at rest如此重要的原因。也是因为这个原因,越来越多的组织和政府部门要求他们的应用程序必须满足这一要求。

怎么做 Encryption at rest

静态数据加密的实现方式有很多,常见的有全盘加密和数据库透明加密(TDE),全盘加密是将磁盘上所有的数据进行加密,它在写入和读取磁盘时对数据进行加解密,微软的Bitlocker就是其中一种,它能够很好的应对物理磁盘被窃取的情况,但是如果数据被从磁盘上拷走,那么拷贝出去的数据是处于解密状态。另一种是则是数据库透明加密,这种加密方式在写入和读取数据库的时候会进行相应的加解密操作,所以即使数据库文件被窃取,只要主密钥还在,就不会造成数据丢失。

除了上面几种之外,我们还可以自己实现数据的加解密,并将加密后的数据存储到数据库中,不过这种方式实现成本较高,而且必须在项目启动时进行。

MySQL中TDE的实现

Mysql 作为最流行的数据库之一已经实现了数据库的透明加密操作,其实现方式根据所使用的版本有两种不同方式,他们的区别主要在秘钥管理方面

  1. keyring_file,所有版本的Mysql都这种秘钥管理方式,他将主秘钥存储在文件中,用户需要自行保证主秘钥的安全。

  2. keyring_okv, Mysql企业版支持的高级功能,可以直接和秘钥管理工具(如 Oracle Key Vault)集成,更加安全。

这里我们以keyring_file为例介绍MySQL的TDE加密使用方式。

  1. 插件安装,使用透明数据加密需要插件支持。
INSTALL PLUGIN keyring_file soname ‘keyring_file.so‘;

可以通过 set global keyring_file_data 来设置主秘钥文件文件地址,如果不指定则舒勇默认地址。此处的配置也可以通过修改Mysql的配置文件(my.cnf)来实现。

  1. 插件安装完成后,可以通过在修改表或创建表时加入 encryption='Y'来启用表的加密。下面是两个启用表加密的例子。
alter table table_name encryption=‘Y‘;


create table table_name(
   xxx INT NOT NULL ,
   xxxx VARCHAR(40) NOT NULL,
   PRIMARY KEY ( xxx )
) encryption='Y';
  1. 表呗加密以后可以通过定期执行下面SQL语句来更新主秘钥以提高安全性
ALTER INSTANCE ROTATE INNODB MASTER KEY;

使用免费版本的MySQL TDE非常容易,不过使用这种方式进行数据库加密时一定要妥善保管主秘钥,因为如果主秘钥和数据库文件一并丢失,则可以通过主秘钥还原数据库文件中的数据,带来安全问题。

总结

通过上面的介绍我们队静态数据加密有了一定的了解,目前许多数据库都支持透明数据加密,这种加密一般只需要十分简单地操作即可完成表的透明加密,实现Encryption at rest,这非常简单却对系统的安全性有很大帮助,可谓性价比很高的操作,所以如果有机会一定要把它用到你的项目上。