AnalyticDB for MySQL の Basic Edition の Apache Spark 常時暗号化コンピュートエンジンは、機密データを暗号化し、暗号文として転送・保存します。キーの所有者のみがデータを復号でき、データ漏洩を防ぎます。本 Topic では、ApsaraDB RDS for MySQL を例に、Basic Edition の Apache Spark 常時暗号化コンピュートエンジンを使用してデータを暗号化し、暗号化されたデータに対して計算と分析を行い、計算結果を復号する方法について説明します。
前提条件
AnalyticDB for MySQL の Enterprise Edition、Basic Edition、または Data Lakehouse Edition のクラスターが作成されていること。
AnalyticDB for MySQL クラスター用のデータベースアカウントが作成されていること。
Alibaba Cloud アカウントを使用する場合は、特権アカウントを作成するだけで済みます。
Resource Access Management (RAM) ユーザーを使用する場合は、特権アカウントと標準アカウントを作成し、標準アカウントを RAM ユーザーに関連付ける必要があります。
AliyunADBFullAccess、AliyunADBSparkProcessingDataRole、および AnalyticDB for MySQL のデータベースとテーブルに対する読み取り/書き込み権限が RAM ユーザーに付与されていること。詳細については、「アカウントの権限付与」をご参照ください。
クライアントツールを実行するために、Java 8 開発環境がインストールされていること。本 Topic では、Linux オペレーティングシステムを実行する ECS インスタンスを例として使用します。
注意事項
adb-crypto-tool クライアントツールは、MySQL および PostgreSQL データベースに保存されているデータのみの暗号化または復号をサポートします。
説明MySQL または PostgreSQL データベースは、ApsaraDB データベース、自己管理データベース、またはサードパーティのクラウドデータベースのいずれでもかまいません。
機密エンジンは、Decimal データ型またはネストされたデータ型をサポートしていません。代わりに Float または Double データ型を使用できます。
PostgreSQL データベースの場合、機密エンジンは
Char(n)データ型の末尾のスペースを自動的に削除しません。代わりにVarchar(n)型を使用してください。
データ準備
本 Topic では、adb という名前の ApsaraDB RDS for MySQL データベースを使用します。データベース内に customer という名前のテーブルが作成されます。次の例は、ステートメントを示しています:
CREATE DATABASE IF NOT EXIST adb;
CREATE TABLE IF NOT EXISTS adb.customer(
id int,
name varchar(1023),
address varchar(1023),
age int
);次のステートメントを使用して、customer テーブルにデータを挿入します:
INSERT INTO customer (id,name,address,age) VALUES('1', 'james', 'beijing', '10');
INSERT INTO customer (id,name,address,age) VALUES('2', 'bond', 'beijing', '15');
INSERT INTO customer (id,name,address,age) VALUES('3', 'jack', 'shanghai', '20');
INSERT INTO customer (id,name,address,age) VALUES('4', 'lucy', 'hangzhou', '25');
INSERT INTO customer (id,name,address,age) VALUES('5', 'tom', 'qingdao','30');手順
ステップ 1: 暗号化/復号クライアントのインストール。adb-crypto-tool クライアントをダウンロードしてインストールできます。
ステップ 2: データの暗号化とアップロード。クライアントツールを使用してプレーンテキストデータを暗号文に変換し、暗号文を Object Storage Service (OSS) にアップロードできます。
ステップ 3: 暗号文に対する SQL 計算の実行。AnalyticDB for MySQL の Apache Spark 常時暗号化コンピュートエンジンの SQL ウィンドウで暗号文を計算できます。計算結果は暗号文として OSS に保存されます。
ステップ 4: 暗号文の計算結果のダウンロードと復号。暗号文の計算結果をオンプレミスデバイスにダウンロードできます。クライアントツールを使用してデータを復号すると、復号されたデータは自動的にデータベースのプレーンテキストテーブルに挿入されます。
暗号化/復号クライアントのインストール
クライアントツールをダウンロードします: adb-crypto-tool-1.0.4.zip。
adb-crypto-tool-1.0.4.zip パッケージを解凍します。
unzip adb-crypto-tool-1.0.4.zipパッケージを解凍すると、次の 3 つのファイルとフォルダが作成されます:
cryptoTool: 暗号化/復号ツールのエントリポイント。
説明cryptoTool は bash 環境に依存します。Windows システムでは、Windows Subsystem for Linux (WSL) などのツールを使用して実行できます。
demo.json: サンプルの設定ファイル。
dist: 暗号化/復号ツールの依存パッケージ。
データの暗号化とアップロード
暗号化設定ファイルを準備します。demo.json ファイルに基づいて設定ファイルを作成するか、demo.json ファイルの
table、jdbcUrl、username、passwordパラメーターを直接変更できます。本 Topic では、encryption_config.jsonという名前の新しい設定ファイルを例として使用します。次の例は、設定を示しています:{ "dataDir": "file:///tmp", "table": [ "customer" ], "encAlgo": "AES_128_GCM", "mek": "00112233445566778899aabbccdd****", "jdbcUrl": "jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb", "username": "demo_user", "password": "demo_password", "saveMode": "Overwrite", "format":"EncBlocksSource" }次の表にパラメーターを示します。
パラメーター
説明
dataDir暗号文データセットを保存するローカルパス。
table暗号化するテーブルの名前。本 Topic では customer を例として使用します。
encAlgo暗号文の暗号化/復号アルゴリズム。AES_128_GCM のみがサポートされています。
mekデータ暗号化キー (DEK) を暗号化するために使用されるマスター暗号化キー (MEK)。詳細については、「概要」 Topic の「キー」セクションをご参照ください。
MEK は 16 バイトの 16 進数文字列である必要があります。OpenSSL ツールを使用してキーを生成できます。本 Topic では、
00112233445566778899aabbccdd****を例として使用します。警告MEK は暗号化されたデータにアクセスするためのルート認証情報です。MEK を紛失すると、既存のデータにアクセスできなくなります。MEK は安全に保管してください。
機密エンジンは MEK を生成またはバックアップしません。必要なフォーマットで MEK を提供する必要があります。
jdbcUrlデータベースの接続アドレスと名前。MySQL および PostgreSQL データベースのみがサポートされています。接続アドレスには、次のいずれかのフォーマットを使用します:
MySQL データベース:
jdbc:mysql://ip:port/database_namePostgreSQL データベース:
jdbc:postgresql://ip:port/database_name
本 Topic では、
jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adbを例として使用します。userNameデータベースアカウント。
passwordアカウントのパスワード。
saveMode暗号化ファイルの宛先パスが既に存在する場合に、暗号文データセットを保存するために使用されるモード。次のモードがサポートされています:
Append: データを追記します。
ErrorIfExists: 宛先が存在する場合、エラーを報告して終了します。エラーの詳細はログで確認できます。
Ignore: 宛先が存在する場合、データの書き込みをスキップします。エラーの詳細はログで確認できません。
Overwrite: 既存のデータを上書きします。
format暗号文のフォーマット。EncBlocksSource フォーマットのみがサポートされています。
クライアントツールを実行して、
adbデータベースのcustomerテーブルのデータを暗号化します。暗号化されたデータセットは、設定ファイルのdataDirパラメーターで指定されたパスに保存されます。./cryptoTool encrypt encryption_config.json暗号化されたデータセットを含む
customerフォルダを OSS にアップロードします。本 Topic では、パスoss://testBucketName/adb/Spark/customerを例として使用します。詳細については、「簡易アップロード」をご参照ください。
暗号文データに対する SQL クエリの実行
AnalyticDB for MySQL コンソールにログインします。コンソールの左上隅でリージョンを選択します。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。管理するクラスターを見つけて、クラスター ID をクリックします。
左側のナビゲーションウィンドウで、[ジョブ開発] > [SQL 開発] を選択します。
[SQLConsole] ウィンドウで、Spark エンジンとジョブ リソースグループを選択します。
次のステートメントを実行して、暗号文に対して SQL 計算を実行します。
機密コンピューティングを有効にし、カスタマーマスターキーを設定します。
-- 機密コンピューティングを有効にします。 set spark.adb.tee.enabled=true; -- カスタマーマスターキーを設定します。このキーは、暗号化設定ファイルの MEK と同じである必要があります。 set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****; -- 暗号文データと計算結果を保存するためのデータベースを作成します。 CREATE DATABASE IF NOT EXISTS test_db;機密エンジンを使用して、
customerという名前の外部テーブルを作成します。LOCATION パラメーターは、暗号文データセットフォルダの OSS パスを指定します。本 Topic では、oss://testBucketName/adb/Spark/customerを例として使用します。set spark.adb.tee.enabled=true; set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****; CREATE TABLE IF NOT EXISTS test_db.customer USING EncBlocksSource LOCATION 'oss://testBucketName/adb/Spark/customer';customer_outputという名前の外部テーブルを作成します。customerテーブルからの SQL 計算結果をcustomer_output外部テーブルに書き込みます。customer_output外部テーブルのデータはoss://testBucketName/adb/Spark/customer_outputに保存されます。set spark.adb.tee.enabled=true; set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****; CREATE TABLE IF NOT EXISTS test_db.customer_output USING EncBlocksSource LOCATION 'oss://testBucketName/adb/Spark/customer_output' AS SELECT * FROM test_db.customer WHERE id = 1;
暗号文の結果のダウンロードと復号
oss://testBucketName/adb/Spark/customer_outputパスから暗号文の計算結果をローカルデバイスにダウンロードします。詳細については、「オブジェクトのダウンロード」をご参照ください。復号設定ファイルを準備します。本 Topic では、
decryption_config.jsonという名前の新しい設定ファイルを例として使用します。次の例は、設定を示しています。{ "dataDir": "file:///tmp", "table": [ "customer_output" ], "encAlgo": "AES_128_GCM", "outTblPrefix": "abc_", "mek": "00112233445566778899aabbccdd****", "jdbcUrl": "jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb", "username": "demo_user", "password": "demo_password", "saveMode": "Overwrite", "format":"EncBlocksSource" }次の表にパラメーターを示します:
パラメーター
説明
dataDir暗号文データセットを保存するローカルパス。
table暗号文データセットのフォルダ名。
encAlgo暗号文の暗号化/復号アルゴリズム。AES_128_GCM のみがサポートされています。
outTblPrefix
復号後のデータベース内のテーブル名のプレフィックス。宛先テーブル名は、プレフィックスと暗号文データセットのフォルダ名で構成されます。
mekデータ暗号化キー (DEK) を暗号化するために使用されるマスター暗号化キー (MEK)。詳細については、「概要」 Topic の「キー」セクションをご参照ください。
MEK は 16 バイトの 16 進数文字列である必要があります。OpenSSL ツールを使用してキーを生成できます。本 Topic では、
00112233445566778899aabbccdd****を例として使用します。警告MEK は暗号化されたデータにアクセスするためのルート認証情報です。MEK を紛失すると、既存のデータにアクセスできなくなります。MEK は安全に保管してください。
機密エンジンは MEK を生成またはバックアップしません。必要なフォーマットで MEK を提供する必要があります。
jdbcUrl
データベースの接続アドレスと名前。MySQL および PostgreSQL データベースのみがサポートされています。接続アドレスには、次のいずれかのフォーマットを使用します:
MySQL データベース:
jdbc:mysql://ip:port/database_namePostgreSQL データベース:
jdbc:postgresql://ip:port/database_name
本 Topic では、
jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adbを例として使用します。userNameデータベースアカウント。
passwordアカウントのパスワード。
saveMode復号されたデータが保存される宛先データベースが既に存在する場合に、プレーンテキストデータセットを生成するために使用されるモード。次のモードがサポートされています:
Append: データを追記します。
ErrorIfExists: 宛先が存在する場合、エラーを報告して終了します。エラーの詳細はログで確認できます。
Ignore: 宛先が存在する場合、データの書き込みをスキップします。エラーの詳細はログで確認できません。
Overwrite: 既存のデータを上書きします。
format暗号文のフォーマット。EncBlocksSource フォーマットのみがサポートされています。
クライアントを実行してデータを復号します。復号されたデータは、
adbApsaraDB RDS for MySQL データベースに自動的に挿入されます。宛先テーブルの名前は、`outTblePrefix` パラメーターと暗号化されたデータセットのフォルダ名によって決まります。この例では、テーブル名はadb_customer_outputです。./cryptoTool decrypt decryption_config.jsonApsaraDB RDS for MySQL データベースで復号されたデータを表示します。計算結果はプレーンテキストで表示されます。
SELECT * FROM adb_customer_output;結果の例:
+--------+----------+----------+----------+ | id | name | address | age | +--------+----------+----------+----------+ | 1 | james | beijing | 10 | +--------+----------+----------+----------+