Szyfrowanie danych globalnych po stronie klienta za pomocą kluczy AWS KMS multi-region

22 lipca 2021

16-go czerwca, usługa AWS Key Management Service (AWS KMS) wprowadza klucze typu multi-Region, nową funkcję, która umożliwia replikowanie kluczy z jednego regionu Amazon Web Services (AWS) do innego. Klucze multi-Region zostały zaprojektowane w celu uproszczenia zarządzania szyfrowaniem po stronie klienta, gdy zaszyfrowane dane muszą zostać skopiowane do innych regionów w razie disaster recovery lub są replikowane w globalnych tabelach Amazon DynamoDB.

W tym poście przedstawiamy przegląd podstaw oraz jak zacząć korzystać z kluczy multi-Region. Zamieszczamy przykład kodu dla szyfrowania danych multi-Region w globalnych tabelach DynamoDB.

Początek

Od samego początku AWS KMS jest ściśle wyodrębniony do jednego regionu AWS dla każdej implementacji, bez udostępniania kluczy, polityk ani informacji audytowych między regionami. Izolacja regionu może pomóc w spełnieniu standardów bezpieczeństwa i wymagań dotyczących miejsca przechowywania danych. Jednak nieudostępnianie kluczy między regionami stwarza wyzwania, gdy trzeba przenieść dane zależne od tych kluczy między regionami. Usługi AWS, które używają kluczy KMS do szyfrowania typu server-side, rozwiązują ten problem, w sposób transparentny ponownie szyfrując dane w Twoim imieniu przy użyciu kluczy KMS w regionie docelowym. Jeśli używasz szyfrowania client-side, czynność ta zwiększa złożoność i opóźnienia ponownego szyfrowania między regionami izolowanymi kluczami KMS.

Klucze multi-region to nowa funkcja AWS KMS dla aplikacji client-side, która umożliwia przenoszenie zaszyfrowanych danych KMS w różnych regionach. Klucze multi-region to zestaw interoperacyjnych kluczy KMS, które mają ten sam identyfikator klucza i materiał klucza, i które można replikować do różnych regionów w ramach tej samej partycji. Dzięki symetrycznym kluczom multi-region można szyfrować dane w jednym regionie i odszyfrowywać je w innym. Dzięki asymetrycznym kluczom multi-region szyfrujesz, odszyfrowujesz, podpisujesz i weryfikujesz wiadomości w wielu regionach.

Klucze multi-region są obsługiwane w konsoli AWS KMS, AWS KMS API, AWS Encryption SDKAmazon DynamoDB Encryption Client oraz Amazon S3 Encryption Client. Usługi AWS pozwalają również skonfigurować klucze dla wielu regionów do szyfrowania server-side, jeśli chcesz, aby ten sam klucz chronił dane, które wymagają szyfrowania zarówno po stronie serwera, jak i po stronie klienta.

Pierwsze kroki z kluczami multi-Region

Aby używać kluczy multi-Region, należy utworzyć klucz multi-Region primary z nowym identyfikatorem klucza i materiałem klucza. Następnie należy użyć klucza podstawowego, aby utworzyć powiązany klucz multi-Region replica w innym regionie tej samej partycji AWS. Klucze replik to klucze KMS, których można używać niezależnie; nie są wskaźnikiem do klucza podstawowego. Klucze podstawowe i repliki współdzielą tylko niektóre właściwości, w tym ich identyfikator klucza, rotację klucza i pochodzenie klucza.

We wszystkich innych aspektach każdy klucz multi-Region, zarówno primary, jak i replica, jest w pełni funkcjonalnym, niezależnym zasobem klucza KMS z własną polityką kluczy, aliasami, przydziałami, opisem klucza, cyklem życia i innymi atrybutami. Amazon Resource Names (ARN) powiązanych kluczy multi-Region różnią się tylko w części dotyczącej regionu, jak pokazano na poniższym rysunku (Rysunek 1).

AWS KMS multi-region

Rysunek 1: Klucze multi-Region mają unikalne numery ARN, ale identyczne ID klucza

Nie można przekonwertować istniejącego klucza z jednym regionem (single-Region) na klucz z wieloma regionami (multi-Region). Taka konstrukcja zapewnia, że wszystkie dane chronione przy użyciu istniejących kluczy jednego regionu zachowują te same właściwości w zakresie miejsca przechowywania danych i suwerenności danych.

Kiedy używać klucza multi-Region

Możesz używać kluczy multi-region w dowolnej aplikacji po stronie klienta. Ponieważ klucze te pozwalają uniknąć połączeń między regionami, są szczególnie przydatne w scenariuszach, w których nie chcesz polegać na innym regionie lub narażać się na opóźnienie wywołania między regionami. Na przykład w przypadku disaster recovery, globalnego zarządzania danymi, rozproszonych aplikacji do podpisywania i aplikacji active-active, które obejmują wiele regionów, mogą korzystać z kluczy multi-region. Możesz także tworzyć i używać kluczy multi-region w jednym regionie i wybrać replikację tych kluczy w późniejszym terminie, gdy trzeba przenieść chronione dane do dodatkowych regionów.

Uwaga: Jeśli aplikacja będzie działać tylko w jednym regionie, należy kontynuować korzystanie z klucz typu single-Region, aby korzystać z ich właściwości izolacji danych.

Jedną z istotnych zalet kluczy multi-Region jest używanie ich z DynamoDB global tables. Przyjrzyjmy się szczegółowo tej interakcji.

Korzystanie z kluczy multi-Region z globalnymi tabelami DynamoDB

Klucze multi-Region AWS KMS (MRK) mogą być używane z DynamoDB Encryption Client do ochrony danych w globalnych tabelach DynamoDB. DynamoDB Encryption Client można skonfigurować tak, aby wywoływał usługę AWS KMS w celu odszyfrowania w innym regionie niż ten, w którym dane zostały zaszyfrowane, jak pokazano na poniższym rysunku (Rysunek 2). Jest to przydatne w przypadku disaster recovery lub do poprawy wydajności podczas korzystania z DynamoDB w aplikacji rozproszonej globalnie.

AWS_KMS_multi-region

Rysunek 2: Wykorzystanie kluczy multi-Region z globalnymi tabelami DynamoDB

Oto kroki opisane w Rysunku 2:

  1. Zaszyfrowanie rekordu za pomocą podstawowego MRK
  2. Umieszczenie zaszyfrowanego rekordu
  3. Replikacja globalnej tabeli
  4. Uzyskanie zaszyfrowanego rekordu
  5. Odszyfrowanie rekordu za pomocą repliki MRK

Tworzenie klucza multi-Region typu primary

Rozpocznij od utworzenia klucza multi-Region typu primary oraz zreplikuj go do regionów kopii zapasowych. Zakładamy, że utworzyłeś globalną tablę DynamoDB, która jest replikowana do tych samych regionów.

Konfigurowanie DynamoDB Encryption Client do szyfrowania rekordów

Aby używać kluczy multi-Region AWS KMS, musisz skonfigurować DynamoDB Encryption Client z regionem, który chcesz wywołać, czyli zazwyczaj regionem, w którym działa aplikacja. Następnie musisz skonfigurować ARN klucza KMS, którego chcesz używać w tym regionie.

Ten przykład szyfruje rekordy w us-east-1 (US East (N. Virginia)) i odszyfrowuje rekordy w us-west-2 (US West (Oregon)). Jeśli używasz następującego przykładowego kodu konfiguracji, pamiętaj, aby zastąpić przykładowe numery ARN kluczy poprawnymi numerami ARN kluczy dla kluczy multi-Region.

// Określ klucz multi-Region w regionie us-east-1

String encryptRegion = "us-east-1";

String cmkArnEncrypt = "arn:aws:kms:us-east-1:<111122223333>:key/<mrk-1234abcd12ab34cd56ef12345678990ab>";

 

// Skonfiguruj klientów SDK dla KMS i DDB w us-east-1

AWSKMS kmsEncrypt = AWSKMSClientBuilder.standard().withRegion(encryptRegion).build();

AmazonDynamoDB ddbEncrypt = AmazonDynamoDBClientBuilder.standard().withRegion(encryptRegion).build();

 

// Skonfiguruj przykładową tabelę globalną

String tableName = "global-table-example";

String employeeIdAttribute = "employeeId";

String nameAttribute = "name";

 

// Skonfiguruj akcje atrybutów dla Dynamo DB Encryption Client

// Podpisz pole ID pracownika

// Zaszyfruj i podpisz pole nazwy

Map<String, Set<EncryptionFlags>> actions = new HashMap<>();

actions.put(employeeIdAttribute, EnumSet.of(EncryptionFlags.SIGN));

actions.put(nameAttribute, EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN));

 

// Ustaw kontekst szyfrowania. Jest to opcjonalna dobra praktyka.

final EncryptionContext encryptionContext = new EncryptionContext.Builder()

        .withTableName(tableName)

        .withHashKeyName(employeeIdAttribute)

        .build();

 

// Użyj dostawcy materiałów Direct KMS i programu szyfrującego DynamoDB

// Określ klucz ARN klucza multi-Region w us-east-1

DirectKmsMaterialProvider cmpEncrypt = new DirectKmsMaterialProvider(kmsEncrypt, cmkArnEncrypt);

DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmpEncrypt);

 

// Utwórz rekord, zaszyfruj go i umieść w globalnej tabeli DynamoDB

Map<String, AttributeValue> rec = new HashMap<>();

rec.put(nameAttribute, new AttributeValue().withS("Andy"));

rec.put(employeeIdAttribute, new AttributeValue().withS("1234"));

 

final Map<String, AttributeValue> encryptedRecord = encryptor.encryptRecord(rec, actions, encryptionContext);

ddbEncrypt.putItem(tableName, encryptedRecord);

Po zapisaniu nowo zaszyfrowanego rekordu globalne tabele DynamoDB automatycznie replikują ten zaszyfrowany rekord do tabel replik w regionie us-west-2.

Konfigurowanie DynamoDB Encryption Client do odszyfrowywania danych

Teraz jesteś gotowy do skonfigurowania klienta DynamoDB do odszyfrowania rekordu w us-west-2, gdzie istnieje zarówno tabela replik, jak i klucz wielu regionów repliki

// Określ region i klucz ARN do użycia podczas odszyfrowywania   

String decryptRegion = "us-west-2";

String cmkArnDecrypt = "arn:aws:kms:us-west-2:<111122223333>:key/<mrk-1234abcd12ab34cd56ef12345678990ab>";

 

// Skonfiguruj klientów SDK dla KMS i DDB w us-west-2

AWSKMS kmsDecrypt = AWSKMSClientBuilder.standard()

    .withRegion(decryptRegion)

    .build();

 

AmazonDynamoDB ddbDecrypt = AmazonDynamoDBClientBuilder.standard()

    .withRegion(decryptRegion)

    .build();

 

// Skonfiguruj DynamoDB Encryption Client

// Użyj dostawcy materiałów Direct KMS i programu szyfrującego DynamoDB

// Określ klucz ARN klucza multi-Region w us-west-2

final DirectKmsMaterialProvider cmpDecrypt = new DirectKmsMaterialProvider(kmsDecrypt, cmkArnDecrypt);

final DynamoDBEncryptor decryptor = DynamoDBEncryptor.getInstance(cmpDecrypt);

 

// Skonfiguruj swoje zapytanie

Map<String, AttributeValue> query = new HashMap<>();

query.put(employeeIdAttribute, new AttributeValue().withS("1234"));

 

// Uzyskaj rekord z DDB i odszyfruj go

final Map<String, AttributeValue> retrievedRecord = ddbDecrypt.getItem(tableName, query).getItem();

final Map<String, AttributeValue> decryptedRecord = decryptor.decryptRecord(retrievedRecord, actions, encryptionContext);

Uwaga: Powyższy przykład szyfruje przy użyciu klucza primary multi-Region, a następnie odszyfrowuje przy użyciu klucza replica multi-Region. Proces można również odwrócić — każdy klucz multi-Region może być używany do szyfrowania lub deszyfrowania danych.

Podsumowanie

W tym poście pokazaliśmy, jak używać kluczy AWS KMS dla wielu regionów z szyfrowaniem po stronie klienta, aby pomóc chronić dane w aplikacjach globalnych bez poświęcania wysokiej dostępności lub małych opóźnień. Pokazaliśmy również, jak rozpocząć pracę z aplikacją globalną, na krótkim przykładzie użycia kluczy multi-Region z DynamoDB Encryption Client i tabelami globalnymi DynamoDB.

Ten wpis to krótkie wprowadzenie do sposobów używania kluczy typu multi-Region. Zachęcamy do zapoznania się z tematem Korzystanie z kluczy multi-Region, aby dowiedzieć się więcej o ich funkcjonalności i wyglądzie. Dowiesz się o:

Case Studies
Referencje

Firma Hostersi pozwoliła nam osadzić ogólne zagadnienia programu Well Architected Framework w kontekście naszej firmy. Oszczędziło nam to wiele czasu i pozwoliło znaleźć lepiej dopasowane rozwiązania do specyfiki naszego biznesu. WAF był świetnym katalizatorem do wprowadzenie szeregu zmian w obszarze niezawodności, szybkości i bezpieczeństwa edrone. 

Piotr Stachowicz
CTO
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.