本トピックでは、Hologres で保存データを暗号化する方法について説明します。これには、暗号化の仕組み、制限事項、および操作手順が含まれます。
背景情報
Key Management Service (KMS) は、暗号鍵を作成、保存、管理できるクラウドサービスです。保存データと転送中のデータの両方を暗号化することで、機密データの保護に役立ちます。
Hologres は KMS を使用して保存データを暗号化します。元のデータを復元するにはキーが必要であり、これによりストレージレイヤーのデータが外部攻撃から保護され、企業の規制およびセキュリティコンプライアンス要件を満たすのに役立ちます。保存データの暗号化を有効にすると、暗号化および復号化の操作により、クエリと書き込みのパフォーマンスに影響が出ます。パフォーマンスのオーバーヘッドは、クエリの特性に応じて 20% から 40% の範囲になります。
制限事項
Hologres V1.1 以降でのみ、保存データの暗号化がサポートされています。ご利用のインスタンスがそれ以前のバージョンを実行している場合は、アップグレード準備中の一般的なエラーをご参照いただくか、フィードバックのために Hologres DingTalk グループにご参加ください。詳細については、「オンラインサポートをさらに受けるにはどうすればよいですか?」をご参照ください。
V1.3.31 より前のインスタンスで保存データの暗号化を有効にする場合は、バックエンド設定を追加する必要があります。Hologres V1.3.31 以降では、バックエンド設定は不要です。この機能を使用するには、インスタンスをアップグレードすることを推奨します。詳細については、「インスタンスのアップグレード」をご参照ください。
KMS でのキーの無効化や削除など、Bring-Your-Own-Key (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 は、データの暗号化と復号に Bring-Your-Own-Key (BYOK) のみをサポートしています。サポートされているキーマテリアルは、カスタマーマスターキー (CMK) を作成する際に KMS によって生成されるキーマテリアルと、インポートするキーマテリアルの 2 種類です。
KMS で BYOK を作成し、Hologres でそれを選択してデータベースのデータを暗号化できます。KMS で BYOK を作成する方法の詳細については、「キーの作成」をご参照ください。
データの読み書きを行う際、Hologres は KMS API を呼び出してキー情報を取得します。システムはデフォルトでこの情報を 24 時間キャッシュします。その結果、データ暗号化機能を使用すると KMS 料金が発生します。KMS の課金の詳細については、「KMS 1.0 の課金」をご参照ください。
操作手順
カスタムポリシーの作成
Resource Access Management (RAM) コンソールにログインします。左側のナビゲーションウィンドウで、[権限] > [ポリシー] を選択します。[ポリシー] ページで、[ポリシーの作成] をクリックします。

[ポリシーの作成] ページで、[JSON] をクリックします。[JSON] タブで、コードエディターに次のスクリプトを入力し、[名前] を AliyunHologresEncryptionDefaultRolePolicy に設定します。

{ "Version": "1", "Statement": [ { "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:DescribeKey" ], "Resource": "acs:kms:*:*:*/*", "Effect": "Allow" } ] }[OK] をクリックします。カスタムポリシーが作成されます。
RAM ロールの作成と権限の付与
RAM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、[ロールの作成] をクリックします。[ロールの作成] ページで、[プリンシパルタイプ] を [クラウドサービス] に、[プリンシパル名] を [Hologres] に設定します。
[OK] をクリックします。ダイアログボックスで、[ロール名] フィールドに
AliyunHologresEncryptionDefaultRoleと入力し、[OK] をクリックします。
ロールの詳細ページで、[権限の付与] をクリックします。
[権限の付与] パネルで、[リソース範囲] を [アカウント] に設定します。[ポリシー] で、ステップ 1 で作成したカスタムポリシー
AliyunHologresEncryptionDefaultRolePolicyを選択します。
[権限の付与] をクリックします。
ロールの詳細ページで、[信頼ポリシー] タブをクリックして、信頼ポリシーの設定を確認します。
キーの作成
詳細については、「Key Management のクイックスタート」をご参照ください。
重要Hologres は、Aliyun_AES_256 タイプの対称キーのみをサポートしています。
暗号化ルールの設定
保存データを暗号化するデータベースインスタンスにログインします。データベースへのログインの詳細については、「データベースへのログイン」をご参照ください。
[アドホッククエリ] ページで、[インスタンス名] と [データベース] を選択します。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。Key Management Service コンソールにログインし、キーの詳細ページから ID を取得します。
ram_role
作成した Hologres プロキシロールの名前。
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 以降では、データベースの保存データの暗号化を有効にした後、個々のテーブルに異なる暗号化ポリシーを設定できます。これにより、一部のテーブルを暗号化しないままにしたり、異なるテーブルを別々の 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。Key Management Service コンソールにログインし、キーの詳細ページから ID を取得します。
ram_role
作成した Hologres プロキシロールの名前。
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';結果のサンプル: