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:
-
Impostare la classe che implementa EncryptionPropertiesFactory:
parameter name: "parquet.crypto.factory.class" parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory" -
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:
-
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>,..." -
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:
- Impostare la classe che implementa EncryptionPropertiesFactory:
sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory") - Fornire le chiavi di cifratura:
sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==") - 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".