アプリケーションによる鍵の管理
このトピックでは、アプリケーションで列の暗号鍵を管理する方法について説明します。 マスター鍵を指定する方法と、それらのマスター鍵を使用して暗号化データの書き込み/読み取りを行う方法について説明します。
マスター鍵の指定
マスター鍵を指定するには、次のようにします。
-
EncryptionPropertiesファクトリーを実装するクラスを設定します。
parameter name: "parquet.crypto.factory.class" parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory" -
明示的なマスター鍵を、以下の形式で渡します。
parameter name: "parquet.encryption.key.list" parameter value: "<master key ID>:<master key (base64)> , <master key ID>:<master key (base64)>.."以下に例を示します。
sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory") sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==")Base64 でエンコードする前のマスター鍵の長さは、16、24 または 32 バイト (128、192 または 256 ビット) にすることができます。
暗号化データの書き込み
暗号化データを書き込むには、次のようにします:
-
暗号化する列と、使用するマスター鍵を指定します。
parameter name: "parquet.encryption.column.keys" parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,..." -
フッター鍵を指定します:
parameter name: "parquet.encryption.footer.key" parameter value: "<master key ID>"以下に例を示します。
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"パラメーターのいずれかが設定されていない場合、例外がスローされます。
暗号化データの読み取り
必要なメタデータは、暗号化された Parquet ファイルに格納されています。
暗号化データを読み取るには、次のようにします。
- EncryptionPropertiesファクトリーを実装するクラスを設定します。
sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory") - 暗号鍵を指定します:
sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==") - 次のように、通常の Parquet の read コマンドを呼び出します。
val dataFrame = spark.read.parquet("<path to encrypted files>")
鍵のローテーション
鍵のローテーションが必要な場合は、以下のHadoop構成プロパティーを設定する必要があります:
- パラメーター
"parquet.encryption.key.list"、"parquet.encryption.new.key.list" - パラメーター
"parquet.encryption.key.material.store.internally"を"false"に設定する必要があります - パラメーター
"parquet.encryption.kms.client.class"を"com.ibm.parquet.key.management.InMemoryKMS"に設定する必要があります - パラメーター
"parquet.crypto.factory.class"を"com.ibm.parquet.key.management.IBMKeyToolsFactory"に設定する必要があります
以下に例を示します。
sc.hadoopConfiguration.set("parquet.encryption.key.list", OLD_KEYS)
sc.hadoopConfiguration.set("parquet.encryption.new.key.list", NEW_KEYS)
sc.hadoopConfiguration.set("parquet.encryption.key.material.store.internally", "false")
sc.hadoopConfiguration.set("parquet.encryption.kms.client.class", "com.ibm.parquet.key.management.InMemoryKMS")
sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
KeyToolkit.rotateMasterKeys("<path to encrypted files>", sc.hadoopConfiguration)
注:鍵のローテーションは、"parquet.encryption.key.material.store.internally"パラメーターを"false"に設定して書き込まれたファイルに対してのみ実行できます。