PolarDB では、特定の列を暗号化してストレージに保存できます。復号関数を使用して元のデータを取得できるため、データセキュリティが向上します。
列の暗号化機能は段階的リリース中です。そのパラメーターはまだコンソールに表示されていません。この機能を使用するには、クォータセンターに移動します。Quota ID が polardb_mysql_column_encryption のクォータを見つけ、[アクション] 列の [適用] をクリックします。
バージョン要件
この機能は、マイナーバージョン 8.0.2.2.30 以降を実行している PolarDB for MySQL 8.0.2 クラスターでのみサポートされています。
背景情報
以前のバージョンでは、PolarDB for MySQL は aes_encrypt などの暗号化関数を使用して、フィールドレベルでデータを暗号化していました。しかし、この方法では、クライアントがキー、キーローテーション、およびアクセス権限を管理する必要がありました。PolarDB for MySQL の列暗号化機能は、これらの操作をデータベースサーバーに統合します。暗号化したい列に暗号化プロパティを設定するだけで済みます。この機能は、Online DDL を使用した非ブロッキングのキーローテーションもサポートしています。
注意事項
パフォーマンスオーバーヘッド
書き込みパフォーマンス
列の暗号化機能を使用すると、パフォーマンスオーバーヘッドが発生します。バイナリロギングが無効になっている場合、シングルスレッドの挿入に対するパフォーマンスオーバーヘッドは約 3% です。バイナリロギングが有効になっている場合や、テーブルの行幅が大きい場合は、システムの I/O パターンとリソース割り当ての変更により、オーバーヘッドが低くなることに注意してください。
読み取りパフォーマンス
読み取りパフォーマンスのオーバーヘッドは、クエリで復号関数が使用されるかどうかによって異なります。SQL 文内の単一の復号関数は、約 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 キーワードを使用して、暗号化された列を指定します。
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 値は暗号化されません。
`MODIFY` 文を使用して、標準の列を暗号化された列に変換したり、その逆を行ったりします。
ALTER TABLE my_pan modify `pan` VARBINARY(128) ENCRYPTION; ALTER TABLE my_pan modify `pan` VARBINARY(128) NOT ENCRYPTION;説明暗号化された列を直接追加することはできません。`MODIFY` 文を使用して標準の列を変更する必要があります。
インデックスの構築
暗号化された列にインデックスを構築することもできます。構文は標準の列と同じです。例:
CREATE index idx_pan ON my_pan(pan);インデックス内のデータは暗号化されます。インデックス自体は暗号化された値でソートされます。
DML
次のセクションでは、2 つの暗号化および復号関数について説明します。
-- 暗号化関数
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. キー管理
TDE 機能を有効にします。
重要TDE を有効にすると、PolarDB クラスターが再起動します。この操作は注意して実行してください。
TDE が有効になると、無効にすることはできません。
TDE 機能を有効にすること自体は、TDE 以外のテーブルや列の暗号化を使用しないテーブルに追加のパフォーマンスオーバーヘッドを発生させません。
PolarDB コンソールにログインします。左側のナビゲーションウィンドウで、クラスター をクリックします。クラスターのリージョンを選択し、クラスター ID をクリックします。
左側のナビゲーションウィンドウで、設定と管理 > セキュリティ管理 をクリックします。
TDE 設定 タブで、TDE ステータス をオンにし、カスタムキーを指定します。
説明KMS でキーを削除する前に、そのキーがすべての暗号化されたテーブルから関連付けが解除されていることを確認してください。これには履歴バージョンも含まれます。そうしないと、再起動後に PolarDB クラスターが利用できなくなる可能性があります。

キーを選択します。
説明[既存のカスタムキーを使用] または [ポップアップウィンドウでキーを選択] を選択できます。キーは KMS サービスによって生成できます。

(オプション) キー ローテーション。
説明PolarDB はカスタムキーのマスターキーバージョンを自動的に更新しません。キーバージョンは手動で更新できます。詳細については、「キーローテーション」をご参照ください。
キーローテーション後、新しい暗号化テーブルは新しいキーを使用して暗号化されます。既存の暗号化テーブルのデータは、元のキーで暗号化されたままです。
データローテーションは、テーブル内のデータを復号し、最新のキーバージョンで再暗号化します。この操作は CPU および I/O リソースを消費することに注意してください。データローテーションは必須ではありませんが、データテーブルで使用されるすべてのキーが利用可能なままであることを確認する必要があります。
データローテーション中のテーブルロック
オンラインコピー機能が有効になっていない場合、データローテーション中にテーブルはロックされます。
オンラインコピー DDL 機能が有効になっている場合、データローテーション中にテーブルはロックされません。同時 DML 操作は許可されますが、同時 DDL 操作は許可されません。
既存のテーブルを新しいキーで再暗号化するには、次のデータローテーションコマンドを実行します。
ALTER TABLE <table_name> engine = innodb,algorithm=copy;テーブル キーをクエリします。
次の SQL 文を実行して、システム内のすべての暗号化されたテーブルのキー使用状況をクエリできます。
SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;
3. パラメーター設定
loose_polar_enable_column_encryption パラメーターを設定することで、列の暗号化機能を有効にできます。詳細については、「クラスターおよびノードのパラメーターを設定する」をご参照ください。次の表に、このパラメーターについて説明します。
パラメーター | 説明 |
loose_polar_enable_column_encryption | 列の暗号化機能を有効にするかどうかを制御します。有効な値:
|
4. (オプション) オンラインコピー機能の有効化
データローテーションのために `COPY` DDL 構文を使用する場合、たとえばエンジン間でのテーブル定義の変更、列プロパティの調整、または標準テーブルとパーティションテーブル間の変換などを行うと、デフォルトでテーブルがロックされます。これにより、サービスがブロックされる可能性があります。この問題を解決するには、オンラインコピー最適化機能を有効にできます。この機能を使用すると、ロックなし、または最小限のロックでテーブルスキーマを変更できます。次の表に、関連するパラメーターについて説明します。
パラメーター | 説明 |
loose_polar_support_online_copy_ddl_algorithm | オンラインコピー DDL のプライマリスイッチ。有効な値:
|
loose_polar_support_online_copy_ddl_algorithm_for_modify | データローテーションで Modify 文を使用できるようにします。このパラメーターを設定する必要があります。有効な値:
|