列レベルの暗号化により、特定のカラムを暗号化形式で格納し、組み込みの復号関数を使用して元のデータを取得できます。フィールドレベルの暗号化(aes_encrypt)とは異なり、列レベルの暗号化ではデータベースサーバー側でキーを管理するため、データベースに直接アクセス可能なユーザーであっても、明示的に復号関数を呼び出さない限り、暗号化された値を読み取ることはできません。これにより、データ所有者とデータベース運用者の役割が明確に分離されます。
列レベルの暗号化は段階的リリース中です。そのパラメーターは現時点ではコンソール上に表示されていません。この機能を利用するには、クォータセンターに移動してください。クォータ ID polardb_mysql_column_encryption のクォータを検索し、申請 をクリックします(操作 列内)。バージョン要件
PolarDB for MySQL 8.0.2 クラスター(マイナーバージョン 8.0.2.2.30 以降)でサポートされます。
制限事項
列レベルの暗号化を有効化する前に、本機能がご利用のユースケースに適合することを確認するため、以下の制限事項をご確認ください。
パフォーマンスオーバーヘッド
| 操作 | オーバーヘッド | 条件 |
|---|---|---|
| シングルスレッド挿入(書き込み) | 約 3 % | バイナリログ記録が無効化されています |
| シングルスレッド挿入(書き込み) | 3 % 未満 | バイナリログが有効化されている場合、またはテーブルの行幅が大きい場合 |
| SQL ステートメント単位の復号(読み取り) | 約 6 % | ステートメントごとに enhanced_aes_decrypt を 1 回呼び出す場合 |
インデックス使用に関する制限
暗号化カラム上のインデックスは、プレーンテキストではなく暗号文でソートされます。暗号化された値空間における比較は範囲に対して意味を持たないため、インデックスを利用できるのは等価比較(ポイントクエリ)のみです。WHERE age > 20 のような範囲クエリや、LIKE '%key%' のようなパターンマッチングはインデックスを利用できず、全表スキャンが発生します。
機密性の高いカラムに対して範囲比較を頻繁に実行するクエリが必要な場合は、アプリケーション層での暗号化を検討してください。アプリケーション層ではクエリロジックに対する制御がより柔軟です。
テーブルプロパティに関する制限
仮想カラムを含むテーブルはサポートされません。
InnoDB ストレージエンジンのみがサポートされます。
パーティションテーブルはサポートされません。
暗号化カラムには
VARBINARY型を使用する必要があります。フィールド長は最低でも 44 バイトである必要があります。
ADD COLUMNを使用して暗号化カラムを直接追加することはできません。MODIFYを使用して、既存の標準カラムを暗号化カラムに変換してください。
列レベルの暗号化の設定
列レベルの暗号化の設定には、以下の 4 つのステップが必要です:
PolarDB による KMS アクセスの承認 — データベースサーバーが Key Management Service (KMS) を使用してキー操作を行う権限を付与します。
透過的データ暗号化(TDE)の有効化 — 列レベルの暗号化は TDE と KMS 統合を共有します。
列レベルの暗号化パラメーターの有効化 — クラスター単位で本機能を有効化します。
必要な特権の付与 — ご利用のデータベースアカウントに
ENCRYPTION_FUN_ADMIN特権が必要です。
ステップ 1:PolarDB による KMS アクセスの承認
続行する前に、PolarDB による KMS アクセスの承認を行ってください。
ステップ 2:TDE の有効化
列レベルの暗号化は、キー管理のために TDE を利用します。PolarDB コンソールから TDE を有効化してください。
TDE の有効化により PolarDB クラスターが再起動します。実行前にダウンタイムを計画してください。
TDE を有効化した後は、無効化できません。
TDE 自体の有効化は、TDE 非対応テーブルおよび列レベルの暗号化を使用しないテーブルに対して、追加のパフォーマンスオーバーヘッドを発生させません。
PolarDB コンソールにログインします。左側のナビゲーションウィンドウで クラスター をクリックし、クラスターのリージョンを選択してクラスター ID をクリックします。
左側のナビゲーションウィンドウで 設定と管理 > セキュリティ をクリックします。
TDE 設定 タブで、TDE ステータス を有効化し、カスタムキーを指定します。

キーを選択します。「既存のカスタムキーを使用」または「ポップアップウィンドウでキーを選択」のいずれかを選択します。キーは KMS によって生成可能です。

KMS でキーを削除する前に、そのキーがすべての暗号化テーブル(履歴バージョンを含む)から関連付け解除されていることを確認してください。そうでない場合、PolarDB クラスターは再起動後に利用不可になる可能性があります。
ステップ 3:列レベルの暗号化パラメーターの有効化
loose_polar_enable_column_encryption パラメーターを ON に設定します。手順については、「クラスターおよびノードパラメーターの設定」をご参照ください。
| パラメーター | デフォルト | 説明 |
|---|---|---|
loose_polar_enable_column_encryption | OFF | 列レベルの暗号化を有効化または無効化します。ON に設定すると有効化されます。 |
ステップ 4:必要な特権の付与
列レベルの暗号化関数を使用するには、ご利用のデータベースアカウントに ENCRYPTION_FUN_ADMIN 特権が必要です。特権アカウント がこの特権を付与できます。
-- 特権の付与
GRANT ENCRYPTION_FUN_ADMIN ON *.* TO 'testman'@'%';
-- 特権の確認
SHOW GRANTS;暗号化カラムの定義と使用
暗号化カラムを含むテーブルの作成
カラムを暗号化としてマークするには、ENCRYPTION キーワードを使用します。
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;暗号化カラムへのインデックス構築
構文は標準カラムの場合と同じです。インデックスデータは暗号文として格納され、暗号化された値でソートされます。
CREATE INDEX idx_pan ON my_pan(pan);データの挿入
暗号化カラムに挿入されたデータは自動的に暗号化されます。enhanced_aes_encrypt を挿入時に呼び出す必要はありません。
INSERT INTO `my_pan` VALUES(1, "my_passwd", "aaa");データのクエリ
暗号化および復号のための 2 つの関数は以下のとおりです。
-- 値の暗号化(WHERE 句で使用)
enhanced_aes_encrypt(data, db_name, table_name)
-- 値の復号(SELECT 句または WHERE 句で使用)
enhanced_aes_decrypt(data)一般的なクエリパターンは以下の 3 つです。
-- 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");キーの管理
キー使用状況の確認
すべての暗号化テーブルで使用中のキーを確認するには、以下のステートメントを実行します。
SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;キーのローテーション
PolarDB はカスタムキーのマスターキーのバージョンを自動的に更新しません。キーを手動でローテーションするには、「キーのローテーション」をご参照ください。
キーのローテーション後は以下のようになります。
新規に作成される暗号化テーブルは新しいキーを使用します。
既存の暗号化テーブルは、元のキーで引き続き暗号化されたままです。
既存テーブルの再暗号化
データローテーションでは、テーブル内のすべてのデータを最新のキーで再暗号化します。この操作は CPU および I/O リソースを消費しますが、必須ではありません。ただし、既存のデータテーブルで使用されたすべてのキーは引き続き利用可能である必要があります。
ALTER TABLE <table_name> ENGINE = innodb, ALGORITHM = COPY;デフォルトでは、ALGORITHM = COPY によりデータローテーション中にテーブルがロックされます。サービス中断を回避するには、オンラインコピー機能を有効化してください(「オンラインコピーの有効化」をご参照ください)。
データローテーション中のロック動作:
| オンラインコピー DDL の状態 | ロック動作 |
|---|---|
| 無効(デフォルト) | データローテーション中にテーブルがロックされます |
| 有効 | テーブルはロックされず、同時 DML が許可されますが、同時 DDL は許可されません |
オンラインコピーの有効化(任意)
データローテーションやその他のスキーマ変更で ALGORITHM=COPY を使用する場合、デフォルトではテーブルがロックされ、サービス中断が発生する可能性があります。オンラインコピー DDL 機能を有効化することで、ロックなしまたは最小限のロックでこれらの操作を実行できます。
| パラメーター | デフォルト | 説明 |
|---|---|---|
loose_polar_support_online_copy_ddl_algorithm | OFF | オンラインコピー DDL の主スイッチです。ON に設定すると有効化されます。 |
loose_polar_support_online_copy_ddl_algorithm_for_modify | OFF | MODIFY ステートメントによるデータローテーションを許可します。ON に設定すると有効化されます。両方のパラメーターを同時に設定する必要があります。 |