Gestione chiavi per applicazione

Questo argomento descrive come gestire le chiavi di cifratura delle colonne per applicazione. Spiega come fornire le chiavi principali e come scrivere e leggere i dati codificati utilizzando queste chiavi principali.

Fornitura di chiavi principali

Per fornire le chiavi principali:

  1. Impostare la classe che implementa EncryptionPropertiesFactory:

    parameter name: "parquet.crypto.factory.class"
    parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory"
    
  2. Inoltrare le chiavi principali esplicite nel formato seguente:

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

    Ad esempio:

    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 lunghezza delle chiavi principali prima della codifica base64 può essere di 16, 24 o 32 byte (128, 192 o 256 bit).

Scrittura di dati codificati

Per scrivere i dati codificati:

  1. Specificare quali colonne codificare e quali chiavi principali utilizzare:

    parameter name:  "parquet.encryption.column.keys"
    parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,..."
    
  2. Specificare la chiave del piè di pagina:

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

    Ad esempio:

    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 il parametro "parquet.encryption.column.keys" o il parametro "parquet.encryption.footer.key" non è impostato, verrà generata un'eccezione.

Lettura dei dati codificati

I metadati richiesti vengono memorizzati nei file Parquet crittografati.

Per leggere i dati codificati:

  1. Impostare la classe che implementa EncryptionPropertiesFactory:
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
  2. Fornire le chiavi di cifratura:
    sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==")
    
  3. Richiamare i comandi di lettura del parquet regolari, come:
    val dataFrame = spark.read.parquet("<path to encrypted files>")
    

Rotazione delle chiavi

Se è richiesta la rotazione della chiave, è necessario impostare le seguenti proprietà di configurazione Hadoop:

  • I parametri "parquet.encryption.key.list", "parquet.encryption.new.key.list"
  • Il parametro "parquet.encryption.key.material.store.internally" deve essere impostato su "false"
  • Il parametro "parquet.encryption.kms.client.class" deve essere impostato su "com.ibm.parquet.key.management.InMemoryKMS"
  • Il parametro "parquet.crypto.factory.class" deve essere impostato su "com.ibm.parquet.key.management.IBMKeyToolsFactory"

Ad esempio:

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 rotazione delle chiavi può essere eseguita solo per i file scritti con parametro "parquet.encryption.key.material.store.internally" impostato su "false".