Translation not up to date
Pokud jsou vaše data uložena ve sloupcovém formátu, můžete použít modulární šifrování Parquet k zašifrování citlivých sloupců při psaní souborů Parquet a dešifrovat tyto sloupce při čtení šifrovaných souborů. Šifrování dat na úrovni sloupců vám umožňuje rozhodnout se, které sloupce se mají šifrovat a jak řídit přístup ke sloupcům.
Kromě zajištění soukromí, Parquet modulární šifrování také chrání integritu uložených dat. Jakákoli manipulace s obsahem souboru je zjištěna a spouští výjimku na straně čtenáře.
Mezi klíčové funkce patří:
Na klastru Spark se provádí modulární šifrování a dešifrování parket. Proto nejsou citlivá data a šifrovací klíče viditelné pro úložiště.
Standardní parketové funkce, jako je kódování, komprese, sloupcová projekce a predikátový push-down, nadále fungují jako obvykle na souborech s modulárním formátem šifrování Parquet.
Můžete zvolit jeden ze dvou šifrovacích algoritmů, které jsou definovány ve specifikaci Parquet. Oba algoritmy podporují šifrování sloupců, avšak:
- Výchozí algoritmus
AES-GCM
poskytuje úplnou ochranu proti manipulaci s částmi dat a metadat v souborech Parquet. - Alternativní algoritmus
AES-GCM-CTR
podporuje částečnou ochranu integrity souborů Parquet. Pouze části metadat jsou chráněny proti neoprávněným úpravám, nikoli proti datovým částem. Výhodou tohoto algoritmu je, že má nižší režii propustnosti ve srovnání s algoritmemAES-GCM
.
- Výchozí algoritmus
Můžete zvolit, které sloupce se mají šifrovat. Ostatní sloupce nebudou šifrovány, což sníží režii propustnosti.
Různé sloupce lze šifrovat pomocí různých klíčů.
Ve výchozím nastavení je hlavní modul metadat Parquet (zápatí souboru) šifrován, aby skryl schéma souboru a seznam citlivých sloupců. Můžete se však rozhodnout, že nebudete šifrovat zápatí souborů, aby starší čtenáři (například jiné distribuce Spark, které dosud nepodporují modulární šifrování Parquet) mohli číst nešifrované sloupce v šifrovaných souborech.
Šifrovací klíče lze spravovat jedním ze dvou způsobů:
- Přímo podle vaší žádosti. Viz Správa klíčů podle aplikace.
- Pomocí systému správy klíčů (KMS), který generuje, ukládá a ničí šifrovací klíče používané službou Spark. Tyto klíče nikdy neopouštějí server KMS, a proto jsou neviditelné pro ostatní komponenty, včetně služby Spark. Viz Správa klíčů podle KMS.
Poznámka: Pouze hlavní šifrovací klíče (MEKs) musí být spravovány vaší aplikací nebo KMS.
Pro každý citlivý sloupec musíte uvést, který hlavní klíč se má použít pro šifrování. Také musí být uveden hlavní klíč pro zápatí každého šifrovaného souboru (datového rámce). Standardně se pro šifrování zápatí použije klíč zápatí. Pokud však zvolíte režim zápatí prostého textu, zápatí nebude šifrováno a klíč bude použit pouze pro ověření integrity zápatí.
Parametry šifrování lze předat prostřednictvím standardní konfigurace Spark Hadoop , například nastavením konfiguračních hodnot v konfiguraci Hadoop SparkContextaplikace:
sc.hadoopConfiguration.set("<parameter name>" , "<parameter value>")
Případně můžete předat hodnoty parametrů prostřednictvím voleb zápisu:
<data frame name>.write .option("<parameter name>" , "<parameter value>") .parquet("<write path>")
Běh s modulárním šifrováním Parquet
Modulární šifrování parketu je k dispozici pouze v zápisnících Spark, které jsou spuštěny v instanci služby IBM Analytics Engine . Modulární šifrování parket není podporováno v noteboocích, které běží v prostředí Spark.
Chcete-li povolit modulární šifrování Parquet, nastavte následující vlastnosti cesty ke třídě Spark tak, aby ukazovaly na soubory JAR Parquet, které implementují modulární šifrování Parquet, a na soubor JAR správy klíčů:
Přejděte na volbu Ambari > Spark > Konfigurace-> Vlastní spark2-default.
Přidejte následující dva parametry, aby explicitně ukazovaly na umístění souborů JAR. Ujistěte se, že jste upravili cesty tak, aby používaly skutečnou verzi souborů JAR v klastru.
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
Povinné parametry
Pro zápis šifrovaných dat jsou vyžadovány následující parametry:
Seznam sloupců, které se mají šifrovat, s hlavními šifrovacími klíči:
parameter name: "encryption.column.keys" parameter value: "<master key ID>:<column>,<column>;<master key ID>:<column>,.."
Klíč zápatí:
parameter name: "encryption.footer.key" parameter value: "<master key ID>"
Například:
dataFrame.write .option("encryption.footer.key" , "k1") .option("encryption.column.keys" , "k2:SSN,Address;k3:CreditCard") .parquet("<path to encrypted files>")
Důležité:Pokud není nastaven ani parametr
encryption.column.keys
, ani parametrencryption.footer.key
, soubor nebude šifrován. Pokud je nastaven pouze jeden z těchto parametrů, dojde k výjimce, protože tyto parametry jsou povinné pro šifrované soubory.
Nepovinné parametry
Při zápisu šifrovaných dat lze použít následující volitelné parametry:
Šifrovací algoritmus
AES-GCM-CTR
Modulární šifrování Parquet standardně používá algoritmus
AES-GCM
, který poskytuje úplnou ochranu proti manipulaci s daty a metadaty v souborech Parquet. Avšak vzhledem k tomu, že produkt Spark 2.3.0 je spuštěn v prostředí Java 8, které nepodporuje akceleraci AES v hardwaru CPU (toto bylo přidáno pouze v prostředí Java 9), může režie ověření integrity dat v určitých situacích ovlivnit propustnost pracovní zátěže.Chcete-li to kompenzovat, můžete vypnout podporu ověření integrity dat a zapsat šifrované soubory s alternativním algoritmem
AES-GCM-CTR
, který ověřuje integritu pouze částí metadat, a ne částí dat, a má nižší režii propustnosti ve srovnání s algoritmemAES-GCM
.parameter name: "encryption.algorithm" parameter value: "AES_GCM_CTR_V1"
Režim zápatí prostého textu pro starší čtečky
Ve výchozím nastavení je hlavní modul metadat Parquet (zápatí souboru) šifrován, aby skryl schéma souboru a seznam citlivých sloupců. Můžete se však rozhodnout, že nebudete šifrovat zápatí souborů, abyste umožnili ostatním čtečkám Spark a Parquet (které dosud nepodporují modulární šifrování Parquet) číst nešifrované sloupce v šifrovaných souborech. Chcete-li vypnout šifrování zápatí, nastavte následující parametr:
parameter name: "encryption.plaintext.footer" parameter value: "true"
Důležité:Parametr
encryption.footer.key
musí být uveden také v režimu zápatí prostého textu. Přestože zápatí není šifrováno, klíč se používá k podepsání obsahu zápatí, což znamená, že noví čtenáři mohou ověřit jeho integritu. Starší čtenáři nejsou přidáním podpisu zápatí ovlivněni.
Příklady použití
Následující ukázkové úseky kódu pro Python ukazují, jak vytvářet datové rámce, zapisovat do šifrovaných souborů parket a číst ze šifrovaných souborů parket.
Python: Zápis šifrovaných dat:
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: Čtení šifrovaných dat:
sc._jsc.hadoopConfiguration().set("encryption.key.list", "key1: AAECAwQFBgcICQoLDA0ODw==, key2: AAECAAECAAECAAECAAECAA==") encryptedParquetPath = "squares.parquet.encrypted" parquetFile = spark.read.parquet(encryptedParquetPath) parquetFile.show()
Obsah Python souboru úlohy InMemoryKMS.py
je následující:
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()
Zpracování vnitřních částí šifrovacího klíče
Při zápisu souboru Parquet se pro každý zašifrovaný sloupec a zápatí vygeneruje náhodný klíč šifrování dat (DEK). Tyto klíče se používají k šifrování dat a modulů metadat v souboru Parquet.
Klíč šifrování dat je pak zašifrován pomocí klíče šifrování klíče (KEK), který je také generován uvnitř Spark/Parquet pro každý hlavní klíč. Šifrovací klíč klíče je šifrován pomocí hlavního šifrovacího klíče (MEK) lokálně.
Šifrované klíče pro šifrování dat a klíče pro šifrování klíčů jsou uloženy v metadatech souboru Parquet spolu s identitou hlavního klíče. Každý šifrovací klíč klíče má jedinečnou identitu (generovanou lokálně jako zabezpečená náhodná 16bajtová hodnota), která je také uložena v metadatech souboru.
Při čtení souboru Parquet se z metadat souboru extrahuje identifikátor hlavního šifrovacího klíče (MEK) a šifrovacího klíče šifrovaného klíče (KEK) s jeho identifikátorem a zašifrovaný klíč šifrování dat (DEK).
Šifrovací klíč klíče je dešifrován pomocí hlavního šifrovacího klíče lokálně. Pak je klíč šifrování dat (DEK) dešifrován lokálně pomocí klíče šifrování klíčů (KEK).