全密态MySQL数据库的安全核心在于密钥MEK的管理,您可以使用阿里云KMS来完成MEK的托管和获取,操作便捷、安全性高。本文介绍如何使用阿里云KMS接入全密态MySQL EncJDBC,以完成对全密态MySQL密钥的托管。
背景
全密态MySQL数据库的MEK(Master Encryption Key)由客户端通过安全的非对称加密协议传输给数据库服务端,使服务端、客户端具有相同的密钥,在此之后,两端通过对称加密将数据安全、可靠地传输。MEK的保存和管理对全密态MySQL数据库的安全性而言非常重要。我们推荐使用阿里云KMS来完成MEK的托管、获取操作。
阿里云KMS(Key Management Service)是阿里云针对云上数据加密需求精心设计的密码应用服务,为您的应用提供符合国密要求的密钥服务及极简应用加解密服务,助您轻松使用密钥来加密保护敏感的数据资产。
阿里云KMS主要提供密钥管理、凭据管理两个系列的服务。针对全密态MySQL数据库,我们使用凭据管理来托管用户的MEK。
凭据管理通过托管和加密凭据(在我们的场景里即为MEK),防止凭据硬编码带来的凭据泄露以及高价值资产泄露,提高数据安全性。
前提条件
已开通全密态功能,详情请参见开通全密态功能。
已完成EncJDBC客户端接入全密态数据库的相关配置,详情请参见EncJDBC。
EncJDBC的版本大于或等于1.0.6。
已创建KMS实例,详情请参见购买和启用KMS实例。
影响
若KMS服务不可用,全密态客户端驱动EncJDBC也无法使用。
费用
该功能RDS不收费,KMS凭据托管功能收费,详情请参见产品计费。
操作步骤
使用阿里云KMS对接全密态MySQL数据库的步骤如下:
生成MEK。
说明MEK是一个128位的密钥,我们可以用各种工具生成,包括OpenSSL、阿里云KMS等。
利用凭据管理服务将MEK托管到阿里云KMS。
配置EncJDBC,接入阿里云KMS。
步骤一:生成MEK
本功能需要生成一个128位的密钥,用16位的十六进制字符串表示。
例如,00112233445566778899aabbccddeeff。
您可以使用OpenSSL工具或KMS的GenerateDataKey接口生成密钥:
使用OpenSSL工具:
说明如果您使用Linux系统,系统会自带OpenSSL工具,无需安装。如果您使用Windows系统,请获取OpenSSL软件包并安装。
例如,在Linux系统中,您可以执行如下命令,生成密钥:
openssl rand -hex 16
使用KMS的GenerateDataKey接口:
在调用接口时,您需要指定一个KMS主密钥ID,以及指定NumberOfBytes(生成的密钥长度)为16。
调用结果中的plaintext即为Base64编码的随机128位密钥,后续使用时还需自行转换为十六进制字符串格式。
步骤二:将MEK托管到阿里云KMS
您可以在KMS控制台或者使用KMS OpenAPI完成MEK的托管:
托管前,请确认您的MEK是一个十六位的十六进制字符串。
在KMS控制台托管
进入KMS控制台的凭据管理页面。
单击创建凭据,单击通用凭据,填入凭据名称,在设置凭据值右侧单击纯文本并填入已生成的MEK,版本号可以自选也可以使用默认值。
单击下一步,再单击下一步。
确认凭据配置信息后,单击确定。
说明完成上述步骤后,您的MEK就已经加密后安全地保存在了阿里云KMS。请记住您的凭据名称和版本号,后续需要使用这些信息在客户端导入MEK。
使用KMS OpenAPI托管
您可以调用CreateSecret接口将MEK托管到阿里云KMS。
步骤三:将全密态MySQL EncJDBC接入阿里云KMS
在pom.xml文件中添加依赖。
<dependency> <groupId>com.aliyun</groupId> <artifactId>alibabacloud-kms20160120</artifactId> <version>1.0.5</version> </dependency>
配置MEK。
在EncJDBC中介绍了直接配置MEK的方法,这里介绍通过阿里云KMS配置MEK的方法。
配置时需要设置五个值,分别为:
ALIBABA_CLOUD_ACCESS_KEY_ID
、ALIBABA_CLOUD_ACCESS_KEY_SECRET
、KMS_SECRET_NAME
、KMS_REGION_ID
、KMS_SECRET_VERSION
。这五个值分别为您的阿里云AK
、SK
,存储的凭据名称
、KMS所用的region
以及凭据版本
。其中KMS_SECRET_VERSION
可以不设置,默认使用最新版本。您可以通过三种方式配置MEK,示例如下:
JDBC properties配置
props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_ID", "xxx"); props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "xxx"); props.setProperty("KMS_SECRET_NAME", "confidential-mysql"); props.setProperty("KMS_REGION_ID", "hangzhou"); props.setProperty("KMS_SECRET_VERSION", "v1"); // 可选
配置文件设置
ALIBABA_CLOUD_ACCESS_KEY_ID=xxx ALIBABA_CLOUD_ACCESS_KEY_SECRET=xxx KMS_SECRET_NAME=confidential-mysql KMS_REGION_ID=cn-hangzhou KMS_SECRET_VERSION=v1 # 可选
该配置等价于您直接设置MEK:
MEK=001122334455566778899aabbccddeeff
URL设置
在使用URL配置时,需要在原有的URL串后加上:
ALIBABA_CLOUD_ACCESS_KEY_ID=xxx&ALIBABA_CLOUD_ACCESS_KEY_SECRET=xxx&KMS_SECRET_NAME=confidential-mysql&KMS_REGION_ID=hangzhou
例如:
jdbc:mysql:encdb://hostname:port/db?ALIBABA_CLOUD_ACCESS_KEY_ID=xxx&ALIBABA_CLOUD_ACCESS_KEY_SECRET=xxx&KMS_SECRET_NAME=confidential-mysql&KMS_REGION_ID=hangzhou
以上配置方式和直接配置MEK的区别是,您不再需要自己手动管理MEK,而是由阿里云KMS通过凭据的方式进行托管。