Translation not up to date
Modułowe szyfrowanie Parkiet może pracować z dowolnymi serwerami Key Management Service (KMS). Niestandardowa klasa klienta KMS, zdolna do komunikowania się z wybranym serwerem KMS, musi być dostarczona do Analytics Engine opartego na instancji Apache Spark . Ta klasa musi implementować interfejs KmsClient (część modularnego interfejsu API szyfrowania Parkiet). Analytics Engine oparty na technologii Apache Spark zawiera klienta VaultClient KmsClient, który może być używany poza polem, jeśli używany jest Hashicorp Vault jako serwer KMS dla kluczy głównych. Jeśli używany jest inny system KMS lub planowane jest użycie innego systemu KMS, można utworzyć niestandardową klasę KmsClient (jako przykład biorąc kod VaultClient ).
Niestandardowa klasa KmsClient
Modułowe szyfrowanie Parkiet udostępnia prosty interfejs o nazwie org.apache.parquet.crypto.keytools.KmsClient
z następującymi dwiema głównymi funkcjami, które należy zaimplementować:
// 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)
Dodatkowo interfejs udostępnia następującą funkcję inicjowania, która przekazuje parametry KMS i inną konfigurację:
public void initialize(Configuration configuration, String kmsInstanceID, String kmsInstanceURL, String accessToken)
Informacje na temat implementowania klienta KmsClientzawiera sekcja Przykład implementacji KmsClient .
Po opracowaniu niestandardowej klasy KmsClient należy dodać ją do pliku JAR dostarczanego do produktu Analytics Engine opartego na technologii Apache Sparki przekazać jego pełną nazwę w konfiguracji Spark Hadoop , na przykład:
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "full.name.of.YourKmsClient"
Zarządzanie kluczami za pomocą funkcji Hashicorp Vault
Jeśli jako serwer KMS zostanie użyta opcja Hashicorp Vault , można użyć wstępnie spakowanego klienta VaultClient:
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Tworzenie kluczy głównych
Zapoznaj się z dokumentacją Hashicorp Vault , aby uzyskać informacje o konkretnych działaniach w skarbcu. Patrz:
- Włącz mechanizm Transit Engine albo w ścieżce domyślnej, albo podaj ścieżkę niestandardową.
- Utwórz nazwane klucze szyfrowania.
- Skonfiguruj strategie dostępu, z którymi użytkownik lub komputer może uzyskać dostęp do tych nazwanych kluczy.
Zapisywanie zaszyfrowanych danych
Przekaz następujące parametry:
Ustaw
"parquet.encryption.kms.client.class"
na"com.ibm.parquet.key.management.VaultClient"
:sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Opcjonalnie: Ustaw ścieżkę niestandardową
"parquet.encryption.kms.instance.id"
do mechanizmu tranzytu:sc.hadoopConfiguration.set("parquet.encryption.kms.instance.id" , "north/transit1")
Ustaw wartość
"parquet.encryption.kms.instance.url"
na adres URL instancji skarbca:sc.hadoopConfiguration.set("parquet.encryption.kms.instance.url" , "https://<hostname>:8200")
Ustaw wartość
"parquet.encryption.key.access.token"
na poprawny znacznik dostępu z przyłączoną strategią dostępu, która zapewnia prawa dostępu do wymaganych kluczy w instancji skarbca:sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
Jeśli token znajduje się w pliku lokalnym, załaduj go:
val token = scala.io.Source.fromFile("<token file>").mkStringsc.hadoopConfiguration.set("parquet.encryption.key.access.token" , token)
Określ, które kolumny mają być szyfrowane, oraz z którymi kluczami głównymi. Należy również określić klucz stopki. Na przykład:
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>")
Uwaga: Jeśli parametr
"parquet.encryption.column.keys"
lub"parquet.encryption.footer.key"
nie jest ustawiony, zgłaszany jest wyjątek.
Odczytywanie zaszyfrowanych danych
Wymagane metadane, w tym identyfikator i adres URL instancji Hashicorp Vault , są przechowywane w zaszyfrowanych plikach Parkiet.
Aby odczytać zaszyfrowane metadane:
Ustaw klienta KMS na implementację klienta skarbca:
sc.hadoopConfiguration.set("parquet.ecnryption.kms.client.class", "com.ibm.parquet.key.management.VaultClient")
Podaj znacznik dostępu z przyłączoną strategią, która nadaje dostęp do odpowiednich kluczy:
sc.hadoopConfiguration.set("parquet.encryption.key.access.token" , "<token string>")
Wywołaj regularne komendy odczytu Parkietu, takie jak:
val dataFrame = spark.read.parquet("<path to encrypted files>")
Rotacja klucza
Jeśli wymagana jest rotacja klucza, administrator z prawami dostępu do działań rotacyjnego klucza KMS musi obracać klucze główne w Hashicorp Vault , korzystając z procedury opisanej w dokumentacji Hashicorp Vault . Następnie administrator może wyzwoliwać rotację klucza Parkiet, wywołując:
public static void KeyToolkit.rotateMasterKeys(String folderPath, Configuration hadoopConfig)
Aby włączyć rotację klucza Parkiet, należy ustawić następujące właściwości konfiguracyjne Hadoop :
- Parametry
"parquet.encryption.key.access.token"
i"parquet.encryption.kms.instance.url"
muszą być ustawione, a opcjonalnie"parquet.encryption.kms.instance.id"
- Parametr
"parquet.encryption.key.material.store.internally"
musi być ustawiony na wartość"false"
. - Parametr
"parquet.encryption.kms.client.class"
musi być ustawiony na wartość"com.ibm.parquet.key.management.VaultClient"
.
Na przykład:
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)
Temat nadrzędny: szyfrowanie parkietu