Criptografia em repouso: como usar chaves gerenciadas pelo cliente para criptografar tabelas no Amazon Keyspaces - Amazon Keyspaces (para Apache Cassandra)

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á.

Criptografia em repouso: como usar chaves gerenciadas pelo cliente para criptografar tabelas no Amazon Keyspaces

É possível usar o console ou a instruções CQL para especificar a AWS KMS key em novas tabelas e atualizar as chaves de criptografia em tabelas existentes no Amazon Keyspaces. O tópico a seguir descreve como implementar chaves gerenciadas pelo cliente para tabelas novas e existentes.

Pré-requisitos: Crie uma chave gerenciada pelo cliente usando AWS KMS e conceda permissões ao Amazon Keyspaces

Antes de proteger uma tabela do Amazon Keyspaces com uma chave gerenciada pelo cliente, você deve primeiro criar a chave em AWS Key Management Service (AWS KMS) e depois autorizar o Amazon Keyspaces a usar essa chave.

Etapa 1: Criar uma chave gerenciada pelo cliente do AWS KMS

Para criar uma chave gerenciada pelo cliente para ser usada para proteger uma tabela do Amazon Keyspaces, você pode seguir as etapas em Criação de chaves KMS de criptografia simétrica usando o console ou a API AWS.

Etapa 2: Autorizar o uso da chave gerenciada pelo cliente

Antes de escolher uma chave gerenciada pelo cliente para proteger uma tabela do Amazon Keyspaces, as políticas nessa chave gerenciada pelo cliente devem conceder ao Amazon Keyspaces permissão para usá-la em seu nome. Você tem controle total sobre as políticas e concessões em uma chave gerenciada pelo cliente. É possível fornecer essas permissões em uma política de chaves, em uma política do IAM ou em uma concessão.

O Amazon Keyspaces não precisa de autorização adicional para usar o padrão Chave pertencente à AWS para proteger as tabelas do Amazon Keyspaces em sua conta AWS.

Os tópicos a seguir mostram como configurar as permissões necessárias usando concessões e políticas do IAM que permitem que as tabelas do Amazon Keyspaces usem uma chave gerenciada pelo cliente.

Política de chaves para chaves gerenciadas pelo cliente

Ao escolher uma chave gerenciada pelo cliente para proteger uma tabela do Amazon Keyspaces, o Amazon Keyspaces obtém permissão para usar a chave gerenciada pelo cliente em nome da entidade principal que faz a seleção. Essa entidade principal, um usuário ou um perfil deve ter as permissões na chave gerenciada pelo cliente exigida pelo Amazon Keyspaces.

No mínimo, o Amazon Keyspaces exige as seguintes permissões em uma chave gerenciada pelo cliente:

Política de chaves de exemplo

Por exemplo, a política de chaves de exemplo a seguir fornece somente as permissões necessárias. A política tem os seguintes efeitos:

  • Permite que o Amazon Keyspaces use a chave gerenciada pelo cliente em operações criptográficas e cria concessões, mas somente quando está atuando em nome de entidades principais na conta que tem permissão para usar o Amazon Keyspaces. Se as entidades principais especificados na instrução da política não tiverem permissão para usar o Amazon Keyspaces, a chamada falhará, mesmo se vier do serviço do Amazon Keyspaces.

  • A chave de condição kms:ViaService concede as permissões somente quando a solicitação é proveniente do Amazon Keyspaces em nome das entidades principais listadas na instrução da política. Essas entidades principais não podem chamar essas operações diretamente. Observe que o valor de kms:ViaService, cassandra.*.amazonaws.com, tem um asterisco (*) na posição da região. O Amazon Keyspaces exige a permissão para ser independente de qualquer Região da AWS específica.

  • Concede aos administradores da chave gerenciada pelo cliente (usuários que podem assumir o perfil db-team) acesso somente leitura à chave gerenciada pelo cliente e permissão para revogar concessões, incluindo as concessões exigidas pelo Amazon Keyspaces para proteger a tabela.

  • Concede ao Amazon Keyspaces acesso somente leitura à chave gerenciada pelo cliente. Nesse caso, o Amazon Keyspaces pode chamar essas operações diretamente. Ele não precisa atuar em nome da entidade principal de uma conta.

Antes de usar uma política de chaves de exemplo, substitua o exemplo de entidades principais por entidades principais reais da sua conta da Conta da AWS.

{ "Id": "key-policy-cassandra", "Version":"2012-10-17", "Statement": [ { "Sid" : "Allow access through Amazon Keyspaces for all principals in the account that are authorized to use Amazon Keyspaces", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"}, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey", "kms:CreateGrant" ], "Resource": "*", "Condition": { "StringLike": { "kms:ViaService" : "cassandra.*.amazonaws.com" } } }, { "Sid": "Allow administrators to view the customer managed key and revoke grants", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/db-team" }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource": "*" } ] }

Como usar concessões para autorizar o Amazon Keyspaces

Além de políticas de chaves, o Amazon Keyspaces usa concessões para definir permissões em uma chave gerenciada pelo cliente. Para visualizar as concessões em uma chave gerenciada pelo cliente na sua conta, use a operação ListGrants. O Amazon Keyspaces não precisa de concessões ou permissões adicionais para usar a Chave pertencente à AWS para proteger sua tabela.

O Amazon Keyspaces usa as permissões de concessão ao executar manutenção do sistema e tarefas de proteção de dados contínua em segundo plano. Usa também concessões para gerar chaves de tabela.

Cada concessão é específica a uma tabela. Se a conta inclui várias tabelas criptografadas na mesma chave gerenciada pelo cliente, há uma concessão de cada tipo para cada tabela. A concessão é restrita pelo contexto da criptografia do Amazon Keyspaces, que inclui o nome da tabela e o ID da Conta da AWS. A concessão inclui permissão para retirar a concessão se ela não for mais necessária.

Para criar as concessões, o Amazon Keyspaces deve ter permissão para chamar CreateGrant em nome do usuário que criou a tabela criptografada.

A política de chaves também pode permitir que a conta revogue a concessão na chave gerenciada pelo cliente. No entanto, se você revogar a concessão em uma tabela criptografada ativa, o Amazon Keyspaces não poderá proteger e manter a tabela.

Etapa 3: Especificar uma chave gerenciada pelo cliente para uma nova tabela

Siga estas etapas para especificar a chave gerenciada pelo cliente em uma nova tabela usando o console do Amazon Keyspaces ou o CQL.

Crie uma tabela criptografada usando uma chave gerenciada pelo cliente (console)

  1. Faça login no AWS Management Console e abra o console do Amazon Keyspaces em https://console.aws.amazon.com/keyspaces/home.

  2. No painel de navegação, selecione Tables (Tabelas) e Create table (Criar tabela).

  3. Na página Criar tabela, na seção Detalhes da tabela, selecione um espaço de chaves e forneça um nome para a nova tabela.

  4. Na seção Esquema, crie o esquema para sua tabela.

  5. Na seção Configurações da tabela, selecione Personalizar configurações.

  6. Continue com as configurações de criptografia.

    Nesta etapa, você seleciona as configurações de criptografia para a tabela.

    Na seção Criptografia em repouso, em Escolha uma AWS KMS key, escolha a opção Escolha uma chave KMS diferente (avançado) e, no campo de pesquisa, escolha AWS KMS key ou insira um Nome do recurso da Amazon (ARN).

    nota

    Se a chave selecionada não estiver acessível ou não tiver as permissões necessárias, consulte Solução de problemas de acesso à chave no Guia do desenvolvedor AWS Key Management Service.

  7. Selecione Create (Criar) para criar a tabela criptografada.

Crie uma nova tabela usando uma chave gerenciada pelo cliente para criptografia em repouso (CQL)

Para criar uma nova tabela que usa uma chave gerenciada pelo cliente para criptografia em repouso, você pode usar a instrução CREATE TABLE como no exemplo a seguir. Certifique-se de substituir o ARN da chave por um ARN para uma chave válida com permissões concedidas ao Amazon Keyspaces.

CREATE TABLE my_keyspace.my_table(id bigint, name text, place text STATIC, PRIMARY KEY(id, name)) WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111' } };

Se você receber uma Invalid Request Exception, precisará confirmar que a chave gerenciada pelo cliente é válida e que o Amazon Keyspaces tem as permissões necessárias. Para confirmar se a chave foi configurada corretamente, consulte Solução de problemas de acesso à chave no Guia do desenvolvedor AWS Key Management Service.

Etapa 4: Atualizar a chave de criptografia de uma tabela existente

Também é possível usar o console do Amazon Keyspaces ou CQL para atualizar as chaves de criptografia de uma tabela existente entre uma Chave pertencente à AWS e uma chave gerenciada pelo cliente a qualquer momento.

Atualizar uma tabela existente com a nova chave gerenciada pelo cliente (console)

  1. Faça login no AWS Management Console e abra o console do Amazon Keyspaces em https://console.aws.amazon.com/keyspaces/home.

  2. No painel de navegação, selecione Tables (Tabelas).

  3. Escolha a tabela com a qual você deseja trabalhar e selecione a guia Configurações adicionais.

  4. Na seção Criptografia em repouso, escolha Gerenciar criptografia para editar as configurações de criptografia da tabela.

    Em Escolher uma AWS KMS key, escolha a opção Escolha uma chave KMS diferente (avançado) e, no campo de pesquisa, escolha uma AWS KMS key ou insira um Nome do recurso da Amazon (ARN).

    nota

    Se a chave selecionada não for válida, consulte Solução de problemas de acesso à chave no Guia do desenvolvedor AWS Key Management Service.

    Como alternativa, você pode escolher uma Chave pertencente à AWS para uma tabela criptografada com uma chave gerenciada pelo cliente.

  5. Selecione Save (Salvar) para salvar as alterações.

Atualizar a chave de criptografia usada para uma tabela existente

Para alterar a chave de criptografia de uma tabela existente, use a instrução ALTER TABLE para especificar uma chave gerenciada pelo cliente para criptografia em repouso. Certifique-se de substituir o ARN da chave por um ARN para uma chave válida com permissões concedidas ao Amazon Keyspaces.

ALTER TABLE my_keyspace.my_table WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111' } };

Se você receber uma Invalid Request Exception, precisará confirmar que a chave gerenciada pelo cliente é válida e que o Amazon Keyspaces tem as permissões necessárias. Para confirmar se a chave foi configurada corretamente, consulte Solução de problemas de acesso à chave no Guia do desenvolvedor AWS Key Management Service.

Para alterar a chave de criptografia de volta para a opção padrão de criptografia em repouso com Chaves pertencentes à AWS, você pode usar a instrução ALTER TABLE conforme mostrado no exemplo a seguir.

ALTER TABLE my_keyspace.my_table WITH CUSTOM_PROPERTIES = { 'encryption_specification':{ 'encryption_type' : 'AWS_OWNED_KMS_KEY' } };

Etapa 5: Usar o contexto de criptografia do Amazon Keyspaces nos logs

Um contexto de criptografia é um conjunto de pares de chave-valor que contêm dados arbitrários não secretos. Quando você inclui um contexto de criptografia em uma solicitação para criptografar dados, o AWS KMS vincula de forma criptográfica o contexto de criptografia aos dados criptografados. Para descriptografar os dados, você deve passar o mesmo contexto de criptografia.

O Amazon Keyspaces usa o mesmo contexto de criptografia em todas as operações de criptografia do AWS KMS. Se você usar uma chave gerenciada pelo cliente para proteger a tabela do Amazon Keyspaces, é possível usar o contexto de criptografia para identificar o uso da chave gerenciada pelo cliente em logs e registros de auditoria. Ele também aparece em texto simples em logs, como aqueles para AWS CloudTrail e Amazon CloudWatch Logs.

Em suas solicitações para o AWS KMS, o Amazon Keyspaces usa um contexto de criptografia com dois pares de chave/valor.

"encryptionContextSubset": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "mytable" "aws:cassandra:subscriberId": "111122223333" }
  • Espaço de chaves: O primeiro par de chave-valor identifica o espaço de chaves que inclui a tabela que o Amazon Keyspaces está criptografando. A chave é aws:cassandra:keyspaceName. O valor é o nome do espaço de chaves.

    "aws:cassandra:keyspaceName": "<keyspace-name>"

    Por exemplo:

    "aws:cassandra:keyspaceName": "my_keyspace"
  • Tabela: O segundo par de chave/valor identifica a tabela que o Amazon Keyspaces está criptografando. A chave é aws:cassandra:tableName. O valor é o nome da tabela.

    "aws:cassandra:tableName": "<table-name>"

    Por exemplo:

    "aws:cassandra:tableName": "my_table"
  • Conta: O terceiro par de chave-valor identifica a Conta da AWS. A chave é aws:cassandra:subscriberId. O valor é o ID de conta.

    "aws:cassandra:subscriberId": "<account-id>"

    Por exemplo:

    "aws:cassandra:subscriberId": "111122223333"

Etapa 6: Configurar o monitoramento com AWS CloudTrail

Se você usa uma chave gerenciada pelo cliente para proteger suas tabelas do Amazon Keyspaces, você poderá usar logs do AWS CloudTrail para rastrear as solicitações que o Amazon Keyspaces envia ao AWS KMS por você.

As solicitações GenerateDataKey, DescribeKey, Decrypt, e CreateGrant são discutidas nesta seção. Além disso, o Amazon Keyspaces usa uma operação RetireGrant para remover uma concessão quando você exclui uma tabela.

GenerateDataKey

O Amazon Keyspaces cria uma chave de tabela exclusiva para criptografar dados em repouso. Ele envia uma solicitação GenerateDataKey ao AWS KMS que especifica a chave do KMS para a tabela.

O evento que registra a operação GenerateDataKey é semelhante ao evento de exemplo a seguir. O usuário é a conta de serviço do Amazon Keyspaces. Os parâmetros incluem o Nome do recurso da Amazon (ARN) da chave gerenciada pelo cliente, um especificador de chave que requer uma chave de 256 bits e o contexto de criptografia que identifica a tabela e a conta da Conta da AWS.

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T04:56:05Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keySpec": "AES_256", "encryptionContext": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" }, "keyId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" }, "responseElements": null, "requestID": "5e8e9cb5-9194-4334-aacc-9dd7d50fe246", "eventID": "49fccab9-2448-4b97-a89d-7d5c39318d6f", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012", "sharedEventID": "84fbaaf0-9641-4e32-9147-57d2cb08792e" }
DescribeKey

Além disso, o Amazon Keyspaces usa uma operação DescribeKey para determinar se a chave do KMS escolhida existe na conta e na região.

O evento que registra a operação DescribeKey é semelhante ao evento de exemplo a seguir. O usuário é a conta de serviço do Amazon Keyspaces. Os parâmetros incluem o ARN da chave gerenciada pelo cliente e um especificador de chaves que requer uma chave de 256 bits.

{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AIDAZ3FNIIVIZZ6H7CFQG", "arn": "arn:aws:iam::123SAMPLE012:user/admin", "accountId": "123SAMPLE012", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "admin", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-04-16T04:55:42Z" } }, "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T04:55:58Z", "eventSource": "kms.amazonaws.com", "eventName": "DescribeKey", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keyId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" }, "responseElements": null, "requestID": "c25a8105-050b-4f52-8358-6e872fb03a6c", "eventID": "0d96420e-707e-41b9-9118-56585a669658", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012" }
Decrypt

Quando você acessa uma tabela criptografada do Amazon Keyspaces, o Amazon Keyspaces precisa descriptografar a chave da tabela para que possa descriptografar as chaves abaixo dela na hierarquia. Descriptografa os dados na tabela. Para descriptografar a chave de tabela. O Amazon Keyspaces envia uma solicitação Decrypt para o AWS KMS que especifica a chave KMS para a tabela.

O evento que registra a operação Decrypt é semelhante ao evento de exemplo a seguir. O usuário é a entidade principal na sua Conta da AWS que está acessando a tabela. Os parâmetros incluem a chave de tabela criptografada (como um blob de texto cifrado) e o contexto de criptografia que identifica a tabela e a Conta da AWS. O AWS KMS deriva o ID da chave gerenciada pelo cliente do texto cifrado.

{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T05:29:44Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "encryptionContext": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" }, "encryptionAlgorithm": "SYMMETRIC_DEFAULT" }, "responseElements": null, "requestID": "50e80373-83c9-4034-8226-5439e1c9b259", "eventID": "8db9788f-04a5-4ae2-90c9-15c79c411b6b", "readOnly": true, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012", "sharedEventID": "7ed99e2d-910a-4708-a4e3-0180d8dbb68e" }
CreateGrant

Quando você usa uma chave gerenciada pelo cliente para proteger sua tabela do Amazon Keyspaces, o Amazon Keyspaces usa concessões para permitir que o serviço execute a proteção de dados e tarefas de manutenção e durabilidade contínuas. Essas concessões não são necessárias em Chaves pertencentes à AWS.

As concessões que o Amazon Keyspaces cria são específicas a uma tabela. A entidade principal na solicitação CreateGrant é o usuário que criou a tabela.

O evento que registra a operação CreateGrant é semelhante ao evento de exemplo a seguir. Os parâmetros incluem o nome de recurso da Amazon (ARN) da chave gerenciada pelo cliente para a tabela, a entidade principal favorecida e a entidade principal que está sendo retirada (o serviço do Amazon Keyspaces) e as operações que a concessão abrange. Inclui também uma restrição que requer que todas as operações de criptografia usem o contexto de criptografia.

{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AIDAZ3FNIIVIZZ6H7CFQG", "arn": "arn:aws:iam::arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111:user/admin", "accountId": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "userName": "admin", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-04-16T04:55:42Z" } }, "invokedBy": "AWS Internal" }, "eventTime": "2021-04-16T05:11:10Z", "eventSource": "kms.amazonaws.com", "eventName": "CreateGrant", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "keyId": "a7d328af-215e-4661-9a69-88c858909f20", "operations": [ "DescribeKey", "GenerateDataKey", "Decrypt", "Encrypt", "ReEncryptFrom", "ReEncryptTo", "RetireGrant" ], "constraints": { "encryptionContextSubset": { "aws:cassandra:keyspaceName": "my_keyspace", "aws:cassandra:tableName": "my_table", "aws:cassandra:subscriberId": "123SAMPLE012" } }, "retiringPrincipal": "cassandratest.us-east-1.amazonaws.com", "granteePrincipal": "cassandratest.us-east-1.amazonaws.com" }, "responseElements": { "grantId": "18e4235f1b07f289762a31a1886cb5efd225f069280d4f76cd83b9b9b5501013" }, "requestID": "b379a767-1f9b-48c3-b731-fb23e865e7f7", "eventID": "29ee1fd4-28f2-416f-a419-551910d20291", "readOnly": false, "resources": [ { "accountId": "123SAMPLE012", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111" } ], "eventType": "AwsApiCall", "managementEvent": true, "eventCategory": "Management", "recipientAccountId": "123SAMPLE012" }