Gerenciamento de chave por aplicativo

Este tópico descreve como gerenciar as chaves de criptografia de coluna por aplicativo. Ela explica como fornecer chaves mestras e como gravar e ler dados criptografados usando essas chaves mestras.

Fornecendo chaves mestras

Para fornecer chaves mestras:

  1. Configure a classe implementa EncryptionPropertiesFactory:

    parameter name: "parquet.crypto.factory.class"
    parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory"
    
  2. Passe as chaves mestras explícitas, no formato a seguir:

    parameter name: "parquet.encryption.key.list"
    parameter value: "<master key ID>:<master key (base64)> , <master key ID>:<master key (base64)>.."
    

    Por exemplo:

    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==")
    

    O comprimento das chaves mestras antes da codificação em base64 pode ser de 16, 24 ou 32 bytes (128, 192 ou 256 bits).

Gravando dados criptografados

Para gravar dados criptografados:

  1. Especifique quais colunas serão criptografadas e quais chaves mestras serão usadas:

    parameter name:  "parquet.encryption.column.keys"
    parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,..."
    
  2. Especifique a chave de rodapé:

    parameter name:  "parquet.encryption.footer.key"
    parameter value:  "<master key ID>"
    

    Por exemplo:

    dataFrame.write
    .option("parquet.encryption.footer.key" , "k1")
    .option("parquet.encryption.column.keys" , "k2:SSN,Address;k3:CreditCard")
    .parquet("<path to encrypted files>")
    

    Nota: se o parâmetro "parquet.encryption.column.keys" ou o parâmetro "parquet.encryption.footer.key" não for configurado, uma exceção será lançada.

Lendo dados criptografados

Os metadados necessários são armazenados nos arquivos Parquet criptografados.

Para ler os dados criptografados:

  1. Configure a classe implementa EncryptionPropertiesFactory:
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
  2. Forneça as chaves de criptografia:
    sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==")
    
  3. Chame os comandos de leitura regulares do parquet, como:
    val dataFrame = spark.read.parquet("<path to encrypted files>")
    

Rotação de chaves

Se a rotação de chave for necessária, as propriedades de configuração a seguir do Hadoop deverão ser configuradas:

  • Os parâmetros "parquet.encryption.key.list", "parquet.encryption.new.key.list"
  • O parâmetro "parquet.encryption.key.material.store.internally" deve ser configurado como "false"
  • O parâmetro "parquet.encryption.kms.client.class" deve ser configurado como "com.ibm.parquet.key.management.InMemoryKMS"
  • O parâmetro "parquet.crypto.factory.class" deve ser configurado como "com.ibm.parquet.key.management.IBMKeyToolsFactory"

Por exemplo:

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)

Nota: a rotação de chaves pode ser executada apenas para arquivos gravados com o parâmetro "parquet.encryption.key.material.store.internally" configurado como "false".