如何配置MariaDB数据库中的静态加密

静态加密功能可以防止攻击者访问存储在磁盘上的加密数据,即使他可以访问到系统。开源数据库MySQL和MariaDB现在都支持加密静止状态功能,以满足新的立法要求。MySQL的静态加密与MariaDB略有不同,因为MySQL只对InnoDB表提供加密。而MariaDB还提供了对重做日志、慢速日志、审计日志、错误日志等文件加密的选项。但是,两者都无法对RAM上的数据进行加密,也无法保护数据不被恶意root。
在本文中,我们将学习为MariaDB配置数据库级加密。
静态数据加密需要加密插件和密钥管理。加密插件负责管理加密密钥以及对数据进行加密/解密。
MariaDB提供了三种加密密钥管理解决方案,因此数据库如何管理加密密钥取决于您使用的解决方案。本教程将演示使用MariaDB文件密钥管理解决方案的数据库级加密。但是,此插件不提供键旋转功能。
如果您使用的是LAMP服务器,则添加此插件的文件位于“/opt/lamp”目录中。如果不是,则在“ /etc/mysql/conf.d”文件夹中进行更改。
创建加密密钥
在使用文件密钥管理插件对数据库进行加密之前,我们需要创建包含加密密钥的文件。我们将创建一个包含两个信息的文件。那就是一个十六进制编码格式的加密密钥以及一个32位的密钥标识符。
我们将在"/etc/mysql/"目录下创建一个新的文件夹 "keys",并使用OpenSSL实用程序随机生成3个Hex字符串,并将输出结果重定向到keys文件夹中的一个新文件,输入以下命令。

其中1,2,3是密钥标识符;我们将它们包含在内,以便在MariaDB中使用变量innodb_default_encryption_key_id创建一个加密密钥的引用。输出文件的样子是这样的。

钥匙文件加密
我们可以很方便的在文件密钥管理插件里面设置系统变量file_key_management_filename,并设置相应的路径。但是,把密钥放在纯文本中是不安全的。我们可以通过分配文件权限在一定程度上降低风险,但是,这还不够。
现在,我们将使用随机生成的密码对之前创建的密钥进行加密。相比之下,密钥大小可以从128/192/256位不等。

因此,我们将在终端使用openssl enc命令将enc_key.txt文件加密为enc_key.enc,使用上面创建的加密密钥。另外,MariaDB只支持AES的CBC模式来加密其加密密钥。

我们也删除我们的enc_keys.txt文件,因为它不再需要了。此外,只要我们的密码文件是安全的,我们可以随时解密MariaDB中的数据。
配置文件密钥管理插件
现在我们将通过在配置文件中添加以下变量来配置MariaDB的文件密钥管理插件。配置文件通常位于'/etc/mysql'中,默认读取所有的.cnf文件。或者你可以在'/etc/mysql/conf.d/目录下创建一个新的配置文件 "mariadb_enc.cnf"。
现在,你的配置文件可以看起来和这个完全不同。然而,在[sqld]下添加这些加密变量。如果密钥是加密的,插件需要配置两个系统变量,即file_key_management_filename和file_key_management_filekey。

你可以从MariaDB的官方网站上找到每个系统变量的详细信息。
确保密码文件的安全
我们将改变MySQL目录的权限,以保护密码和其他敏感文件的安全。MariaDB的所有权将被改为当前用户,在Ubuntu上是mysql。

现在我们将密码和加密文件的权限改为

现在重新启动数据库服务。

本文介绍了如何在MariaDB中配置encryption-at-rest。文件密钥管理插件唯一的缺点就是不支持密钥轮换。不过,除了这个插件之外,还有很多其他的密钥管理加密方案,即AWS密钥管理插件和Eperi密钥管理插件。你可以从MariaDB的官方网站上找到这些插件的更多细节。