Modulare Parquet-Verschlüsselung kann mit beliebigen KMS-Servern (KMS - Key Management Service) arbeiten. Eine angepasste KMS-Clientklasse, die mit dem ausgewählten KMS-Server kommunizieren kann, muss der Analytics Engine powered by Apache Spark-Instanz bereitgestellt werden. Diese Klasse muss die KmsClient-Schnittstelle (Teil der API für modulare Parquet-Verschlüsselung) implementieren. Analytics Engine powered by Apache Spark enthält VaultClient KmsClient, was ohne Vorbereitungs- oder Anpassungsaufwand verwendet werden kann, wenn Sie Hashicorp Vault als KMS-Server für die Masterschlüssel verwenden. Wenn Sie ein anderes KMS-System verwenden (wollen), können Sie eine angepasste KmsClient-Klasse (auf der Basis des VaultClient-Codes) entwickeln.
Angepasste KmsClient-Klasse
Die modulare Parquet-Verschlüsselung stellt eine einfache Schnittstelle namens org.apache.parquet.crypto.keytools.KmsClient
mit den folgenden zwei Hauptfunktionen bereit, die Sie implementieren müssen:
// 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)
Außerdem stellt die Schnittstelle die folgende Initialisierungsfunktion bereit, die KMS-Parameter und andere Konfigurationselemente übergibt:
public void initialize(Configuration configuration, String kmsInstanceID, String kmsInstanceURL, String accessToken)
Informationen zum Implementieren eines KmsClient finden Sie unter Beispiel für KmsClient-Implementierung.
Nachdem Sie die angepasste KmsClient-Klasse entwickelt haben, fügen Sie diese einer von Analytics Engine powered by Apache Spark bereitgestellten JAR-Datei hinzu und übergeben Sie den vollständigen Namen in der Spark Hadoop-Konfiguration. Beispiel:
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "full.name.of.YourKmsClient"
Schlüsselmanagement über Hashicorp Vault
Wenn Sie Hashicorp Vault als KMS-Server verwenden, können Sie den vordefinierten VaultClient verwenden:
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Masterschlüssel erstellen
Spezifikationen zu Hashicorp Vault-Aktionen finden Sie in der entsprechenden Dokumentation. Siehe:
- Aktivieren Sie Transit Engine als Standardpfad oder geben Sie einen angepassten Pfad an.
- Erstellen Sie benannte Verschlüsselungsschlüssel.
- Konfigurieren Sie Zugriffsrichtlinien, über die ein Benutzer oder eine Maschine auf diese benannten Schlüssel zugreifen darf.
Verschlüsselte Daten schreiben
Übergeben Sie dabei folgende Parameter:
Setzen Sie
"parquet.encryption.kms.client.class"
auf"com.ibm.parquet.key.management.VaultClient"
:sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Optional: Legen Sie den angepassten Pfad
"parquet.encryption.kms.instance.id"
für Ihre Transit-Engine fest:sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id" , "north/transit1")
Setzen Sie
"parquet.encryption.kms.instance.url"
auf die URL Ihrer Vault-Instanz:sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<hostname>:8200")
Legen Sie für
"parquet.encryption.key.access.token"
ein gültiges Zugriffstoken mit der zugeordneten Zugriffsrichtlinie fest, das Zugriffsberechtigungen für die erforderlichen Schlüssel in Ihrer Vault-Instanz bereitstellt:sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
Wenn sich das Token in einer lokalen Datei befindet, laden Sie es:
val token = scala.io.Source.fromFile("<token file>").mkStringsc.hadoopConfiguration.set("parquet.encryption.key.access.token" , token)
Geben Sie an, welche Spalten verschlüsselt werden müssen und welche Masterschlüssel dafür erforderlich sind. Sie müssen auch den Fußzeilenschlüssel angeben. Beispiel:
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>")
Hinweis: Wenn der Parameter
"parquet.encryption.column.keys"
oder der Parameter"parquet.encryption.footer.key"
nicht festgelegt ist, wird eine Ausnahme ausgelöst.
Verschlüsselte Daten lesen
Die erforderlichen Metadaten, einschließlich ID und URL der Hashicorp Vault-Instanz, werden in den verschlüsselten Parquet-Dateien gespeichert.
Gehen Sie wie folgt vor, um verschlüsselte Metadaten zu lesen:
Setzen Sie den KMS-Client auf die Vault-Clientimplementierung:
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Stellen Sie das Zugriffstoken mit der angehängten Richtlinie bereit, die Zugriff auf die relevanten Schlüssel gewährt:
sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
Rufen Sie die regulären Parquet-Lesebefehle auf. Beispiel:
val dataFrame = spark.read.parquet("<path to encrypted files>")
Schlüsselrotation
Wenn Schlüsselrotation erforderlich ist, muss ein Administrator mit Zugriffsberechtigungen für die KMS-Schlüsselrotationsaktionen Masterschlüssel in Hashicorp Vault mithilfe der in der Hashicorp Vault-Dokumentation beschriebenen Prozedur rotieren. Danach kann der Administrator Parquet-Schlüsselrotation durch folgenden Aufruf auslösen:
public static void KeyToolkit.rotateMasterKeys(String folderPath, Configuration hadoopConfig)
Die folgenden Hadoop-Konfigurationseigenschaften müssen festgelegt werden, um Parquet-Schlüsselrotation zu aktivieren:
- Die Parameter
"parquet.encryption.key.access.token"
und"parquet.encryption.kms.instance.url"
und optional"parquet.encryption.kms.instance.id"
müssen festgelegt werden. - Der Parameter
"parquet.encryption.key.material.store.internally"
muss auf"false"
gesetzt werden. - Der Parameter
"parquet.encryption.kms.client.class"
muss auf"com.ibm.parquet.key.management.VaultClient"
gesetzt werden.
Beispiel:
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)
Übergeordnetes Thema: Parquet-Verschlüsselung