AWS KMS Chaveiros hierárquicos - AWS SDK de criptografia de banco de dados

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

AWS KMS Chaveiros hierárquicos

Nossa biblioteca de criptografia do lado do cliente foi renomeada para SDK de criptografia de AWS banco de dados. Este guia do desenvolvedor ainda fornece informações sobre o DynamoDB Encryption Client.
nota

Em 24 de julho de 2023, as chaves de ramificação criadas durante a versão prévia para desenvolvedores não são compatíveis. Crie novas chaves de ramificação para continuar usando o armazenamento de chaves de ramificação que você criou durante a versão prévia para desenvolvedores.

Com o AWS KMS chaveiro hierárquico, você pode proteger seus materiais criptográficos com uma chave KMS de criptografia simétrica sem ligar AWS KMS sempre que criptografar ou descriptografar um registro. É uma boa opção para aplicativos que precisam minimizar as chamadas e aplicativos que podem reutilizar alguns materiais criptográficos sem violar seus requisitos de segurança. AWS KMS

O chaveiro hierárquico é uma solução de armazenamento em cache de materiais criptográficos que reduz o número de AWS KMS chamadas usando chaves de ramificação AWS KMS protegidas persistentes em uma tabela do Amazon DynamoDB e, em seguida, armazenando localmente em cache materiais de chave de ramificação usados em operações de criptografia e descriptografia. A tabela do DynamoDB serve como o armazenamento de chaves de ramificação que gerencia e protege as chaves de ramificação. Ele armazena a chave de ramificação ativa e todas as versões anteriores da chave de ramificação. A chave de ramificação ativa é a versão mais recente da chave de ramificação. O token de autenticação hierárquico usa uma chave de dados exclusiva para criptografar cada campo e criptografa cada chave de dados com uma chave de empacotamento exclusiva derivada da chave de ramificação ativa. O token de autenticação hierárquico depende da hierarquia estabelecida entre as chaves de ramificação ativas e suas chaves de empacotamento derivadas.

O token de autenticação hierárquico normalmente usa cada versão da chave de ramificação para atender a várias solicitações. Porém, você controla até que ponto as chaves de ramificação ativas são reutilizadas e determina com que frequência a chave de ramificação ativa é alternada. A versão ativa da chave de ramificação permanece ativa até que você a alterne. As versões anteriores da chave de ramificação ativa não serão usadas para realizar operações de criptografia, mas ainda podem ser consultadas e usadas em operações de descriptografia.

Quando você instancia o token de autenticação hierárquico, ele cria um cache local. Você especifica um limite de cache que define o tempo máximo em que os materiais da chave de ramificação são armazenados no cache local antes de expirarem e serem despejados do cache. O chaveiro hierárquico faz uma AWS KMS chamada para descriptografar a chave de ramificação e montar os materiais da chave de ramificação na primeira vez em que a é especificado em uma branch-key-id operação. Em seguida, os materiais da chave de ramificação são armazenados no cache local e reutilizados para todas as operações de criptografia e descriptografia que especificam branch-key-id até que o limite do cache expire. Armazenar materiais de chave de filial no cache local reduz AWS KMS as chamadas. Por exemplo, considere um limite de cache de 15 minutos. Se você realizar 10.000 operações de criptografia dentro desse limite de cache, o AWS KMS chaveiro tradicional precisaria fazer 10.000 AWS KMS chamadas para satisfazer 10.000 operações de criptografia. Se você tiver um ativobranch-key-id, o chaveiro hierárquico só precisará fazer uma AWS KMS chamada para satisfazer 10.000 operações de criptografia.

O cache local consiste em duas partições, uma para operações de criptografia e outra para operações de descriptografia. A partição criptografada armazena os materiais da chave de ramificação reunidos a partir da chave de ramificação ativa e os reutiliza para todas as operações de criptografia até que o limite de cache expire. A partição de descriptografia armazena os materiais da chave de ramificação reunidos para outras versões de chave de ramificação identificadas nas operações de descriptografia. A partição de decodificação pode armazenar várias versões ativas de materiais de chave de ramificação ao mesmo tempo. Quando configurada para usar um fornecedor de ID de chave de ramificação para um banco de dados multilocatário, a partição criptografada também pode armazenar várias versões de materiais de chave de ramificação ao mesmo tempo. Para ter mais informações, consulte Uso do token de autenticação hierárquico com bancos de dados multilocatários.

nota

Todas as menções ao chaveiro hierárquico no SDK de criptografia de AWS banco de dados se referem ao chaveiro hierárquico. AWS KMS

Como funciona

As instruções a seguir descrevem como o token de autenticação hierárquico reúne materiais de criptografia e descriptografia e as diferentes chamadas que o token de autenticação faz para operações de criptografia e descriptografia. Para obter detalhes técnicos sobre a derivação da chave de empacotamento e os processos de criptografia da chave de dados em texto simples, consulte Detalhes técnicos do token de autenticação hierárquico do AWS KMS.

Criptografar e assinar

O passo a passo a seguir descreve como o token de autenticação hierárquico reúne materiais de criptografia e obtém uma chave de empacotamento exclusiva.

  1. O método de criptografia solicita materiais de criptografia ao token de autenticação hierárquico. O token de autenticação gera uma chave de dados em texto simples e, em seguida, verifica se há materiais de ramificação válidos no cache local para gerar a chave de empacotamento. Se houver materiais de chave de ramificação válidos, o token de autenticação prosseguirá para a Etapa 5.

  2. Se não houver materiais de chave de ramificação válidos, o token de autenticação hierárquico consulta o armazenamento de chaves de ramificação em busca da chave de ramificação ativa.

    1. O repositório de chaves de ramificação faz chamadas AWS KMS para descriptografar a chave de ramificação ativa e retorna a chave de ramificação ativa em texto simples. Os dados que identificam a chave de ramificação ativa são serializados para fornecer dados autenticados adicionais (AAD) na chamada de descriptografia para o AWS KMS.

    2. O armazenamento da chave de ramificação retorna a chave de ramificação em texto simples e os dados que a identificam, como a versão da chave de ramificação.

  3. O token de autenticação hierárquico reúne materiais de chave de ramificação (a chave de ramificação em texto simples e a versão da chave de ramificação) e armazena uma cópia deles no cache local.

  4. O token de autenticação hierárquico deriva uma chave de empacotamento exclusiva da chave de ramificação de texto simples e um sal aleatório de 16 bytes. Ele usa a chave de empacotamento derivada para criptografar uma cópia da chave de dados em texto simples.

O método de criptografia usa os materiais de criptografia para criptografar e assinar o registro. Para obter mais informações sobre como os registros são criptografados e assinados no SDK de criptografia de banco de dados da AWS , consulte Criptografar e assinar.

Descriptografar e verificar

O passo a passo a seguir descreve como o token de autenticação hierárquico reúne materiais de decodificação e decifra a chave de dados criptografada.

  1. O método de descriptografia identifica a chave de dados criptografada no campo de descrição do material do registro criptografado e a passa para o token de autenticação hierárquico.

  2. O token de autenticação hierárquico desserializa os dados que identificam a chave de dados criptografada, incluindo a versão da chave de ramificação, o sal de 16 bytes e outras informações que descrevem como a chave de dados foi criptografada.

    Para ter mais informações, consulte Detalhes técnicos do token de autenticação do AWS KMS hierárquico.

  3. O token de autenticação hierárquico verifica se há materiais de chave de ramificação válidos no cache local que correspondam à versão da chave de ramificação identificada na Etapa 2. Se houver materiais de chave de ramificação válidos, o token de autenticação prosseguirá para a Etapa 6 .

  4. Se não houver materiais de chave de ramificação válidos, o token de autenticação hierárquico consulta o armazenamento da chave de ramificação em busca da chave de ramificação que corresponde à versão da chave de ramificação identificada na Etapa 2.

    1. O repositório de chaves de ramificação faz chamadas AWS KMS para descriptografar a chave de ramificação e retorna a chave de ramificação ativa em texto simples. Os dados que identificam a chave de ramificação ativa são serializados para fornecer dados autenticados adicionais (AAD) na chamada de descriptografia para o AWS KMS.

    2. O armazenamento da chave de ramificação retorna a chave de ramificação em texto simples e os dados que a identificam, como a versão da chave de ramificação.

  5. O token de autenticação hierárquico reúne materiais de chave de ramificação (a chave de ramificação em texto simples e a versão da chave de ramificação) e armazena uma cópia deles no cache local.

  6. O token de autenticação hierárquico usa os materiais de chave de ramificação montados e o sal de 16 bytes identificado na Etapa 2 para reproduzir a chave de empacotamento exclusiva que criptografou a chave de dados.

  7. O token de autenticação hierárquico usa a chave de empacotamento reproduzida para descriptografar a chave de dados e retorna a chave de dados em texto simples.

O método de decodificação usa os materiais de decodificação e a chave de dados de texto simples para descriptografar e verificar o registro. Para obter mais informações sobre como os registros são descriptografados e verificados no SDK de criptografia de AWS banco de dados, consulte Descriptografar e verificar.

Pré-requisitos

O SDK AWS de criptografia de banco de dados não exige um Conta da AWS e não depende de nenhum AWS service (Serviço da AWS). No entanto, o chaveiro hierárquico depende do Amazon AWS KMS DynamoDB.

Para usar um chaveiro hierárquico, você precisa de uma criptografia AWS KMS key simétrica com as permissões kms:Decrypt. Também é possível usar uma chave multirregional de criptografia simétrica. Para obter informações detalhadas sobre permissões para o AWS KMS keys, consulte Autenticação e controle de acesso no Guia do Desenvolvedor do AWS Key Management Service .

Antes de criar e usar um token de autenticação hierárquico, você deve criar seu repositório de chaves de ramificação e preenchê-lo com sua primeira chave de ramificação ativa.

Etapa 1: configurar um novo serviço de armazenamento de chaves

O serviço de armazenamento de chaves fornece várias operações, como CreateKeyStore eCreateKey, para ajudar você a montar os pré-requisitos do token de autenticação hierárquico e gerenciar o armazenamento de chaves da ramificação.

O exemplo a seguir cria um serviço de armazenamento de chaves. Você deve especificar um nome de tabela do DynamoDB para atuar como o nome do seu armazenamento de chaves de ramificação, um nome lógico para o armazenamento de chaves de ramificação e o ARN da chave KMS que identifica a chave KMS que protegerá suas chaves de ramificação.

O nome do armazenamento lógico de chaves é vinculado criptograficamente a todos os dados armazenados na tabela para simplificar as operações de restauração do DynamoDB. O nome do armazenamento de chaves lógicas pode ser o mesmo nome da tabela do DynamoDB, mas não precisa ser. É altamente recomendável especificar o nome da tabela do DynamoDB como o nome lógico da tabela ao definir a configuração da chave pela primeira vez. Você deve sempre especificar o mesmo nome de tabela lógica. Caso o nome do armazenamento de chaves da ramificação mude após a restauração da tabela do DynamoDB a partir de um backup, o nome do armazenamento lógico de chaves é mapeado para o nome da tabela do DynamoDB que você especifica para garantir que o token de autenticação hierárquico ainda possa acessar o armazenamento de chaves da ramificação.

Java
final KeyStore keystore = KeyStore.builder().KeyStoreConfig( KeyStoreConfig.builder() .ddbClient(DynamoDbClient.create()) .ddbTableName(keyStoreName) .logicalKeyStoreName(logicalKeyStoreName) .kmsClient(KmsClient.create()) .kmsConfiguration(KMSConfiguration.builder() .kmsKeyArn(kmsKeyArn) .build()) .build()).build();
C# / .NET
var kmsConfig = new KMSConfiguration { KmsKeyArn = kmsKeyArn }; var keystoreConfig = new KeyStoreConfig { KmsClient = new AmazonKeyManagementServiceClient(), KmsConfiguration = kmsConfig, DdbTableName = keyStoreName, DdbClient = new AmazonDynamoDBClient(), LogicalKeyStoreName = logicalKeyStoreName }; var keystore = new KeyStore(keystoreConfig);
Etapa 2: Chamar o CreateKeyStore para criar um armazenamento de chaves de ramificação

A operação a seguir cria o armazenamento de chaves de ramificação que persistirá e protegerá suas chaves de ramificação.

Java
keystore.CreateKeyStore(CreateKeyStoreInput.builder().build());
C# / .NET
var createKeyStoreOutput = keystore.CreateKeyStore(new CreateKeyStoreInput());

A operação CreateKeyStore cria uma tabela do DynamoDB com o nome da tabela que você especificou na Etapa 1 e os valores obrigatórios a seguir.

Chave de partição Chave de classificação
Tabela base branch-key-id type
nota

Você pode criar manualmente a tabela do DynamoDB que serve como seu armazenamento de chaves de ramificação em vez de usar a operação. CreateKeyStore Se você optar por criar manualmente o armazenamento de chaves de ramificação, deverá especificar os seguintes valores de string para as chaves de partição e classificação:

  • Chave de partição: branch-key-id

  • Chave de classificação: type

Etapa 3: chamar CreateKey para criar uma nova chave de ramificação ativa

A operação a seguir cria uma nova chave de ramificação ativa usando a chave KMS especificada na Etapa 1 e adiciona a chave de ramificação ativa à tabela do DynamoDB que você criou na Etapa 2.

Ao chamar CreateKey, você pode optar por especificar os valores opcionais a seguir.

Java
final Map<String, String> additionalEncryptionContext = Collections.singletonMap("Additional Encryption Context for", "custom branch key id"); final String BranchKey = keystore.CreateKey( CreateKeyInput.builder() .branchKeyIdentifier(custom-branch-key-id) //OPTIONAL .encryptionContext(additionalEncryptionContext) //OPTIONAL .build()).branchKeyIdentifier();
C# / .NET
var additionalEncryptionContext = new Dictionary<string, string>(); additionalEncryptionContext.Add("Additional Encryption Context for", "custom branch key id"); var branchKeyId = keystore.CreateKey(new CreateKeyInput { BranchKeyIdentifier = "custom-branch-key-id", // OPTIONAL EncryptionContext = additionalEncryptionContext // OPTIONAL });

Primeiro, a operação CreateKey gera os valores a seguir.

Em seguida, a CreateKey operação chama kms: GenerateDataKeyWithoutPlaintext usando a seguinte solicitação.

{ "EncryptionContext": { "branch-key-id" : "branch-key-id", "type" : "type", "create-time" : "timestamp", "logical-key-store-name" : "the logical table name for your branch key store", "kms-arn" : the KMS key ARN, "hierarchy-version" : "1", "aws-crypto-ec:contextKey": "contextValue" }, "KeyId": "the KMS key ARN you specified in Step 1", "NumberOfBytes": "32" }
nota

A operação CreateKey cria uma chave de ramificação ativa e uma chave de beacon, mesmo que você não tenha configurado seu banco de dados para criptografia pesquisável. Ambas as chaves são armazenadas no armazenamento de chaves da ramificação. Para obter mais informações, consulte Usar o token de autenticação hierárquico para criptografia pesquisável.

Em seguida, a CreateKey operação chama kms: ReEncrypt para criar um registro ativo para a chave de ramificação atualizando o contexto de criptografia.

Por último, a CreateKey operação chama ddb: TransactWriteItems para escrever um novo item que persistirá com a chave de ramificação na tabela que você criou na Etapa 2. O item tem os seguintes atributos:

{ "branch-key-id" : branch-key-id, "type" : "branch:ACTIVE", "enc" : the branch key returned by the GenerateDataKeyWithoutPlaintext call, "version": "branch:version:the branch key version UUID", "create-time" : "timestamp", "kms-arn" : "the KMS key ARN you specified in Step 1", "hierarchy-version" : "1", "aws-crypto-ec:contextKey": "contextValue" }

Criar um token de autenticação hierárquico

Para inicializar o token de autenticação hierárquico, você deve fornecer os seguintes valores:

  • Um nome de armazenamento de chave de ramificação

    O nome da tabela do DynamoDB que você criou para servir como seu armazenamento de chaves de ramificação.

  • Um tempo de vida do cache (TTL)

    A quantidade de tempo, em segundos, em que uma entrada de materiais de chave de ramificação no cache local pode ser usada antes de expirar. O limite de cache TTL determina a frequência com que o cliente liga AWS KMS para autorizar o uso das chaves de ramificação. Esse valor deve ser maior que zero. Quando o limite de cache TTL expira, a entrada é removida do cache local.

  • Um identificador de chave de ramificação

    O branch-key-id que identifica a chave de ramificação ativa em seu armazenamento de chaves de ramificação.

    nota

    Para inicializar o token de autenticação hierárquico para uso multilocatário, você deve especificar um fornecedor de ID de chave de ramificação em vez de um branch-key-id. Para ter mais informações, consulte Uso do token de autenticação hierárquico com bancos de dados multilocatários.

  • (Opcional) Uma lista de Tokens de Concessão

    Se você controlar o acesso à chave do KMS no token de autenticação hierárquico com concessões, deverá fornecer todos os tokens de concessão necessários ao inicializar o token de autenticação.

Os exemplos a seguir demonstram como inicializar um chaveiro hierárquico com o AWS Database Encryption SDK for DynamoDB client. O exemplo a seguir especifica um limite de cache TTL de 600 segundos.

Java
final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsHierarchicalKeyringInput keyringInput = CreateAwsKmsHierarchicalKeyringInput.builder() .keyStore(branchKeyStoreName) .branchKeyId(branch-key-id) .ttlSeconds(600) .build(); final Keyring hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);
C# / .NET
var matProv = new MaterialProviders(new MaterialProvidersConfig()); var keyringInput = new CreateAwsKmsHierarchicalKeyringInput { KeyStore = keystore, BranchKeyIdSupplier = branchKeyIdSupplier, TtlSeconds = 600 }; var hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);

Alternar sua chave de ramificação ativa

Só pode haver uma versão ativa para cada chave de ramificação por vez. O token de autenticação hierárquico normalmente usa cada versão ativa da chave de ramificação para atender a várias solicitações. Porém, você controla até que ponto as chaves de ramificação ativas são reutilizadas e determina com que frequência a chave de ramificação ativa é alternada.

As chaves de ramificação não são usadas para criptografar chaves de dados em texto simples. Eles são usados para derivar as chaves de empacotamento exclusivas que criptografam chaves de dados de texto simples. O processo de derivação da chave de empacotamento produz uma chave de empacotamento exclusiva de 32 bytes com 28 bytes de randomização. Isso significa que uma chave de ramificação pode derivar mais de 79 octilhões, ou 296, chaves de empacotamento exclusivas antes que ocorra o desgaste criptográfico. Apesar desse risco de exaustão muito baixo, talvez seja necessário alternar suas chaves de ramificações ativas devido a regras comerciais ou contratuais ou regulamentações governamentais.

A versão ativa da chave de ramificação permanece ativa até que você a alterne. As versões anteriores da chave de ramificação ativa não serão usadas para realizar operações de criptografia e não podem ser usadas para derivar novas chaves de empacotamento. Porém, eles ainda podem ser consultados e fornecer chaves de empacotamento para descriptografar as chaves de dados que eles criptografaram enquanto estavam ativos.

Use a operação VersionKey do serviço de armazenamento de chaves para alternar sua chave de ramificação ativa. Quando você alterna a chave de ramificação ativa, uma nova chave de ramificação é criada para substituir a versão anterior. O branch-key-id não muda quando você alterna a chave de ramificação ativa. Você deve especificar branch-key-id que identificará a chave de ramificação ativa atual quando você chamar VersionKey.

Java
keystore.VersionKey( VersionKeyInput.builder() .branchKeyIdentifier("branch-key-id") .build() );
C# / .NET
keystore.VersionKey(new VersionKeyInput{BranchKeyIdentifier = branchKeyId});

Uso do token de autenticação hierárquico com bancos de dados multilocatários

É possível usar a hierarquia de chaves estabelecida entre as chaves de ramificação ativas e suas chaves de empacotamento derivadas para oferecer suporte a bancos de dados multilocatários criando uma chave de ramificação para cada locatário em seu banco de dados. O token de autenticação hierárquico então criptografa e assina todos os dados de um determinado locatário com sua chave de ramificação distinta. Isso permite que você armazene dados de vários locatários em um único banco de dados e isole os dados do locatário por chave de ramificação.

Cada locatário tem sua própria chave de ramificação, definida por uma branch-key-id exclusiva. Só pode haver uma versão ativa para cada branch-key-id por vez.

Fornecedor de ID de chave de filial

Antes de inicializar seu token de autenticação hierárquico para uso multilocatário, você deve criar uma chave de ramificação para cada locatário e criar um fornecedor de ID de chave de ramificação. O fornecedor da ID da chave da filial usa os campos armazenados no contexto de criptografia para determinar qual chave da filial do inquilino é necessária para descriptografar um registro. Por padrão, somente as chaves de partição e classificação são incluídas no contexto de criptografia. No entanto, você pode usar a ação SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT criptográfica para incluir campos adicionais no contexto de criptografia.

nota

Para usar a ação SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT criptográfica, você deve usar a versão 3.3 ou posterior do SDK de criptografia de AWS banco de dados. Implante a nova versão para todos os leitores antes de atualizar seu modelo de dados para incluí-laSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT.

Você pode usar o fornecedor da ID da chave da filial para criar um nome amigável branch-key-ids para facilitar o reconhecimento do correto branch-key-id para um inquilino. Por exemplo, o nome amigável permite que você se refira a uma chave de ramificação como tenant1 em vez de b3f61619-4d35-48ad-a275-050f87e15122.

Para operações de descriptografia, você pode configurar estaticamente um único token de autenticação hierárquico para restringir a descriptografia a um único locatário ou usar o fornecedor da ID da chave da ramificação para identificar qual locatário é responsável por descriptografar um registro.

Primeiro, siga as etapas 1 e 2 dos procedimentos de pré-requisitos. Em seguida, use os procedimentos a seguir para criar uma chave de ramificação para cada locatário, criar um fornecedor de ID de chave de ramificação e inicializar seu token de autenticação hierárquico para uso multilocatário.

Etapa 1: Crie uma chave de ramificação para cada locatário em seu banco de dados

Chame CreateKey para cada locatário em seu banco de dados.

A operação a seguir cria duas chaves de ramificação usando a chave KMS que você especificou ao criar seu serviço de armazenamento de chaves e adiciona as chaves de ramificação à tabela do DynamoDB que você criou para servir como seu armazenamento de chaves de ramificação. A mesma chave do KMS deve proteger todas as chaves de ramificação.

Java
CreateKeyOutput branchKeyId1 = keystore.CreateKey(CreateKeyInput.builder().build()); CreateKeyOutput branchKeyId2 = keystore.CreateKey(CreateKeyInput.builder().build());
C# / .NET
var branchKeyId1 = keystore.CreateKey(new CreateKeyInput()); var branchKeyId2 = keystore.CreateKey(new CreateKeyInput());
Etapa 2: crie um fornecedor de ID de chave de ramificação

O exemplo a seguir cria nomes amigáveis para as duas chaves de ramificação criadas na Etapa 1 e chama CreateDynamoDbEncryptionBranchKeyIdSupplier a criação de um fornecedor de ID de chave de filial com o cliente AWS Database Encryption SDK for DynamoDB.

Java
// Create friendly names for each branch-key-id class ExampleBranchKeyIdSupplier implements IDynamoDbKeyBranchKeyIdSupplier { private static String branchKeyIdForTenant1; private static String branchKeyIdForTenant2; public ExampleBranchKeyIdSupplier(String tenant1Id, String tenant2Id) { this.branchKeyIdForTenant1 = tenant1Id; this.branchKeyIdForTenant2 = tenant2Id; } // Create the branch key ID supplier final DynamoDbEncryption ddbEnc = DynamoDbEncryption.builder() .DynamoDbEncryptionConfig(DynamoDbEncryptionConfig.builder().build()) .build(); final BranchKeyIdSupplier branchKeyIdSupplier = ddbEnc.CreateDynamoDbEncryptionBranchKeyIdSupplier( CreateDynamoDbEncryptionBranchKeyIdSupplierInput.builder() .ddbKeyBranchKeyIdSupplier(new ExampleBranchKeyIdSupplier(branch-key-ID-tenant1, branch-key-ID-tenant2)) .build()).branchKeyIdSupplier();
C# / .NET
// Create friendly names for each branch-key-id class ExampleBranchKeyIdSupplier : DynamoDbKeyBranchKeyIdSupplierBase { private String _branchKeyIdForTenant1; private String _branchKeyIdForTenant2; public ExampleBranchKeyIdSupplier(String tenant1Id, String tenant2Id) { this._branchKeyIdForTenant1 = tenant1Id; this._branchKeyIdForTenant2 = tenant2Id; } // Create the branch key ID supplier var ddbEnc = new DynamoDbEncryption(new DynamoDbEncryptionConfig()); var branchKeyIdSupplier = ddbEnc.CreateDynamoDbEncryptionBranchKeyIdSupplier( new CreateDynamoDbEncryptionBranchKeyIdSupplierInput { DdbKeyBranchKeyIdSupplier = new ExampleBranchKeyIdSupplier(branch-key-ID-tenant1, branch-key-ID-tenant2) }).BranchKeyIdSupplier;
Etapa 3: inicialize seu token de autenticação hierárquico com o fornecedor de ID da chave de ramificação

Para inicializar o token de autenticação hierárquico, você deve fornecer os seguintes valores:

  • Um nome de armazenamento de chave de ramificação

  • Um tempo de vida do cache (TTL)

  • Um fornecedor de ID de chave de ramificação

  • (Opcional) Um cache

    Se você quiser personalizar o tipo de cache ou o número de entradas de materiais de chave de ramificação que podem ser armazenadas no cache local, especifique o tipo de cache e a capacidade de entrada ao inicializar o token de autenticação.

    O tipo de cache define o modelo de segmentação. O chaveiro hierárquico fornece três tipos de cache que oferecem suporte a bancos de dados multilocatários: Padrão,,. MultiThreaded StormTracking

    Se você não especificar um cache, o token de autenticação hierárquico usará automaticamente o tipo de cache Default e definirá a capacidade de entrada como 1000.

    Default (Recommended)

    Para a maioria dos usuários, o cache Default atende aos requisitos de segmentação. O cache Default foi projetado para oferecer suporte a ambientes com muitos threads. Quando uma entrada de materiais de chave de ramificação expira, o cache padrão impede que vários segmentos sejam chamados, AWS KMS notificando um segmento de que a entrada de materiais de chave de ramificação expirará com 10 segundos de antecedência. Isso garante que somente um thread envie uma solicitação AWS KMS para atualizar o cache.

    Para inicializar o token de autenticação hierárquico com um cache Default, especifique o seguinte valor:

    • Capacidade de entrada: limita o número de entradas de materiais de chave da ramificação que podem ser armazenadas no cache local.

    Java
    .cache(CacheType.builder() .Default(DefaultCache.builder() .entryCapacity(100) .build())
    C# /.NET
    CacheType defaultCache = new CacheType { Default = new DefaultCache{EntryCapacity = 100} };

    O padrão e StormTracking os caches suportam o mesmo modelo de segmentação, mas você só precisa especificar a capacidade de entrada para inicializar o chaveiro hierárquico com o cache padrão. Para personalizações de cache mais granulares, use o cache. StormTracking

    MultiThreaded

    O MultiThreaded cache é seguro para uso em ambientes com vários processos, mas não fornece nenhuma funcionalidade para minimizar as chamadas do Amazon AWS KMS DynamoDB. Como resultado, quando uma entrada de materiais de chave de ramificação expirar, todos os tópicos serão notificados ao mesmo tempo. Isso pode resultar em várias AWS KMS chamadas para atualizar o cache.

    Para inicializar seu chaveiro hierárquico com um MultiThreaded cache, especifique os seguintes valores:

    • Capacidade de entrada: limita o número de entradas de materiais de chave da ramificação que podem ser armazenadas no cache local.

    • Tamanho de entrada de limpeza de tail: define o número de entradas a serem limpas se a capacidade de entrada for atingida.

    Java
    .cache(CacheType.builder() .MultiThreaded(MultiThreadedCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .build())
    C# /.NET
    CacheType multithreadedCache = new CacheType { MultiThreaded = new MultiThreadedCache { EntryCapacity = 100, EntryPruningTailSize = 1 } };
    StormTracking

    O StormTracking cache foi projetado para suportar ambientes altamente multisegmentados. Quando uma entrada de materiais de chave de ramificação expira, o StormTracking cache impede que vários segmentos sejam chamados AWS KMS notificando um segmento de que a entrada de materiais de chave de ramificação expirará com antecedência. Isso garante que somente um thread envie uma solicitação AWS KMS para atualizar o cache.

    Para inicializar seu chaveiro hierárquico com um StormTracking cache, especifique os seguintes valores:

    • Capacidade de entrada: limita o número de entradas de materiais de chave da ramificação que podem ser armazenadas no cache local.

    • Tamanho de entrada de limpeza de tail: define o número de entradas de materiais de chave da ramificação a serem limpas por vez.

      Valor padrão: 1 entrada

    • Período de carência: define o número de segundos antes da expiração em que é feita uma tentativa de atualizar os materiais de chave da ramificação.

      Valor padrão: 10 segundos

    • Intervalo de carência: define o número de segundos entre as tentativas de atualizar os materiais de chave da ramificação.

      Valor padrão: 1 segundo

    • Fan out: define o número de tentativas simultâneas que podem ser feitas para atualizar os materiais de chave da ramificação.

      Valor padrão: 20 tentativas

    • Tempo de ativação (TTL) em trânsito: define o número de segundos até que uma tentativa de atualizar os materiais de chave de ramificação atinja o tempo limite. Sempre que o cache retorna NoSuchEntry em resposta a GetCacheEntry, essa chave de ramificação é considerada em trânsito até que a mesma chave seja gravada com uma entrada PutCache.

      Valor padrão: 20 segundos

    • Sleep: define o número de segundos que um thread deve ficar em repouso se fanOut for excedido.

      Valor padrão: 20 milissegundos

    Java
    .cache(CacheType.builder() .StormTracking(StormTrackingCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .gracePeriod(10) .graceInterval(1) .fanOut(20) .inFlightTTL(20) .sleepMilli(20) .build())
    C# /.NET
    CacheType stormTrackingCache = new CacheType { StormTracking = new StormTrackingCache { EntryCapacity = 100, EntryPruningTailSize = 1, FanOut = 20, GraceInterval = 1, GracePeriod = 10, InFlightTTL = 20, SleepMilli = 20 } };
  • (Opcional) Uma lista de Tokens de Concessão

    Se você controlar o acesso à chave do KMS no token de autenticação hierárquico com concessões, deverá fornecer todos os tokens de concessão necessários ao inicializar o token de autenticação.

Os exemplos a seguir inicializam um chaveiro hierárquico com o fornecedor de ID de chave de filial criado na Etapa 2, um limite de cache TLL de 600 segundos e um tamanho máximo de cache de 1000. Este exemplo inicializa um chaveiro hierárquico com o cliente AWS Database Encryption SDK for DynamoDB.

Java
final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsHierarchicalKeyringInput keyringInput = CreateAwsKmsHierarchicalKeyringInput.builder() .keyStore(keystore) .branchKeyIdSupplier(branchKeyIdSupplier) .ttlSeconds(600) .cache(CacheType.builder() //OPTIONAL .Default(DefaultCache.builder() .entryCapacity(100) .build()) .build(); final Keyring hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);
C# / .NET
var matProv = new MaterialProviders(new MaterialProvidersConfig()); var keyringInput = new CreateAwsKmsHierarchicalKeyringInput { KeyStore = keystore, BranchKeyIdSupplier = branchKeyIdSupplier, TtlSeconds = 600, Cache = new CacheType { Default = new DefaultCache { EntryCapacity = 100 } } }; var hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);

Uso do token de autenticação hierárquico para criptografia pesquisável

A criptografia pesquisável permite pesquisar registros criptografados sem descriptografar todo o banco de dados. Isso é feito indexando o valor de texto simples de um campo criptografado com um beacon. Para implementar a criptografia pesquisável, você deve usar um token de autenticação hierárquico.

A operação CreateKey de armazenamento de chaves gera uma chave de ramificação e uma chave de beacon. A chave de ramificação é usada em operações de criptografia e descriptografia de registros. A chave do beacon é usada para gerar beacons.

A chave de ramificação e a chave de beacon são protegidas pelo mesmo AWS KMS key que você especifica ao criar seu serviço de armazenamento de chaves. Depois que a CreateKey operação chama AWS KMS para gerar a chave de ramificação, ela chama kms: GenerateDataKeyWithoutPlaintext uma segunda vez para gerar a chave de beacon usando a seguinte solicitação.

{ "EncryptionContext": { "branch-key-id" : "branch-key-id", "type" : type, "create-time" : "timestamp", "logical-key-store-name" : "the logical table name for your branch key store", "kms-arn" : the KMS key ARN, "hierarchy-version" : 1 }, "KeyId": "the KMS key ARN", "NumberOfBytes": "32" }

Depois de gerar as duas chaves, a CreateKey operação chama ddb: TransactWriteItems para escrever dois novos itens que manterão a chave de ramificação e a chave de beacon em seu armazenamento de chaves de ramificação.

Quando você configura um beacon padrão, o SDK do AWS Database Encryption consulta o repositório de chaves da ramificação em busca da chave do beacon. Em seguida, ele usa uma função de derivação de extract-and-expand chave baseada em HMAC (HKDF) para combinar a chave do farol com o nome do farol padrão para criar a chave HMAC para um determinado farol.

Ao contrário das chaves de ramificação, há apenas uma versão de chave de beacon por branch-key-id em um armazenamento de chaves de ramificação. A chave do beacon nunca é alternada.

Definição da fonte de chave de beacon

Ao definir a versão do beacon para seus beacons padrão e compostos, você deve identificar a chave do beacon e definir um limite de tempo de vida do cache (TTL) para os materiais da chave do beacon. Os materiais das chaves do beacon são armazenados em um cache local separado das chaves da ramificação. O trecho a seguir demonstra como definir o keySource para um banco de dados de locatário único. Identifique sua chave de beacon pelo branch-key-id que ela está associada.

Java
keySource(BeaconKeySource.builder() .single(SingleKeyStore.builder() .keyId(branch-key-id) .cacheTTL(6000) .build()) .build())
C# / .NET
KeySource = new BeaconKeySource { Single = new SingleKeyStore { KeyId = branch-key-id, CacheTTL = 6000 } }
Definição da fonte do beacon em um banco de dados multilocatário

Se você tiver um banco de dados multilocatário, deverá especificar os valores a seguir ao configurar o keySource.

  • keyFieldName

    Define o nome do campo que armazena o branch-key-id associado à chave de beacon usada para gerar beacons para um determinado locatário. O keyFieldName pode ser qualquer string, mas deve ser exclusiva para todos os outros campos do banco de dados. Quando você grava novos registros em seu banco de dados, a chave branch-key-id que identifica a chave de beacon usada para gerar quaisquer beacons para esse registro é armazenada nesse campo. Você deve incluir esse campo em suas consultas de beacon e identificar os materiais de chave de beacon apropriados necessários para recalcular o beacon. Para ter mais informações, consulte Consultar beacons em um banco de dados multilocatário.

  • cacheTTL

    A quantidade de tempo, em segundos, em que uma entrada de materiais de chave de beacon no cache local pode ser usada antes de expirar. Esse valor deve ser maior que zero. Quando o limite de cache TTL expira, a entrada é removida do cache local.

  • (Opcional) Um cache

    Se você quiser personalizar o tipo de cache ou o número de entradas de materiais de chave de ramificação que podem ser armazenadas no cache local, especifique o tipo de cache e a capacidade de entrada ao inicializar o token de autenticação.

    O tipo de cache define o modelo de segmentação. O chaveiro hierárquico fornece três tipos de cache que oferecem suporte a bancos de dados multilocatários: Padrão,,. MultiThreaded StormTracking

    Se você não especificar um cache, o token de autenticação hierárquico usará automaticamente o tipo de cache Default e definirá a capacidade de entrada como 1000.

    Default (Recommended)

    Para a maioria dos usuários, o cache Default atende aos requisitos de segmentação. O cache Default foi projetado para oferecer suporte a ambientes com muitos threads. Quando uma entrada de materiais de chave de ramificação expira, o cache padrão impede que vários segmentos sejam chamados, AWS KMS notificando um segmento de que a entrada de materiais de chave de ramificação expirará com 10 segundos de antecedência. Isso garante que somente um thread envie uma solicitação AWS KMS para atualizar o cache.

    Para inicializar o token de autenticação hierárquico com um cache Default, especifique o seguinte valor:

    • Capacidade de entrada: limita o número de entradas de materiais de chave da ramificação que podem ser armazenadas no cache local.

    Java
    .cache(CacheType.builder() .Default(DefaultCache.builder() .entryCapacity(100) .build())
    C# /.NET
    CacheType defaultCache = new CacheType { Default = new DefaultCache{EntryCapacity = 100} };

    O padrão e StormTracking os caches suportam o mesmo modelo de segmentação, mas você só precisa especificar a capacidade de entrada para inicializar o chaveiro hierárquico com o cache padrão. Para personalizações de cache mais granulares, use o cache. StormTracking

    MultiThreaded

    O MultiThreaded cache é seguro para uso em ambientes com vários processos, mas não fornece nenhuma funcionalidade para minimizar as chamadas do Amazon AWS KMS DynamoDB. Como resultado, quando uma entrada de materiais de chave de ramificação expirar, todos os tópicos serão notificados ao mesmo tempo. Isso pode resultar em várias AWS KMS chamadas para atualizar o cache.

    Para inicializar seu chaveiro hierárquico com um MultiThreaded cache, especifique os seguintes valores:

    • Capacidade de entrada: limita o número de entradas de materiais de chave da ramificação que podem ser armazenadas no cache local.

    • Tamanho de entrada de limpeza de tail: define o número de entradas a serem limpas se a capacidade de entrada for atingida.

    Java
    .cache(CacheType.builder() .MultiThreaded(MultiThreadedCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .build())
    C# /.NET
    CacheType multithreadedCache = new CacheType { MultiThreaded = new MultiThreadedCache { EntryCapacity = 100, EntryPruningTailSize = 1 } };
    StormTracking

    O StormTracking cache foi projetado para suportar ambientes altamente multisegmentados. Quando uma entrada de materiais de chave de ramificação expira, o StormTracking cache impede que vários segmentos sejam chamados AWS KMS notificando um segmento de que a entrada de materiais de chave de ramificação expirará com antecedência. Isso garante que somente um thread envie uma solicitação AWS KMS para atualizar o cache.

    Para inicializar seu chaveiro hierárquico com um StormTracking cache, especifique os seguintes valores:

    • Capacidade de entrada: limita o número de entradas de materiais de chave da ramificação que podem ser armazenadas no cache local.

    • Tamanho de entrada de limpeza de tail: define o número de entradas de materiais de chave da ramificação a serem limpas por vez.

      Valor padrão: 1 entrada

    • Período de carência: define o número de segundos antes da expiração em que é feita uma tentativa de atualizar os materiais de chave da ramificação.

      Valor padrão: 10 segundos

    • Intervalo de carência: define o número de segundos entre as tentativas de atualizar os materiais de chave da ramificação.

      Valor padrão: 1 segundo

    • Fan out: define o número de tentativas simultâneas que podem ser feitas para atualizar os materiais de chave da ramificação.

      Valor padrão: 20 tentativas

    • Tempo de ativação (TTL) em trânsito: define o número de segundos até que uma tentativa de atualizar os materiais de chave de ramificação atinja o tempo limite. Sempre que o cache retorna NoSuchEntry em resposta a GetCacheEntry, essa chave de ramificação é considerada em trânsito até que a mesma chave seja gravada com uma entrada PutCache.

      Valor padrão: 20 segundos

    • Sleep: define o número de segundos que um thread deve ficar em repouso se fanOut for excedido.

      Valor padrão: 20 milissegundos

    Java
    .cache(CacheType.builder() .StormTracking(StormTrackingCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .gracePeriod(10) .graceInterval(1) .fanOut(20) .inFlightTTL(20) .sleepMilli(20) .build())
    C# /.NET
    CacheType stormTrackingCache = new CacheType { StormTracking = new StormTrackingCache { EntryCapacity = 100, EntryPruningTailSize = 1, FanOut = 20, GraceInterval = 1, GracePeriod = 10, InFlightTTL = 20, SleepMilli = 20 } };

O exemplo a seguir inicializa um chaveiro hierárquico com o fornecedor de ID de chave de filial criado na Etapa 2, um limite de cache TLL de 600 segundos e uma capacidade de entrada de 1000.

Java
final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsHierarchicalKeyringInput keyringInput = CreateAwsKmsHierarchicalKeyringInput.builder() .keyStore(branchKeyStoreName) .branchKeyIdSupplier(branchKeyIdSupplier) .ttlSeconds(600) .cache(CacheType.builder() //OPTIONAL .Default(DefaultCache.builder() .entryCapacity(1000) .build()) .build(); final IKeyring hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);
C# / .NET
var matProv = new MaterialProviders(new MaterialProvidersConfig()); var keyringInput = new CreateAwsKmsHierarchicalKeyringInput { KeyStore = keystore, BranchKeyIdSupplier = branchKeyIdSupplier, TtlSeconds = 600, Cache = new CacheType { Default = new DefaultCache { EntryCapacity = 1000 } } }; var hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);