Hologres で Key Management Service (KMS) が管理するキーを使用して保存時のデータを暗号化し、保存データを保護してコンプライアンス要件を満たします。このトピックでは、保存時の暗号化の仕組み、その制限、データベースレベルおよびテーブルレベルで有効化する方法、および新しいデータベースにデータを移行して KMS キーを置き換える方法について説明します。
KMS を使用した保存時のデータ暗号化の理由
Key Management Service (KMS) は、保存時および転送中の機密データを保護するために暗号化キーを作成、保存、管理する Alibaba Cloud のサービスです。
Hologres は KMS キーを使用して、データベースに保存するデータを暗号化します。保存時の暗号化は、ストレージレイヤーで外部の攻撃からデータを保護し、企業の規制およびコンプライアンス要件を満たすのに役立ちます。
仕組み
Hologres は、KMS が管理するキーでデータを暗号化および復号します。暗号化の仕組みは次のとおりです。
-
Hologres は、KMS を介してデータベースごとに保存データを暗号化および復号します。データはストレージレイヤーで暗号文に暗号化され、対応するキーのみがデータを復号できます。
-
KMS はキーを生成および管理し、キーを安全に保ちます。
-
Hologres は、AES256、AESCTR、および RC4 の暗号化アルゴリズムをサポートしています。
-
Hologres は、Bring Your Own Key (BYOK) のみでデータを暗号化および復号します。サポートされているキーマテリアルには、カスタマーマスターキー (CMK) の作成時に KMS が生成するキーマテリアルと、インポートするキーマテリアルの 2 種類があります。
KMS で BYOK キーを作成し、Hologres でそれを選択してデータベースを暗号化します。KMS で BYOK キーを作成する方法の詳細については、「キーの作成」をご参照ください。
-
データの読み書き中に、Hologres は KMS API を呼び出してキー情報を取得し、デフォルトで 24 時間その情報をキャッシュします。
注意事項
-
暗号化の範囲:保存時の暗号化は、この機能を有効にした後に作成したテーブルにのみ適用されます。この機能を有効にする前に作成されたテーブルは暗号化されません。
-
サポートされるテーブルタイプ:列指向テーブルと、行列ハイブリッドテーブルの列指向部分のみが暗号化されます。他のテーブルタイプは暗号化されません。保存時の暗号化を有効にした後でも、MaxCompute に Hologres 外部テーブルを作成してデータの読み書きができます。
-
テーブルレベルのキー:Hologres V2.0 以降では、テーブルごとに個別の暗号化設定がサポートされているため、異なるテーブルを異なる KMS キーで暗号化できます。詳細については、「テーブルレベルの暗号化設定」をご参照ください。
-
パフォーマンス:暗号化と復号により、処理のオーバーヘッドが増加します。保存時の暗号化により、クエリの特性に応じて、クエリと書き込みのパフォーマンスが約 20% から 40% 低下します。
-
キー操作:BYOK の無効化や削除などの KMS キー操作は、Hologres の暗号化と復号に影響します。Hologres はキー情報をキャッシュするため、これらの操作は 24 時間以内に有効になります。
-
キーの可用性:暗号化されたテーブルで使用されている KMS キーが無効または不正な場合、テーブルは読み取り不可および書き込み不可になります。
-
キーの置き換え:Hologres は、すでに暗号化されているデータベースの KMS キーの切り替えをサポートしていません。別のキーでデータを暗号化するには、新しいデータベースを作成し、そこにデータを移行します。詳細については、「KMS キーのローテーションとデータ移行」をご参照ください。
-
暗号化の無効化:データベースの保存時の暗号化を無効にしても、すでに暗号化されているデータは復号されません。詳細については、「データベースの保存時の暗号化の無効化」をご参照ください。
課金
保存時の暗号化では、Hologres が KMS API を呼び出してキー情報を取得するため、KMS の料金が発生します。料金情報の詳細については、「KMS の課金」をご参照ください。
前提条件
-
Hologres インスタンスが V1.1 以降を実行していること。保存時の暗号化は Hologres V1.1 以降でのみサポートされています。インスタンスが以前のバージョンを実行している場合は、インスタンスをアップグレードしてください。アップグレード準備エラーについては、「アップグレード準備エラーのトラブルシューティング」をご参照いただくか、Hologres DingTalk グループに参加してサポートを受けてください。詳細については、「オンラインサポートの追加入手方法」をご参照ください。
-
V1.3.31 より前のインスタンスでは、保存時の暗号化のためにバックエンド設定が必要です。V1.3.31 以降のインスタンスでは不要です。(推奨) インスタンスをアップグレードしてください。
-
お使いのリージョンで KMS が有効化されていること。
-
RAM ロールが作成されていること。このロールの名前を暗号化設定で指定します。
データベースの保存時の暗号化の有効化
-
Hologres に必要な KMS 権限を付与するカスタムポリシーを作成します。
-
RAM コンソールにログインします。左側のナビゲーションペインで、[Permissions] > [Policies] を選択します。[Policies] ページで、[Create Policy] をクリックします。

-
[Create Policy] ページで、[JSON] タブをクリックします。ポリシーエディターに次のポリシードキュメントを入力し、[Name] を
AliyunHologresEncryptionDefaultRolePolicyに設定します。
このポリシーは、暗号化された MaxCompute データをクエリする際に、データキーを取得して復号するために Hologres に必要な KMS 権限を付与します。
{ "Version": "1", "Statement": [ { "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:DescribeKey" ], "Resource": "acs:kms:*:*:*/*", "Effect": "Allow" } ] } -
[OK] をクリックします。カスタムポリシーが作成されます。
-
-
Hologres 用の RAM ロールを作成し、ポリシーをアタッチします。
Hologres がユーザーに代わって KMS API を呼び出すには、RAM ロールが必要です。ロールを作成し、ステップ 1 で作成したポリシーをアタッチします。
-
RAM コンソールにログインします。左側のナビゲーションペインで、[Identities] > [Roles] を選択します。
-
[Roles] ページで、[Create Role] をクリックします。[Select Trusted Entity] で [Alibaba Cloud Service] を選択し、[Select Trusted Service] で [Hologres] を選択します。
-
[OK] をクリックします。[Role Name] フィールドに
AliyunHologresEncryptionDefaultRoleを入力し、[OK] をクリックします。
-
ロール詳細ページで、[Permissions] タブをクリックし、[Grant Permission] をクリックします。
-
[Grant Permission] パネルで、[Grant Scope] を [Alibaba Cloud Account] に設定します。[Policy] には、[Custom Policy] をクリックし、
AliyunHologresEncryptionDefaultRolePolicyを選択します。
-
[OK] をクリックします。ロール詳細ページで、[Trust Policy] タブをクリックして信頼ポリシーを確認します。
-
-
キーを作成します。
詳細については、「キーの作成」をご参照ください。
Hologres は、
Aliyun_AES_256タイプの対称キーのみをサポートしています。 -
暗号化設定を構成します。
-
保存時の暗号化を有効にするデータベースインスタンスに接続します。手順については、「データベースインスタンスへの接続」をご参照ください。
-
[アドホッククエリ] ページで、[Instance Name] と [Database] を設定し、SQL クエリエディターに次のステートメントを入力して、[Run] をクリックします。
-
ALTER DATABASE <db_name> SET hg_experimental_encryption_options='<encryption_type>,<cmk_id>,<ram_role>,<uid>';
次の表にパラメーターを示します。
|
パラメーター |
説明 |
|
db_name |
暗号化するデータベースの名前。 |
|
encryption_type |
暗号化アルゴリズム。有効な値: |
|
cmk_id |
キー ID。Key Management Service コンソールにログインし、キーの詳細ページから ID を取得します。 |
|
ram_role |
作成した RAM ロールの名前。 |
|
uid |
Alibaba Cloud アカウント ID。取得方法の詳細については、「アカウント ID の表示」をご参照ください。 |
次の例では、暗号化設定を構成し、データをクエリします。
-
データベースの保存時の暗号化を有効にします。
ALTER DATABASE hoxxxx set hg_experimental_encryption_options= 'AES256,623c26ee-xxxx-xxxx-xxxx-91d323cc4855,AliyunHologresEncryptionDefaultRole,187xxxxxxxxxxxxx'; -
テーブルを作成してデータを挿入します。
DROP TABLE IF EXISTS a; CREATE TABLE a(id int); INSERT INTO a values(1); SELECT hg_admin_command('flush'); -- これはテスト専用です。これにより、結果をすぐに確認できます。 -
データをクエリします。
SELECT * FROM a;
KMS でキーを無効にすると、インスタンスの再起動後または 24 時間後にテーブル a をクエリしたときにエラーが報告されます。
Hologres V2.0 以降では、各テーブルに適用される暗号化設定を表示することもできます。手順については、「暗号化設定の表示」をご参照ください。
データベースの保存時の暗号化の無効化
次のステートメントを実行してデータベースの保存時の暗号化を無効にすると、無効にする前に作成されたテーブルのデータは暗号化されたままになります。無効にした後に作成されたテーブルのみが暗号化されません。
ALTER DATABASE <database_name> set hg_experimental_encryption_options='';
テーブルレベルの暗号化設定
Hologres V2.0 以降では、データベースで保存時の暗号化が有効になった後、個々のテーブルに対して異なる暗号化ポリシーを設定できます。テーブルは暗号化しないままにするか、データベースのデフォルト以外の KMS キーを使用できます。
同じデータベース内のテーブルで異なる KMS キーを使用する必要がある場合、または特定のテーブルを暗号化しないままにする必要がある場合に、テーブルレベルの暗号化設定を構成します。
テーブルレベルの暗号化設定
テーブルレベルの暗号化設定を行う前に、次の点にご注意ください。
-
テーブルに個別の暗号化設定を構成しない場合、テーブルは
hg_experimental_encryption_optionsで指定された設定を使用します。 -
テーブルの作成時に設定を構成します。テーブルの作成後に設定することはできません。
次のステートメントを実行して、テーブルの暗号化設定を行います。
CALL SET_TABLE_PROPERTY('<table_name>', 'encryption_options', '<encryption_type>,<cmk_id>,<ram_role>,<uid>');
次の表にパラメーターを示します。table_name を除き、これらのパラメーターはデータベースレベルの暗号化設定のパラメーターと同じです。
|
パラメーター |
説明 |
|
table_name |
暗号化するテーブルの名前。 |
|
encryption_type |
暗号化アルゴリズム。有効な値: |
|
cmk_id |
キー ID。Key Management Service コンソールにログインし、キーの詳細ページから ID を取得します。 |
|
ram_role |
作成した RAM ロールの名前。 |
|
uid |
Alibaba Cloud アカウント 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';
結果の例:
結果には、table_namespace、table_name、property_key、および property_value の 4 つの列が含まれます。property_value 列には、暗号化アルゴリズム (例:AES256)、CMK ID、RAM ロール (例:AliyunHologresEncryptionDefaultRole)、および UID が記録されます。
KMS キーのローテーションとデータ移行
Hologres は、すでに暗号化されているデータベースの KMS キーの切り替えをサポートしていません。キーで暗号化されたデータは、そのキーでのみ復号でき、データベースはデータベースレベルで 1 つの有効な暗号化設定しか持つことができません。暗号化されたデータベースで ALTER DATABASE を実行して新しいキーを指定した場合、ステートメントはエラーなしで正常に返されることがありますが、キーは切り替えられず、既存のデータは引き続き元のキーで復号されます。
現在のキーが無効化されようとしている場合など、KMS キーを置き換えるには、新しい暗号化設定でデータベースを作成し、そこにデータを移行します。この手順は、データベースレベルの暗号化設定に適用されます。
移行が完了するまで、元のキーを無効化または削除しないでください。暗号化されたテーブルで使用されている KMS キーが無効または不正な場合、テーブルは読み取り不可および書き込み不可になります。
データを移行する前に、新しいデータベースの暗号化設定を構成してください。保存時の暗号化は、暗号化が有効になった後に作成されたテーブルにのみ適用されます。最初にデータを移行し、その後に暗号化設定を構成すると、移行中に作成されたテーブルは暗号化されません。
次の順序でデータを移行します。
-
新しいデータベースを作成します。
-
新しいデータベースに新しい KMS 暗号化設定を構成します。「データベースの保存時の暗号化の有効化」と同じ構文を使用します。
ALTER DATABASE <db_name> SET hg_experimental_encryption_options='<encryption_type>,<cmk_id>,<ram_role>,<uid>'; -
Flink や DataWorks タスクなどのデータ同期タスクを使用して、古いデータベースから新しいデータベースにデータを移行します。