Le chiffrement modulaire Parquet peut fonctionner avec des serveurs KMS (Key Management Service) arbitraires. Une classe client KMS personnalisée, capable de communiquer avec le serveur KMS choisi, doit être fourni à l'instance Analytics Engine powered by Apache Spark. Cette classe doit implémenter l'interface KmsClient (partie de l'API de chiffrement modulaire Parquet). Analytics Engine powered by Apache Spark inclut l'interface KmsClient VaultClient, qui est prête à l'emploi si vous utilisez Hashicorp Vault comme serveur KMS pour les clés principales. Si vous utilisez ou prévoyez d'utiliser un autre système KMS, vous pouvez développer une classe KmsClient personnalisée (en prenant le code VaultClient comme exemple).
Classe KmsClient personnalisée
Le chiffrement modulaire du Parquet fournit une interface simple appelée org.apache.parquet.crypto.keytools.KmsClient
avec les deux fonctions principales suivantes que vous devez implémenter :
// 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)
De plus, l'interface fournit la fonction d'initialisation suivante qui transmet les paramètres KMS et d'autres configurations :
public void initialize(Configuration configuration, String kmsInstanceID, String kmsInstanceURL, String accessToken)
Voir Exemple d'implémentation de KmsClient pour savoir comment implémenter un client KmsClient.
Après avoir développé la classe KmsClient personnalisée, ajoutez-la à un fichier JAR fourni à Analytics Engine powered by Apache Spark et transmettez son nom complet dans la configuration de Spark Hadoop. Par exemple :
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "full.name.of.YourKmsClient"
Gestion des clés par Hashicorp Vault
Si vous décidez d'utiliser Hashicorp Vault comme serveur KMS, vous pouvez utiliser la classe VaultClient prépackagée :
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Création de clés principales
Pour plus de détails sur les actions exécutables sur Vault, voir la documentation Hashicorp Vault. Voir :
- Activez Transit Engine au niveau du chemin par défaut ou en fournissant un chemin personnalisé.
- Créez des clés de chiffrement nommées.
- Configurez les stratégies d'accès avec lesquelles un utilisateur ou une machine est autorisé à accéder à ces clés nommées.
Ecriture de données chiffrées
Transmettez les paramètres suivants :
Définissez
"parquet.encryption.kms.client.class"
sur"com.ibm.parquet.key.management.VaultClient"
:sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Facultatif: définissez le chemin personnalisé
"parquet.encryption.kms.instance.id"
sur votre moteur de transit:sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id" , "north/transit1")
Définissez
"parquet.encryption.kms.instance.url"
sur l'URL de votre instance de coffre :sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<hostname>:8200")
Définissez
"parquet.encryption.key.access.token"
sur un jeton d'accès valide avec la règle d'accès associée, qui fournit des droits d'accès aux clés requises dans votre instance de coffre :sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
Si le jeton se trouve dans un fichier local, chargez-le :
val token = scala.io.Source.fromFile("<token file>").mkStringsc.hadoopConfiguration.set("parquet.encryption.key.access.token" , token)
Spécifiez les colonnes qui doivent être chiffrées, et avec quelles clés principales. Vous devez également spécifier la clé de bas de page. Par exemple :
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>")
Remarque : Si le paramètre
"parquet.encryption.column.keys"
ou"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 Hashicorp Vault, sont stockées dans les fichiers Parquet chiffrés.
Pour lire les métadonnées chiffrées :
Affectez au client KMS l'implémentation du client Vault :
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Indiquez le jeton d'accès doté d'une stratégie associée qui octroie l'accès aux clés appropriées :
sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
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, un administrateur disposant des droits d'accès aux actions de rotation de clés KMS doit procéder à la rotation des clés principales dans Hashicorp Vault à l'aide de la procédure décrite dans la documentation Hashicorp Vault. Par la suite, l'administrateur peut déclencher la rotation des clés 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"
et"parquet.encryption.kms.instance.url"
doivent définir l'ensemble, et éventuellement"parquet.encryption.kms.instance.id"
- Le paramètre
"parquet.encryption.key.material.store.internally"
doit être défini sur"false"
. - Le paramètre
"parquet.encryption.kms.client.class"
doit avoir la valeur"com.ibm.parquet.key.management.VaultClient"
Par exemple :
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)
Rubrique parent : Chiffrement du Parquet