アプリケーションによる鍵の管理

このトピックでは、アプリケーションで列の暗号鍵を管理する方法について説明します。 マスター鍵を指定する方法と、それらのマスター鍵を使用して暗号化データの書き込み/読み取りを行う方法について説明します。

マスター鍵の指定

マスター鍵を指定するには、次のようにします。

  1. EncryptionPropertiesファクトリーを実装するクラスを設定します。

    parameter name: "parquet.crypto.factory.class"
    parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory"
    
  2. 明示的なマスター鍵を、以下の形式で渡します。

    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 ビット) にすることができます。

暗号化データの書き込み

暗号化データを書き込むには、次のようにします:

  1. 暗号化する列と、使用するマスター鍵を指定します。

    parameter name:  "parquet.encryption.column.keys"
    parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,..."
    
  2. フッター鍵を指定します:

    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 ファイルに格納されています。

暗号化データを読み取るには、次のようにします。

  1. EncryptionPropertiesファクトリーを実装するクラスを設定します。
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
  2. 暗号鍵を指定します:
    sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==")
    
  3. 次のように、通常の 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"に設定して書き込まれたファイルに対してのみ実行できます。