PolarDB では、特定の列のデータを暗号化できます。データにアクセスする際は、復号関数を使用して平文を取得することで、データセキュリティが強化されます。
列の暗号化機能は限定公開のため、そのパラメーターはデフォルトで非表示になっています。この機能を有効にするには、クォータセンターに移動し、[クォータ ID] polardb_mysql_column_encryption でクォータを検索し、[操作] 列の [適用] をクリックします。
バージョン要件
この機能は、PolarDB for MySQL 8.0.2、バージョン 8.0.2.2.30 以降でのみ利用可能です。
背景情報
以前のバージョンでは、PolarDB for MySQL は aes_encrypt などの暗号化関数を使用してフィールドレベルのデータ暗号化を実行していました。しかし、このアプローチでは、クライアント側でキーを管理し、キーローテーションを処理し、アクセス権限を制御する必要がありました。PolarDB for MySQL の列の暗号化機能は、これらの操作をデータベースサーバーに統合します。保護したい列に暗号化属性を設定するだけです。さらに、列の暗号化はオンライン DDL を使用して、非ブロッキングのキーローテーションを実行します。
制限事項
パフォーマンスへの影響
-
書き込みパフォーマンス
列の暗号化を使用すると、パフォーマンスのオーバーヘッドが発生します。バイナリログを無効にした場合、列の暗号化により、シングルスレッドの挿入で約 3% のオーバーヘッドが追加されます。このオーバーヘッドは、バイナリログが有効な場合や、テーブルがワイド行構造である場合には、システムの I/O パターンとリソース割り当ての変更により低くなります。
-
読み取りパフォーマンス
読み取りパフォーマンスのオーバーヘッドは、クエリで復号関数が使用されるかどうかによって異なります。SQL 文内で復号関数を 1 回呼び出すと、パフォーマンスが約 6% 低下する可能性があります。
インデックスの使用
効率的な取得のためにインデックスを使用できるのは、ポイントクエリのみです。範囲クエリ (例: WHERE age>20) やパターンマッチング (例: LIKE '%key%') などの操作ではインデックスは使用されず、フルテーブルスキャンが実行されます。
テーブルプロパティの制限事項
-
仮想列を含むテーブルでは、暗号化はサポートされていません。
-
InnoDB ストレージエンジンを使用するテーブルのみがサポートされます。
-
パーティションテーブルはサポートされていません。
-
暗号化する列は
varbinary型である必要があります。 -
列の長さは 44 バイト以上である必要があります。
-
既存のテーブルに新しい暗号化列を追加することはできません。代わりに、既存の列を変更して暗号化する必要があります。
使用方法
列の暗号化と TDE 機能は、どちらもキー管理に Key Management Service (KMS) を使用します。
1. 構文 (権限制御、DDL、DML)
権限制御
列の暗号化を使用するには、データベースアカウントに ENCRYPTION_FUN_ADMIN 権限が必要です。特権アカウントはこの権限を付与できます。
-- 権限を付与
GRANT ENCRYPTION_FUN_ADMIN ON *.* TO 'testman'@'%';
-- 権限を表示
SHOW GRANTS;
DDL
暗号化列の作成
ENCRYPTION キーワードを使用して暗号化列を指定します。
-
1.
pan列を暗号化列として指定します。USE mydatabase; CREATE TABLE IF NOT EXISTS `my_pan` ( `id` INT NOT NULL AUTO_INCREMENT, `pan` VARBINARY(128) NOT NULL ENCRYPTION, `desc` blob Default NULL, KEY `idx_pan` (`pan`), PRIMARY KEY (`id`) );説明デフォルト値が
NULLの暗号化列を作成できますが、NULL値は暗号化されません。 -
2.
MODIFY文を使用して、通常の列を暗暗号化列に、またはその逆に変換できます。ALTER TABLE my_pan MODIFY `pan` VARBINARY(128) ENCRYPTION; ALTER TABLE my_pan MODIFY `pan` VARBINARY(128) NOT ENCRYPTION;説明ADD COLUMNを使用して新しい暗号化列を追加することはできません。既存の列を変換するにはMODIFY文を使用する必要があります。
インデックスの作成
暗号化列にインデックスを作成する構文は、通常の列と同じです。
CREATE index idx_pan ON my_pan(pan);
インデックス内のデータは暗号化されます。インデックス自体は、暗号文の値の順序に基づいてソートされます。
DML
暗号化関数と復号関数は次のとおりです:
-- 暗号化関数
enhanced_aes_encrypt(data, db_name, table_name)
-- 復号関数
enhanced_aes_decrypt(data)
データの挿入
暗号化列に挿入されたデータは自動的に暗号化されるため、enhanced_aes_encrypt 関数を呼び出す必要はありません。
INSERT INTO `my_pan` VALUES(1,"my_passwd", "aaa");
データのクエリ
# 1. 列の値を復号してクエリします。これはインデックスを使用せず、フルテーブルスキャンを実行します。
SELECT id,enhanced_aes_decrypt(pan) FROM `my_pan` WHERE enhanced_aes_decrypt(pan) = 'my_password_10';
# 2. インデックスを使用したポイントクエリ。結果は平文で返されます。
SELECT id,enhanced_aes_decrypt(pan) FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");
# 3. インデックスを使用したポイントクエリ。結果は暗号文で返されます。
SELECT id, pan FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");
データの更新
# プライマリキーインデックスを使用してデータを更新します。
UPDATE `my_pan` SET pan='new6-password', `desc`='Senior6' WHERE id = 1;
# 暗号化列のインデックスを使用してデータを更新します。
UPDATE `my_pan` SET pan='new6-password', `desc`='Senior6' WHERE pan=enhanced_aes_encrypt('my_password_6', "mydatabase", "my_pan");
データの削除
# プライマリキーインデックスを使用してデータを削除します。
DELETE FROM `my_pan` WHERE id = 1;
# 暗号化列のインデックスを使用してデータを削除します。
DELETE FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_2', "mydatabase", "my_pan");
2. キー管理
-
2. TDE 機能を有効にします。
重要-
TDE を有効にすると、PolarDB クラスターが再起動します。注意して進めてください。
-
TDE は一度有効にすると無効にできません。
-
TDE 機能を有効にすること自体は、TDE で暗号化されておらず、暗号化列を含まないテーブルに追加のパフォーマンスオーバーヘッドを引き起こしません。
-
PolarDB コンソールにログインします。 左側のナビゲーションペインで、クラスター をクリックします。 クラスターが配置されているリージョンを選択し、クラスター ID をクリックしてその詳細ページを開きます。
-
左側のナビゲーションペインで、設定と管理 > セキュリティ管理 をクリックします。
-
TDE 設定 タブで、TDE ステータス スイッチをオンにし、カスタムキーを選択します。
説明KMS でキーを削除する前に、そのキーが、過去のバックアップ内のテーブルを含め、どの暗号化テーブルにも関連付けられていないことを確認する必要があります。そうしないと、PolarDB クラスターの再起動に失敗する可能性があります。

-
-
キーを選択します。KMS のデフォルトキーを使用 または 既存カスタムキーの使用 を選択できます。
[詳細] オプションでは、自動暗号化を有効にできます。有効にすると、すべての新しいテーブルが自動的に暗号化されます。
-
4. (オプション) キーローテーションを実行します。
説明-
PolarDB はカスタムキーを自動的にローテーションしません。キーは手動でローテーションする必要があります。詳細については、「キーローテーション」をご参照ください。
-
キーローテーション後、新しい暗号化テーブルは新しいキーを使用します。既存の暗号化テーブルのデータは、元のキーで暗号化されたままです。
-
データローテーションでは、テーブル内のデータを復号し、最新のキーバージョンで再暗号化します。このプロセスは CPU と I/O リソースを消費します。データローテーションは必須ではありませんが、テーブルで使用されているキーの可用性を確保する必要があります。
-
データローテーション中のテーブルロック:
-
オンラインコピー DDL が無効な場合、データローテーション中にテーブルはロックされます。
-
オンラインコピー DDL が有効な場合、データローテーション中にテーブルはロックされません。同時 DML 操作は許可されますが、同時 DDL 操作は許可されません。
-
既存の暗号化テーブルのデータを新しいキーで再暗号化するには、次のデータローテーションコマンドを手動で実行する必要があります:
ALTER TABLE <table_name> engine = innodb,algorithm=copy; -
-
5. テーブルキーのクエリ。
システム内のすべての暗号化テーブルのキー情報をクエリするには、次の SQL 文を実行します:
SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;
3. パラメーター設定
loose_polar_enable_column_encryption パラメーターを設定して、列の暗号化機能を有効にします。パラメーターの設定方法の詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。次の表で、このパラメーターについて説明します。
|
パラメーター |
説明 |
|
loose_polar_enable_column_encryption |
列の暗号化を有効にするかどうかを制御します。有効な値:
|
4. (オプション) オンラインコピー DDL の有効化
データローテーション (たとえば、ストレージエンジン間でのテーブル定義の変更、列プロパティの調整、または通常テーブルとパーティションテーブル間の変換) に COPY DDL 構文を使用する場合、テーブルはデフォルトでロックされ、サービスが中断される可能性があります。これを防ぐには、オンラインコピー DDL 最適化機能を有効にして、ロックなしまたは最小限のロックでテーブル構造の変更を実行できます。詳細については、「オンラインコピー DDL」のドキュメントをご参照ください。