0 / 0
Torna alla versione inglese della documentazione
Gestione chiave da parte di KMS
Ultimo aggiornamento: 07 ott 2024
Gestione chiave da parte di KMS

La crittografia modulare Parquet può funzionare con server KMS (Key Management Service) arbitrari. Una classe client KMS personalizzata, in grado di comunicare con il server KMS scelto, deve essere fornita all'istanza di Analytics Engine powered by Apache Spark. Questa classe deve implementare l'interfaccia KmsClient (parte dell'API di crittografia modulare Parquet). Analytics Engine powered by Apache Spark include il VaultClient KmsClient, può essere utilizzato immediatamente se si utilizza Hashicorp Vault come server KMS per le chiavi master. Se si utilizza o si intende utilizzare un sistema KMS diverso, è possibile sviluppare una classe KmsClient personalizzata (prendendo come esempio il codice di VaultClient ).

Classe KmsClient personalizzata

La crittografia modulare di parquet fornisce una semplice interfaccia chiamata org.apache.parquet.crypto.keytools.KmsClient con le seguenti due funzioni principali che è necessario implementare:

// Wraps a key - encrypts it with the master key, encodes the result and 
// potentially adds KMS-specific metadata.
public String wrapKey(byte[] keyBytes, String masterKeyIdentifier)
// Decrypts (unwraps) a key with the master key.
public byte[] unwrapKey(String wrappedKey, String masterKeyIdentifier)

Inoltre, l'interfaccia fornisce la seguente funzione di inizializzazione che supera i parametri KMS e altra configurazione:

public void initialize(Configuration configuration, String kmsInstanceID, String kmsInstanceURL, String accessToken)

Consultare Esempio di implementazione KmsClient per informazioni su come implementare un KmsClient.

Dopo aver sviluppato la classe KmsClient personalizzata, aggiungetela a un jar fornito ad Analytics Engine powered by Apache Spark e passatene il nome completo nella configurazione di Spark Hadoop, ad esempio:

sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "full.name.of.YourKmsClient"

Gestione chiavi di Hashicorp Vault

Se si decide di utilizzare Hashicorp Vault come server KMS, è possibile utilizzare il pacchetto preconfezionato VaultClient:

sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")

Creazione di chiavi principali

Consulta la documentazione Hashicorp Vault per le specifiche sulle azioni su Vault. Vedere:

  1. Abilitare il Transit Engine sia al percorso predefinito o fornendo un percorso personalizzato.
  2. Creare chiavi di codifica denominate.
  3. Configurare le politiche di accesso con le quali un utente o una macchina è consentito di accedere a queste chiavi denominate.

Scrittura dati crittografati

  1. Passare i seguenti parametri:

    • Impostare "parquet.encryption.kms.client.class" a "com.ibm.parquet.key.management.VaultClient":

      sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
      
    • Opzionale: Impostare il percorso personalizzato "parquet.encryption.kms.instance.id" al tuo motore di transito:

      sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id" , "north/transit1")
      
    • Impostare "parquet.encryption.kms.instance.url" all'URL dell'istanza di Vault:

      sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<hostname>:8200")
      
    • Impostare "parquet.encryption.key.access.token" su un token di accesso valido con la normativa di accesso allegata, che fornisce i diritti di accesso alle chiavi richieste nell'istanza di Vault:

      sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
      
    • Se il token si trova in un file locale, caricarlo:

      val token = scala.io.Source.fromFile("<token file>").mkStringsc.hadoopConfiguration.set("parquet.encryption.key.access.token" , token) 
      
  2. Specificare quali colonne devono essere crittografate e con quali chiavi padronali. È necessario specificare anche la chiave di piè di pagina. Ad esempio:

    val k1 = "key1"
    val k2 = "key2"
    val k3 = "key3"
    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 "parquet.encryption.footer.key" non è impostato, verrà lanciata un'eccezione.

Lettura dati crittografati

I metadati richiesti, tra cui l'ID e l'URL dell'istanza Hashicorp Vault , vengono memorizzati nei file Parquet crittografati.

Per leggere i metadati crittografati:

  1. Impostare client KMS all'implementazione del client Vault:

    sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
    
  2. Fornire il token di accesso con policy collegato che concede l'accesso alle relative chiavi:

    sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
    
  3. Chiama i comandi di lettura di Parquet regolari, quali:

    val dataFrame = spark.read.parquet("<path to encrypted files>")
    

Rotazione della chiave

Se è necessaria la rotazione delle chiavi, un amministratore con diritti di accesso alle azioni di rotazione delle chiavi KMS deve ruotare tasti master in Hashicorp Vault utilizzando la procedura descritta nella documentazione Hashicorp Vault . Successivamente l'amministratore può attivare la rotazione delle chiavi di Parquet chiamando:

public static void KeyToolkit.rotateMasterKeys(String folderPath, Configuration hadoopConfig)

Per abilitare la rotazione delle chiavi di Parquet, devono essere impostate le seguenti proprietà di configurazione Hadoop :

  • I parametri "parquet.encryption.key.access.token" e "parquet.encryption.kms.instance.url" devono impostare impostati e facoltativamente "parquet.encryption.kms.instance.id"
  • 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.VaultClient"

Ad esempio:

sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<hostname>:8200")sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
sc.hadoopConfiguration.set("parquet.encryption.kms.client.class","com.ibm.parquet.key.management.VaultClient")
sc.hadoopConfiguration.set("parquet.encryption.key.material.store.internally", "false")
KeyToolkit.rotateMasterKeys("<path to encrypted files>", sc.hadoopConfiguration)

Argomento principale: La crittografia del Parquet