Gestion des clés par l'application

Cette rubrique décrit comment faire gérer les clés de chiffrement de colonnes par l'application. Elle explique comment fournir les clés maîtresses et comment écrire et lire des données chiffrées à l'aide de ces clés.

Fourniture de clés principales

Pour fournir des clés principales :

  1. Définissez la classe implémentant la fabrique EncryptionProperties:

    parameter name: "parquet.crypto.factory.class"
    parameter value: "com.ibm.parquet.key.management.IBMKeyToolsFactory"
    
  2. Passez les clés maîtresses explicites au format suivant :

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

    Exemple :

    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 longueur des clés maîtresses avant leur encodage en base64 peut être de 16, 24 ou 32 octets (128, 192 ou 256 bits).

Ecriture de données chiffrées

Pour écrire des données chiffrées :

  1. Spécifiez quelles colonnes chiffrer et quelles clés maîtresses utiliser :

    parameter name:  "parquet.encryption.column.keys"
    parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,..."
    
  2. Spécifiez la clé du pied de page :

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

    Exemple :

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

    Remarque : si le paramètre "parquet.encryption.column.keys" ou le paramètre "parquet.encryption.footer.key" n'est pas défini, une exception est émise.

Lecture de données chiffrées

Les métadonnées requises sont stockées dans les fichiers Parquet chiffrés.

Pour lire les données chiffrées :

  1. Définissez la classe implémentant la fabrique EncryptionProperties:
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
  2. Fournissez les clés de chiffrement :
    sc.hadoopConfiguration.set("parquet.encryption.key.list" , "k1:iKwfmI5rDf7HwVBcqeNE6w== , k2:LjxH/aXxMduX6IQcwQgOlw== , k3:rnZHCxhUHr79Y6zvQnxSEQ==")
    
  3. Appelez les commandes de lecture Parquet standard, telles que :
    val dataFrame = spark.read.parquet("<path to encrypted files>")
    

Rotation des clés

Si un renouvellement de clé est requis, les propriétés de configuration Hadoop suivantes doivent être définies:

  • Les paramètres "parquet.encryption.key.list", "parquet.encryption.new.key.list"
  • Le paramètre "parquet.encryption.key.material.store.internally" doit avoir la valeur "false"
  • Le paramètre "parquet.encryption.kms.client.class" doit avoir la valeur "com.ibm.parquet.key.management.InMemoryKMS"
  • Le paramètre "parquet.crypto.factory.class" doit avoir la valeur "com.ibm.parquet.key.management.IBMKeyToolsFactory"

Exemple :

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)

Remarque : le renouvellement des clés ne peut être effectué que pour les fichiers écrits avec le paramètre "parquet.encryption.key.material.store.internally" ayant la valeur "false".