Wenn Ihre Daten im Spaltenformat gespeichert sind, können Sie die modulare Parquet-Verschlüsselung verwenden, um beim Schreiben von Parquet-Dateien sensible Daten zu verschlüsseln und diese Spalten beim Lesen der verschlüsselten Dateien zu entschlüsseln. Durch die Verschlüsselung von Daten auf Spaltenebene können Sie entscheiden, welche Spalten verschlüsselt werden sollen und wie der Spaltenzugriff gesteuert werden soll.
Neben der Privatsphäre schützt die modulare Parquet-Verschlüsselung auch die Integrität gespeicherter Daten. Die Manipulation von Dateiinhalten wird erkannt und löst eine Reader-Ausnahme aus.
Einige der Schlüsselfunktionen sind:
Die modulare Parquet-Verschlüsselung und -Entschlüsselung wird im Spark-Cluster durchgeführt. Daher sind sensible Daten und die Chiffrierschlüssel für den Speicher nicht sichtbar.
Parquet-Standardfeatures wie Codierung, Komprimierung, Spaltenprojektion und Pushdown von Vergleichselementen funktionieren weiter wie üblich für Dateien mit modularem Parquet-Verschlüsselungsformat.
Sie können einen von zwei Verschlüsselungsalgorithmen auswählen, die in der Parquet-Spezifikation definiert sind. Beide Algorithmen unterstützen die Spaltenverschlüsselung. Es gilt jedoch, Folgendes zu beachten:
- Der Standardalgorithmus
AES-GCM
bietet vollen Schutz vor einer Manipulation von Daten- und Metadatenabschnitten in Parquet-Dateien. - Der alternative Algorithmus
AES-GCM-CTR
bietet einen partiellen Integritätsschutz für Parquet-Dateien. Nur Metadatenabschnitte sind vor einer Manipulation geschützt, nicht jedoch die Datenabschnitte. Ein Vorteil dieses Algorithmus ist, dass er im Vergleich zum AlgorithmusAES-GCM
einen geringeren Systemaufwand erfordert.
- Der Standardalgorithmus
Sie können auswählen, welche Spalten verschlüsselt werden sollen. Andere Spalten werden nicht verschlüsselt, was den Durchsatzaufwand reduziert.
Verschiedene Spalten können mit unterschiedlichen Schlüsseln verschlüsselt werden.
Standardmäßig wird das Parquet-Hauptmetadatenmodul (die Dateifußzeile) verschlüsselt, um das Dateischema und die Liste der sensiblen Spalten zu verbergen. Sie können jedoch auswählen, dass die Dateifußzeilen nicht verschlüsselt werden sollen, um traditionellen Lesern (z. B. anderen Spark-Distributionen, die noch keine modulare Parquet-Verschlüsselung unterstützen) das Lesen der unverschlüsselten Spalten in den verschlüsselten Dateien zu ermöglichen.
Verschlüsselungsschlüssel können mit einer der folgenden Methoden verwaltet werden:
- Direkt über Ihre Anwendung. Siehe Schlüsselmanagement über die Anwendung.
- Über ein Schlüsselmanagementsystem (KMS - Key Management System), das Verschlüsselungsschlüssel, die vom Spark-Service verwendet werden, generiert, speichert und zerstört. Diese Schlüssel verlassen den KMS-Server niemals und sind daher für andere Komponenten, einschließlich des Spark-Service, nicht sichtbar. Siehe Schlüsselmanagement durch KMSComment.
Hinweis: Nur Masterchiffrierschlüssel (MEK - Master Ecryption Key) müssen über Ihre Anwendung oder ein KMS verwaltet werden.
Für jede sensible Spalte müssen Sie angeben, welcher Masterschlüssel für die Verschlüsselung verwendet werden soll. Darüber hinaus muss ein Masterschlüssel für die Fußzeile jeder verschlüsselten Datei (Datenrahmen) angegeben werden. Standardmäßig wird der Fußzeilenschlüssel für die Fußzeilenverschlüsselung verwendet. Wenn Sie jedoch eine Fußzeile im einfachen Textmodus wählen, wird die Fußzeile nicht verschlüsselt und der Schlüssel nur für die Integritätsprüfung der Fußzeile verwendet.
Die Verschlüsselungsparameter können über die Spark Hadoop-Standardkonfiguration übergeben werden, beispielsweise durch Festlegen der Konfigurationswerte für den Spark-Kontext (SparkContext) in der Hadoop-Konfiguration:
sc.hadoopConfiguration.set("<parameter name>" , "<parameter value>")
Alternativ können Sie Parameterwerte mithilfe von write-Optionen übergeben:
<data frame name>.write .option("<parameter name>" , "<parameter value>") .parquet("<write path>")
Ausführung mit modularer Parquet-Verschlüsselung
Modulare Parquet-Verschlüsselung ist nur in Spark-Notebooks verfügbar, die in einer IBM Analytics Engine-Serviceinstanz ausgeführt werden. Modulare Parquet-Verschlüsselung wird in Notebooks, die in einer Spark-Umgebung ausgeführt werden, nicht unterstützt.
Wenn Sie die modulare Parquet-Verschlüsselung aktivieren möchten, legen Sie die folgenden Spark-Klassenpfadeigenschaften fest, um auf die Parquet-JAR-Dateien, die die modulare Parquet-Verschlüsselung implementieren, und auf die JAR-Datei für Schlüsselmanagement zu verweisen:
Navigieren Sie zu Ambari > Spark > Config -> Custom spark2-default.
Fügen Sie die beiden folgenden Parameter hinzu, um explizit auf die Position der JAR-Dateien zu verweisen. Sie müssen die Pfade so anpassen, dass die tatsächliche Version der JAR-Dateien im Cluster verwendet wird.
spark.driver.extraClassPath=/home/common/lib/parquetEncryption/ibm-parquet-kms-<latestversion>-jar-with-dependencies.jar:/home/common/lib/parquetEncryption/parquet-format-<latestversion>.jar:/home/common/lib/parquetEncryption/parquet-hadoop-<latestversion>.jar spark.executor.extraClassPath=/home/common/lib/parquetEncryption/ibm-parquet-<latestversion>-jar-with-dependencies.jar:/home/common/lib/parquetEncryption/parquet-format-<latestversion>.jar:/home/common/lib/parquetEncryption/parquet-hadoop-<latestversion>.jar
Obligatorische Parameter
Die folgenden Parameter sind zum Schreiben verschlüsselter Daten erforderlich:
Liste zu verschlüsselnder Spalten einschließlich Masterverschlüsselungsschlüsseln:
parameter name: "encryption.column.keys" parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,.."
Fußzeilenschlüssel:
parameter name: "encryption.footer.key" parameter value: "<master key ID>"
Beispiel:
dataFrame.write .option("encryption.footer.key" , "k1") .option("encryption.column.keys" , "k2:SSN,Address;k3:CreditCard") .parquet("<path to encrypted files>")
Wichtig:Wenn weder der Parameter
encryption.column.keys
noch der Parameterencryption.footer.key
gesetzt ist, wird die Datei nicht verschlüsselt. Wenn nur einer dieser Parameter gesetzt ist, wird eine Ausnahmebedingung ausgelöst, da diese Parameter für verschlüsselte Dateien obligatorisch sind.
Optionale Parameter
Die folgenden optionalen Parameter können beim Schreiben verschlüsselter Daten verwendet werden:
Verschlüsselungsalgorithmus
AES-GCM-CTR
Die modulare Parquet-Verschlüsselung verwendet standardmäßig den Algorithmus
AES-GCM
, der vollständigen Schutz vor Manipulation von Daten und Metadaten in Parquet-Dateien bietet. Da Spark 2.3.0 jedoch in Java 8 ausgeführt wird, das die AES-Beschleunigung der CPU-Hardware nicht unterstützt (diese Unterstützung wurde erst in Java 9 hinzugefügt), kann der Aufwand für die Überprüfung der Datenintegrität in bestimmten Situationen den Verarbeitungsdurchsatz beeinflussen.Um dies zu kompensieren, können Sie die Unterstützung für die Datenintegritätsprüfung ausschalten und die verschlüsselten Dateien mit dem alternativen Algorithmus
AES-GCM-CTR
schreiben, der nur die Integrität der Metadatenabschnitte und nicht die der Datenabschnitte verifiziert und dadurch im Vergleich zum AlgorithmusAES-GCM
einen geringeren Systemaufwand erfordert.parameter name: "encryption.algorithm" parameter value: "AES_GCM_CTR_V1"
Fußzeile im einfachen Textmodus für traditionelle Reader
Standardmäßig wird das Parquet-Hauptmetadatenmodul (die Dateifußzeile) verschlüsselt, um das Dateischema und die Liste der sensiblen Spalten zu verbergen. Sie können jedoch entscheiden, die Dateifußzeilen nicht zu verschlüsseln, um anderen Spark- und Parquet-Readern (die die modulare Parquet-Verschlüsselung noch nicht unterstützen) das Lesen der unverschlüsselten Spalten in den verschlüsselten Dateien zu ermöglichen. Setzen Sie den folgenden Parameter, um die Fußzeilenverschlüsselung zu inaktivieren:
parameter name: "encryption.plaintext.footer" parameter value: "true"
Wichtig:Der Parameter
encryption.footer.key
muss auch im Fußzeilenmodus für einfachen Text angegeben werden. Die Fußzeile ist zwar nicht verschlüsselt, aber der Schlüssel wird zum Signieren des Fußzeileninhalts verwendet. Neue Reader könnten also seine Integrität prüfen. Das Hinzufügen der Fußzeilensignatur hat keine Auswirkungen auf traditionelle Reader.
Verwendungsbeispiele
Die folgenden Beispielcode-Snippets für Python zeigen, wie Datenrahmen erstellt, in verschlüsselte Parquet-Dateien geschrieben und aus verschlüsselten Parquet-Dateien gelesen werden.
Python: Schreiben verschlüsselter Daten
from pyspark.sql import Row squaresDF = spark.createDataFrame( sc.parallelize(range(1, 6)) .map(lambda i: Row(int_column=i, square_int_column=i ** 2))) sc._jsc.hadoopConfiguration().set("encryption.key.list", "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==") sc._jsc.hadoopConfiguration().set("encryption.column.keys", "key1:square_int_column") sc._jsc.hadoopConfiguration().set("encryption.footer.key", "key2") encryptedParquetPath = "squares.parquet.encrypted" squaresDF.write.parquet(encryptedParquetPath)
Python: Lesen verschlüsselter Daten
sc._jsc.hadoopConfiguration().set("encryption.key.list", "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==") encryptedParquetPath = "squares.parquet.encrypted" parquetFile = spark.read.parquet(encryptedParquetPath) parquetFile.show()
Der Inhalt der Python Jobdatei InMemoryKMS.py
lautet wie folgt:
from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark.sql import Row
if __name__ == "__main__":
spark = SparkSession \
.builder \
.appName("InMemoryKMS") \
.getOrCreate()
sc = spark.sparkContext
##KMS operation
print("Setup InMemoryKMS")
hconf = sc._jsc.hadoopConfiguration()
encryptedParquetFullName = "testparquet.encrypted"
print("Write Encrypted Parquet file")
hconf.set("encryption.key.list", "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==")
btDF = spark.createDataFrame(sc.parallelize(range(1, 6)).map(lambda i: Row(ssn=i, value=i ** 2)))
btDF.write.mode("overwrite").option("encryption.column.keys", "key1:ssn").option("encryption.footer.key", "key2").parquet(encryptedParquetFullName)
print("Read Encrypted Parquet file")
encrDataDF = spark.read.parquet(encryptedParquetFullName)
encrDataDF.createOrReplaceTempView("bloodtests")
queryResult = spark.sql("SELECT ssn, value FROM bloodtests")
queryResult.show(10)
sc.stop()
spark.stop()
Interna der Handhabung von Chiffrierschlüsseln
Beim Schreiben einer Parquet-Datei wird für jede verschlüsselte Spalte und für die Fußzeile ein zufälliger Datenchiffrierschlüssel (DEK, Data Encryption Key) generiert. Diese Schlüssel werden verwendet, um die Daten- und Metadatenmodule in der Parquet-Datei zu verschlüsseln.
Der Datenchiffrierschlüssel wird dann mit einem Schlüsselchiffrierschlüssel (KEK, Key Encrytion Key) verschlüsselt, der auch innerhalb von Spark/Parquet für jeden Masterschlüssel generiert wird. Der Schlüsselchiffrierschlüssel wird lokal mit dem Masterchiffrierschlüssel verschlüsselt.
Verschlüsselte Chiffrierschlüssel für Daten und Schlüssel werden zusammen mit der Masterschlüssel-ID in den Metadaten der Parquet-Datei gespeichert. Jeder Schlüsselchiffrierschlüssel hat eine eindeutige (lokal als sicherer zufälliger 16-Byte-Wert generierte) ID, die auch in den Metadaten der Datei gespeichert wird.
Beim Lesen einer Parquet-Datei werden die ID des Masterchiffrierschlüssels und des verschlüsselten Schlüsselchiffrierschlüssels sowie der verschlüsselte Datenchiffrierschlüssel aus den Dateimetadaten extrahiert.
Der Schlüsselchiffrierschlüssel wird lokal mit dem Masterchiffrierschlüssel entschlüsselt. Anschließend wird der Datenchiffrierschlüssel lokal mit dem Schlüsselchiffrierschlüssel entschlüsselt.