Parquet モジュラー暗号化は、任意の鍵管理サービス (KMS) サーバーと連携できます。 選択された KMS サーバーと通信できるカスタム KMS クライアント・クラスを Analytics Engine powered by Apache Spark インスタンスに提供する必要があります。 このクラスは、KmsClient インターフェース (Parquet モジュラー暗号化 API の一部) を実装する必要があります。 Analytics Engine powered by Apache Spark には、マスター鍵の KMS サーバーとして Hashicorp Vault を使用する場合にすぐに使用可能な VaultClient KmsClient が含まれています。 別の KMS システムを使用しているか使用する予定の場合は、カスタム KmsClient クラスを開発できます (VaultClient コードを例として使用します)。
カスタム KmsClient クラス
Parquet モジュラー暗号化は、実装する必要がある以下の 2 つの主要な機能を備えた、org.apache.parquet.crypto.keytools.KmsClient
と呼ばれる単純なインターフェースを提供します。
// Wraps a key - encrypts it with the master key, encodes the result and
// potentially adds KMS-specific metadata.
public String wrapKey(byte[] keyBytes, String masterKeyIdentifier)
// Decrypts (unwraps) a key with the master key.
public byte[] unwrapKey(String wrappedKey, String masterKeyIdentifier)
さらに、このインターフェースは、KMS パラメーターとその他の構成を渡す以下の初期化関数を提供します。
public void initialize(Configuration configuration, String kmsInstanceID, String kmsInstanceURL, String accessToken)
KmsClient の実装方法については、『KmsClient 実装の例』 を参照してください。
カスタム KmsClient クラスを開発した後に、それを Analytics Engine powered by Apache Spark に提供される jar に追加し、Spark Hadoop 構成でそのフルネームを渡します。以下に例を示します。
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "full.name.of.YourKmsClient"
Hashicorp Vault による鍵管理
KMS サーバーとして Hashicorp Vault を使用することにした場合は、以下のように、プリパッケージされた VaultClient を使用できます。
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
マスター鍵の作成
ボールトでのアクションに関する詳細については、Hashicorp Vault の資料を参照してください。 以下を参照してください。
- デフォルト・パスを使用するか、カスタム・パスを指定して、Transit Engine を有効にします。
- 名前付き暗号鍵を作成します。
- ユーザーまたはマシンが該当する名前付き鍵にアクセスできるようにするアクセス・ポリシーを構成します。
暗号化データの書き込み
以下のパラメーターを渡します。
"parquet.encryption.kms.client.class"
を"com.ibm.parquet.key.management.VaultClient"
に設定します。sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
オプション: 中継エンジンへのカスタム・パス
"parquet.encryption.kms.instance.id"
を設定します。sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id" , "north/transit1")
"parquet.encryption.kms.instance.url"
を Vault インスタンスの URL に設定します。sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<hostname>:8200")
"parquet.encryption.key.access.token"
を、Vault インスタンス内の必要な鍵へのアクセス権限を提供するアクセス・ポリシーが付加された有効なアクセス・トークンに設定します。sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
トークンがローカル・ファイルにある場合は、以下のようにそれをロードします。
val token = scala.io.Source.fromFile("<token file>").mkStringsc.hadoopConfiguration.set("parquet.encryption.key.access.token" , token)
暗号化する必要がある列と、使用するマスター鍵を指定します。 フッター鍵も指定する必要があります。 次に例を示します。
val k1 = "key1" val k2 = "key2" val k3 = "key3" dataFrame.write .option("parquet.encryption.footer.key" , k1) .option("parquet.encryption.column.keys" , k2+":SSN,Address;"+k3+":CreditCard") .parquet("<path to encrypted files>")
注:
"parquet.encryption.column.keys"
パラメーターまたは"parquet.encryption.footer.key"
パラメーターのいずれかが設定されていない場合、例外がスローされます。
暗号化データの読み取り
Hashicorp Vault インスタンスの ID や URL などの必要なメタデータは、暗号化された Parquet ファイルに格納されています。
暗号化されたメタデータを読み取るには、次のようにします。
以下のように、KMS クライアントをボールト・クライアント実装に設定します。
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
以下のように、関連する鍵へのアクセス権限を付与するポリシーが付加されたアクセス・トークンを指定します。
sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
次のように、通常の Parquet の read コマンドを呼び出します。
val dataFrame = spark.read.parquet("<path to encrypted files>")
鍵のローテーション
鍵のローテーションが必要な場合は、 KMS 鍵のローテーション・アクションに対するアクセス権を持つ管理者が、Hashicorp Vault の資料で説明されている手順を使用して、Hashicorp Vault 内のマスター鍵をローテーションする必要があります。 その後、管理者は以下を呼び出すことで Parquet 鍵のローテーションをトリガーできます。
public static void KeyToolkit.rotateMasterKeys(String folderPath, Configuration hadoopConfig)
Parquet 鍵のローテーションを有効にするには、以下の Hadoop 構成プロパティーを設定する必要があります。
- パラメーター
"parquet.encryption.key.access.token"
および"parquet.encryption.kms.instance.url"
を設定する必要があり、オプションで"parquet.encryption.kms.instance.id"
です - パラメーター
"parquet.encryption.key.material.store.internally"
を"false"
に設定する必要があります。 - パラメーター
"parquet.encryption.kms.client.class"
を"com.ibm.parquet.key.management.VaultClient"
に設定する必要があります
次に例を示します。
sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<hostname>:8200")sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
sc.hadoopConfiguration.set("parquet.encryption.kms.client.class","com.ibm.parquet.key.management.VaultClient")
sc.hadoopConfiguration.set("parquet.encryption.key.material.store.internally", "false")
KeyToolkit.rotateMasterKeys("<path to encrypted files>", sc.hadoopConfiguration)
親トピック: Parquet 暗号化