数据存储加密

本文为您介绍如何在Hologres中对数据进行加密处理,本文包括数据加密机制、使用限制及操作步骤。

背景信息

Hologres支持通过密钥管理服务KMS(Key Management Service)对数据进行加密存储,提供数据静态保护能力,满足企业监管和安全合规需求。开启加密存储后,由于涉及加密和解密操作,所以会影响查询和写入性能,大约有20%-40%的性能损耗,具体情况根据查询特征有不同程度的影响。

使用限制

  • 仅Hologres V1.1及以上版本支持数据加密存储,如果您的实例是V1.1以下版本,请您使用自助升级或加入Hologres钉钉交流群反馈,详情请参见如何获取更多的在线支持?

  • 使用数据存储加密功能时,如果您的实例版本低于V1.3.31需要添加后台配置。Hologres从V1.3.31版本开始无需添加后台配置,如需使用该功能,建议您升级实例,详情请参见实例升级

  • 您在KMS上对自带密钥(BYOK)的操作(例如禁用或删除),会影响Hologres对数据的加密或解密操作。由于Hologres服务涉及缓存,您在KMS的相关操作会在24小时内生效。

  • 存储加密仅会对开启存储加密后的数据表生效,对于开启存储加密前创建的数据表,系统不会对其进行存储加密。

  • 开启存储加密功能后,仍然可以在MaxCompute中创建Hologres外部表进行数据读写。

  • 开启存储加密功能后,再使用如下SQL关闭数据库的存储加密,关闭前的表数据仍然是被加密的,只有关闭后新创建的表才不会使用存储加密。

    ALTER DATABASE <database_name> set hg_experimental_encryption_options='';
  • 开启存储加密表使用的KMS密钥被禁用或者失效,会导致该表的数据无法读写。

  • Hologres从 V2.0版本开始支持为每张表设置单独的加密规则,即对于不同的表设置不同的KMS密钥进行加密。

  • 仅支持对列存表以及行列共存模式中的列存表开启数据存储加密,其余表类型不支持。开启存储加密功能后,您仍然可以在MaxCompute中创建Hologres外部表以进行数据读写,且仅列存表、及行列共存中的列存表为加密模式,其余表类型不进行加密。

数据加密机制

Hologres通过KMS托管密钥,实现数据加密或解密功能,数据加密机制如下。

  • Hologres以数据库为单位,通过KMS加密或解密存储在Hologres的数据。在使用数据加密功能前,请确保您所在区域已开通KMS服务。

  • KMS生成和管理您的密钥并保障密钥的安全性。

  • Hologres支持的加密算法有AES256、AESCTR、RC4和SM4。

  • Hologres仅支持自带密钥(BYOK)加密或解密数据,同时支持两类密钥材料,包括创建用户主密钥CMK时由KMS生成的密钥材料以及用户导入的密钥材料。

    您可以通过KMS创建自带密钥(BYOK),并在Hologres中针对数据库,选择该密钥作为密钥进行数据加密。在KMS上创建BYOK的详情请参见创建密钥

  • 在数据读写时,Hologres会调用KMS的API获取相关的密钥信息,获取相关的密钥信息系统默认会缓存24小时。因此在使用数据加密功能时会产生相关的KMS费用,KMS相关计费说明请参见KMS计费说明

操作步骤

  1. 创建自定义权限策略

    1. 登录RAM控制台,单击左侧导航栏的权限策略,进入权限策略页面,单击创建权限策略

      权限策略

    2. 进入创建权限策略页面,单击脚本编辑配置脚本如下所示且名称命名为AliyunHologresEncryptionDefaultRolePolicy

      创建权限策略

      {
          "Version": "1",
          "Statement": [
              {
                  "Action": [
                      "kms:Encrypt",
                      "kms:Decrypt",
                      "kms:GenerateDataKey",
                      "kms:DescribeKey"
                  ],
                  "Resource": "acs:kms:*:*:*/*",
                  "Effect": "Allow"
              }
          ]
      }
    3. 单击确定,完成自定义权限策略的创建。

  2. 创建Hologres代理角色并授权

    1. 登录RAM控制台,单击左侧导航栏的角色

    2. 进入角色页面,单击创建角色,进入创建角色对话框,选择可信实体类型阿里云服务

    3. 单击下一步角色类型选择普通服务角色角色名称命名为AliyunHologresEncryptionDefaultRole,设置选择受信服务交互式分析,单击完成创建角色

    4. 进入创建完成页面,单击为角色授权

    5. 进入添加权限页面,授权范围选择整个云账号选择权限自定义策略中第一步创建的自定义角色策略(AliyunHologresEncryptionDefaultRolePolicy)。添加权限

    6. 单击确定,完成角色创建和授权操作。

      在创建完角色后,单击创建的角色,在信任策略管理页签,可以查看信任策略的设置。

  3. 创建密钥

    具体操作,请参见密钥管理快速入门

    重要

    Hologres只支持使用对称密钥,其密钥类型为Aliyun_AES_256。

  4. 设置加密规则

    1. 登录需要进行存储数据加密的数据库实例,登录数据库请参见登录数据库

    2. 临时Query查询页面,选择已创建的实例名数据库后,请您在SQL查询的编辑框输入如下语句,单击运行

      以下SQL语句用于设置数据存储加密规则。

      ALTER DATABASE <db_name> SET hg_experimental_encryption_options='<encryption_type>,<cmk_id>,<ram_role>,<uid>';

      参数说明

      参数

      说明

      db_name

      需要进行加密存储的数据库名称。

      encryption_type

      加密类型。仅支持AES256、AESCTR、RC4类型。

      cmk_id

      密钥ID。登录密钥管理服务控制台,密钥详情页获取。

      ram_role

      创建的Hologres代理角色名称。

      uid

      阿里云账号ID。获取详情请参见账号ID

    一个设置加密规则并查询数据的简单使用示例如下。

    1. 对数据库开启存储加密。

      ALTER DATABASE hoxxxx set hg_experimental_encryption_options=
      'AES256,623c26ee-xxxx-xxxx-xxxx-91d323cc4855,AliyunHologresEncryptionDefaultRole,187xxxxxxxxxxxxx';
    2. 创建表并写入数据。

      DROP TABLE IF EXISTS a;
      
      CREATE TABLE a(id int);
      
      INSERT INTO a values(1);
      
      SELECT hg_admin_command('flush'); -- 仅对测试使用,为了马上查询到效果使用
    3. 查询数据。

      SELECT * FROM a;

      运行结果如下。示例结果

    若此时禁用了KMS,在实例重启或者24小时后,查询a表数据会报错。

表级别存储加密设置

Hologres从V2.0版本开始支持在对数据库开启存储加密后,再针对单表设置加密规则,即可以针对不同的表使用不同的KMS密钥进行加密。

设置表级别存储加密规则

  • 注意事项:

    • 若不对表单独设置加密规则,系统会使用hg_experimental_encryption_options设置的加密规则作为表的加密规则。

    • 设置必须要在建表时设置,不支持在表创建后再设置加密规则。

  • 使用语法:

    CALL SET_TABLE_PROPERTY('<table_name>', 'encryption_options', '<encryption_type>,<cmk_id>,<ram_role>,<uid>');

    参数说明如下:

    参数

    说明

    table_name

    需要进行加密存储的表名称。

    encryption_type

    加密类型。仅支持AES256、AESCTR、RC4类型。

    cmk_id

    密钥ID。登录密钥管理服务控制台,密钥详情页获取。

    ram_role

    创建的Hologres代理角色名称。

    uid

    阿里云账号ID。获取详情请参见账号ID

  • 使用示例:

    创建表lineitem,并使用AES256加密类型、623c26ee-xxxx-xxxx-xxxx-91d323cc4855密钥加密。

    BEGIN;
    CREATE TABLE LINEITEM
    (
        L_ORDERKEY      BIGINT      NOT NULL,
        L_PARTKEY       INT         NOT NULL,
        L_SUPPKEY       INT         NOT NULL,
        L_LINENUMBER    INT         NOT NULL,
        L_QUANTITY      DECIMAL(15,2) NOT NULL,
        L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
        L_DISCOUNT      DECIMAL(15,2) NOT NULL,
        L_TAX           DECIMAL(15,2) NOT NULL,
        L_RETURNFLAG    TEXT        NOT NULL,
        L_LINESTATUS    TEXT        NOT NULL,
        L_SHIPDATE      TIMESTAMPTZ NOT NULL,
        L_COMMITDATE    TIMESTAMPTZ NOT NULL,
        L_RECEIPTDATE   TIMESTAMPTZ NOT NULL,
        L_SHIPINSTRUCT  TEXT        NOT NULL,
        L_SHIPMODE      TEXT        NOT NULL,
        L_COMMENT       TEXT        NOT NULL,
        PRIMARY KEY (L_ORDERKEY,L_LINENUMBER)
    );
    CALL SET_TABLE_PROPERTY('LINEITEM', 'encryption_options', 'AES256,623c26ee-xxxx-xxxx-xxxx-91d323cc4855,AliyunHologresEncryptionDefaultRole,153xxxxxxxxxxxxx');
    COMMIT;

查看存储加密规则

Hologres从V2.0版本开始,您可以使用如下SQL查看每张表的加密规则。

SELECT
    *
FROM
    hologres.hg_table_properties
WHERE
    property_key = 'encryption_options';

示例返回结果:查看存储加密规则