Gestion des clés par Key Protect

Cette rubrique décrit comment gérer les clés de chiffrement de colonnes avec IBM® Key Protect for IBM Cloud® (Key Protect). Elle explique comment créer une instance de Key Protect, comment lui fournir les clés maîtresses et comment écrire et lire des données chiffrées à l'aide de ces clés.

Création d'une instance de Key Protect et de clés maîtresses

Pour créer une instance de Key Protect et des clés maîtresses :

  1. Créez une instance de service Key Protect. Voir Mise à disposition du service.

  2. Créez les clés racine du client dans cette instance. Les clés racine du client servent de clés maîtresses pour le chiffrement des colonnes. Voir Création de clés racine.

    Si vous souhaitez utiliser des clés racine existantes, vous pouvez les importer. Voir Importation de clés racine.

  3. Configurez les droits d'accès aux clés maîtresses à l'aide du service IBM IAM. Voir Octroi de l'accès aux clés principales.

Ecriture de données chiffrées

Pour écrire des données chiffrées :

  1. Transmettez les paramètres suivants à IBM Analytics Engine Serverless:

    • "parquet.crypto.factory.class": classe implémentant la fabrique EncryptionProperties. Défini sur "com.ibm.parquet.key.management.IBMKeyToolsFactory".
      sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
      
    • "parquet.encryption.kms.instance.id" : ID de votre instance KeyProtect, par exemple :
      sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id" , "27861a9a-6779-4026-bca4-01e59acf0767")
      
    • "parquet.encryption.kms.instance.url" : URL de votre instance KeyProtect, par exemple :
      sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<region>.kms.cloud.ibm.com")
      
    • "parquet.encryption.key.access.token" : un jeton IAM valide avec les droits d'accès aux clés requises dans votre instance KeyProtect, par exemple, :
      sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
      
      Si vous conservez le jeton dans un fichier local, vous pouvez le charger.
      val token = scala.io.Source.fromFile("<token file>").mkString
      sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , token)
      
  2. Spécifiez quelles colonnes doivent être chiffrées, et avec quelles clés maîtresses. Vous devez également spécifier la clé de pied de page. Dans la gestion des clés par Key Protect, les ID des clés maîtresses sont les ID des CRK (clés racine du client) Key Protect, que vous pouvez trouver dans la fenêtre du service IBM Cloud. Exemple :

    val k1 = "d1ae3fc2-6b7d-4a03-abb6-644e02933734"
    val k2 = "c4a21521-2a78-4968-a7c2-57c481f58d5c"
    val k3 = "a4ae4bc2-9d78-8748-f8a2-17f584d48c5b"
    
    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, y compris l'ID et l'URL de l'instance KeyProtect, sont stockées dans les fichiers Parquet chiffrés.

Pour lire les métadonné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 le jeton d'accès IAM correspondant aux clés requises :
    sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
    
  3. Appelez les commandes de lecture Parquet standard, telles que :
    val dataFrame = spark.read.parquet("<path to encrypted files>")
    

Rotation des clés

Si la rotation des clés est requise, l'administrateur doit effectuer la rotation des clés principales dans Key Protect à l'aide de la procédure décrite dans Rotation manuelle des clés. Ensuite, l'administrateur peut déclencher le renouvellement de clé Parquet en appelant :

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

Pour que la rotation des clés Parquet puisse être activée, les propriétés de configuration Hadoop suivantes doivent être définies :

  • Les paramètres "parquet.encryption.key.access.token", "parquet.encryption.kms.instance.url", "parquet.encryption.kms.instance.id"

  • 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.KeyProtectClient"

  • Le paramètre "parquet.crypto.factory.class" doit être défini sur "com.ibm.parquet.key.management.IBMKeyToolsFactory"

    Exemple :

    sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
    sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<region>.kms.cloud.ibm.com")
    sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id", "27861a9a-6779-4026-bca4-01e59acf0767")
    sc.hadoopConfiguration.set("parquet.encryption.key.material.store.internally", "false")
    sc.hadoopConfiguration.set("parquet.encryption.kms.client.class" "com.ibm.parquet.key.management.KeyProtectClient")
    sc.hadoopConfiguration.set("parquet.crypto.factory.class","com.ibm.parquet.key.management.IBMKeyToolsFactory")
    
    KeyToolkit.rotateMasterKeys("<path to encrypted files>", sc.hadoopConfiguration)