Gestión de claves por aplicación

En este tema se describe cómo gestionar las claves de cifrado de columnas por aplicación. Se explica cómo proporcionar claves maestras y cómo escribir y leer datos cifrados utilizando estas claves maestras.

Suministro de claves maestras

Para proporcionar claves maestras:

  1. Establezca la clase que implementa EncryptionPropertiesFactory:

    parameter name: "parquet.crypto.factory.class"
    parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory"
    
  2. Pase las claves maestras explícitas, en el formato siguiente:

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

    Por ejemplo:

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

    La longitud de las claves maestras antes de la codificación base64 puede ser 16, 24 o 32 bytes (128, 192 o 256 bits).

Escritura de datos cifrados

Para escribir datos cifrados:

  1. Especifique qué columnas cifrar, y qué claves maestras utilizar:

    parameter name:  "parquet.encryption.column.keys"
    parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,..."
    
  2. Especifique la clave de pie de página:

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

    Por ejemplo:

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

    Nota:: Si el parámetro "parquet.encryption.column.keys" o el parámetro "parquet.encryption.footer.key" no están establecidos, se generará una excepción.

Lectura de datos cifrados

Los metadatos necesarios se almacenan en los archivos Parquet cifrados.

Para leer los datos cifrados:

  1. Establezca la clase que implementa EncryptionPropertiesFactory:
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
  2. Proporcione las claves de cifrado:
    sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==")
    
  3. Llame a los mandatos de lectura de Parquet habituales como, por ejemplo:
    val dataFrame = spark.read.parquet("<path to encrypted files>")
    

Rotación de claves

Si es necesaria la rotación de claves, se deben establecer las siguientes propiedades de configuración de Hadoop:

  • Los parámetros "parquet.encryption.key.list", "parquet.encryption.new.key.list"
  • El parámetro "parquet.encryption.key.material.store.internally" se debe establecer en "false"
  • El parámetro "parquet.encryption.kms.client.class" se debe establecer en "com.ibm.parquet.key.management.InMemoryKMS"
  • El parámetro "parquet.crypto.factory.class" se debe establecer en "com.ibm.parquet.key.management.IBMKeyToolsFactory"

Por ejemplo:

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: la rotación de claves solo se puede realizar para archivos escritos con el parámetro "parquet.encryption.key.material.store.internally" establecido en "false".