使用KMS对接全密态MySQL EncJDBC

全密态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数据库的步骤如下:

  1. 生成MEK。

    说明

    MEK是一个128位的密钥,我们可以用各种工具生成,包括OpenSSL、阿里云KMS等。

  2. 利用凭据管理服务将MEK托管到阿里云KMS。

  3. 配置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。

    image

    调用结果中的plaintext即为Base64编码的随机128位密钥,后续使用时还需自行转换为十六进制字符串格式。

步骤二:将MEK托管到阿里云KMS

您可以在KMS控制台或者使用KMS OpenAPI完成MEK的托管:

重要

托管前,请确认您的MEK是一个十六位的十六进制字符串。

  • 在KMS控制台托管

    1. 进入KMS控制台的凭据管理页面。

    2. 单击创建凭据,单击通用凭据,填入凭据名称,在设置凭据值右侧单击纯文本并填入已生成的MEK,版本号可以自选也可以使用默认值。

    3. 单击下一步,再单击下一步

    4. 确认凭据配置信息后,单击确定

      说明

      完成上述步骤后,您的MEK就已经加密后安全地保存在了阿里云KMS。请记住您的凭据名称和版本号,后续需要使用这些信息在客户端导入MEK。

  • 使用KMS OpenAPI托管

    您可以调用CreateSecret接口将MEK托管到阿里云KMS。

步骤三:将全密态MySQL EncJDBC接入阿里云KMS

  1. 在pom.xml文件中添加依赖。

    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibabacloud-kms20160120</artifactId>
        <version>1.0.5</version>
    </dependency>
  2. 配置MEK。

    EncJDBC中介绍了直接配置MEK的方法,这里介绍通过阿里云KMS配置MEK的方法。

    配置时需要设置五个值,分别为:ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRETKMS_SECRET_NAMEKMS_REGION_IDKMS_SECRET_VERSION。这五个值分别为您的阿里云AKSK存储的凭据名称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通过凭据的方式进行托管。

相关文档

EncJDBC