Como o Amazon DynamoDB usa o AWS KMS - AWS Key Management Service

Como o Amazon DynamoDB usa o AWS KMS

O Amazon DynamoDB é um serviço de banco de dados NoSQL totalmente gerenciado e escalável. O DynamoDB integra-se ao AWS Key Management Service (AWS KMS) para comportar o recurso opcional de criptografia em repouso no lado do servidor.

Com a criptografia em repouso, o DynamoDB criptografa de forma transparente todos os dados do cliente em uma tabela do DynamoDB, incluindo sua chave primária e índices secundários locais e globais, sempre que a tabela é mantida no disco. (Se sua tabela tem uma chave de classificação, algumas dessas chaves que marcam os limites de intervalo são armazenadas em textos simples nos metadados da tabela.) Quando você acessa uma tabela criptografada, o DynamoDB descriptografa os dados da tabela de maneira transparente. Você não precisa alterar suas aplicações para usar ou gerenciar tabelas criptografadas.

A criptografia em repouso protege o DynamoDB Streams, tabelas globais e backups sempre que esses objetos são salvos em uma mídia durável. As instruções sobre tabelas neste tópico também se aplicam a esses objetos.

Todas as tabelas do DynamoDB são criptografadas. Não há opção para habilitar ou desabilitar a criptografia para tabelas novas ou existentes. Por padrão, todas as tabelas são criptografadas sob uma Chave pertencente à AWS na conta de serviço do DynamoDB. No entanto, é possível selecionar uma opção para criptografar algumas ou todas as tabelas em uma chave gerenciada pelo cliente ou na Chave gerenciada pela AWS para o DynamoDB na sua conta.

nota

Antes de novembro de 2018, a criptografia em repouso era um recurso opcional compatível apenas com a Chave gerenciada pela AWS para o DynamoDB. Se você habilitou a criptografia em repouso para qualquer uma das tabelas do DynamoDB, elas continuarão a ser criptografadas na Chave gerenciada pela AWS, a menos que você use o AWS Management Console ou a operação UpdateTable para alternar para uma chave gerenciada pelo cliente ou uma Chave pertencente à AWS.

Criptografia no lado do cliente para o DynamoDB

Além de criptografia em repouso, que é um recurso de criptografia no lado do servidor, a AWS fornece o Amazon DynamoDB Encryption Client. Essa biblioteca de criptografia do lado do cliente permite que você proteja seus dados antes de tabela antes de os enviar ao DynamoDB. Com a criptografia no lado do servidor, o TLS criptografa seus dados em trânsito em uma conexão HTTPS. Seus dados são descriptografados no endpoint do DynamoDB e, em seguida, criptografados novamente antes de serem armazenados no DynamoDB. A criptografia do lado do cliente fornece proteção ponta a ponta para seus dados, desde sua origem até o armazenamento no DynamoDB e de volta para você.

Você pode usar o DynamoDB Encryption Client com a criptografia em repouso. Para ajudar a determinar se essa estratégia é ideal para os seus dados do DynamoDB, consulte Criptografia do lado do cliente ou do lado do servidor? no Guia do desenvolvedor do Amazon DynamoDB Encryption Client.

Usar chaves do KMS e chaves de dados

O recurso de criptografia em repouso do DynamoDB usa uma AWS KMS key e uma hierarquia de chaves de dados para proteger os dados da sua tabela. O DynamoDB usa a mesma hierarquia de chaves para proteger fluxos do DynamoDB, tabelas globais e backups quando eles são gravados em mídia durável.

AWS KMS key

A criptografia em repouso protege suas tabelas do DynamoDB em uma AWS KMS key. Por padrão, o DynamoDB usa uma Chave pertencente à AWS, uma chave multilocatário que é criada e gerenciada em uma conta de serviço do DynamoDB. Porém, você pode criptografar suas tabelas do DynamoDB em uma chave gerenciada pelo cliente ou na Chave gerenciada pela AWS para o DynamoDB (aws/dynamodb) na sua conta do Conta da AWS. Você pode selecionar uma chave do KMS diferente para cada tabela. A chave do KMS selecionada para uma tabela também é usada para criptografar índices secundários locais e globais, fluxos e backups.

Você seleciona a chave do KMS para uma tabela ao criar ou atualizar essa tabela. É possível alterar a chave do KMS de uma tabela a qualquer momento, seja no console do DynamoDB ou usando a operação UpdateTable. O processo de alternar chaves é transparente e não exige tempo de inatividade ou serviço de degradação.

Importante

O DynamoDB oferece suporte somente para chaves do KMS simétricas. Não é possível usar uma chave do KMS assimétrica para criptografar tabelas do DynamoDB. Para obter ajuda para determinar se uma chave do KMS é simétrica ou assimétrica, consulte Identificar chaves do KMS assimétricas.

Use uma chave gerenciada pelo cliente para obter os seguintes recursos:

Use a Chave gerenciada pela AWS se precisar de qualquer um dos seguintes recursos:

No entanto, a Chave pertencente à AWS é gratuita e seu uso não conta para cotas de solicitações ou de recursos do AWS KMS. As chaves gerenciadas pelo cliente e as Chaves gerenciadas pela AWS geram uma cobrança para cada chamada de API, e as cotas do AWS KMS são aplicáveis a essas chaves do KMS.

Chaves de tabela

O DynamoDB usa a chave do KMS para a tabela para gerar e criptografar uma chave de dados exclusiva para a tabela, conhecida como chave de tabela. A chave de tabela é mantida durante a vida útil da tabela criptografada.

A chave de tabela é usada como uma chave de criptografia de chaves. O DynamoDB usa essa chave de tabela para proteger as chaves de criptografia dos dados usadas para criptografar os dados da tabela. O DynamoDB gera uma chave de criptografia dos dados exclusiva para cada estrutura subjacente em uma tabela, mas vários itens de tabela podem ser protegidos com a mesma chave de criptografia dos dados.


              Criptografar uma tabela do DynamoDB com criptografia em repouso

Quando você acessa uma tabela criptografada pela primeira vez, o DynamoDB envia uma solicitação para o AWS KMS usar a chave do KMS para descriptografar a chave de tabela. Ele usa a chave de tabela de texto simples para descriptografar as chaves de criptografia dos dados e usa as chaves de criptografia dos dados de texto simples para descriptografar os dados da tabela.

O DynamoDB armazena e usa a chave de tabelas e as chaves de criptografia dos dados fora do AWS KMS. Ele protege todas as chaves com a criptografia Advanced Encryption Standard (AES) e chaves de criptografia de 256 bits. Armazena as chaves criptografadas com os dados criptografados para que estejam disponíveis para descriptografar os dados da tabela sob demanda.

Se você alterar a chave do KMS da tabela, o DynamoDB gerará uma nova chave de tabela. Ele usará a nova chave de tabela para criptografar novamente as chaves de criptografia dos dados.

Armazenamento em cache de chaves de tabela

Para evitar chamar o AWS KMS para cada operação do DynamoDB, o DynamoDB armazena chaves de tabela em texto simples para cada conexão na memória. Quando o DynamoDB recebe uma solicitação para a chave de tabela armazenada em cache após cinco minutos de inatividade, ele envia uma nova solicitação ao AWS KMS para descriptografar a chave de tabela. Essa chamada capturará todas as alterações feitas nas políticas de acesso da chave do KMS no AWS KMS ou no AWS Identity and Access Management (IAM) desde a última solicitação para descriptografar a chave de tabela.

Autorizar o uso da sua chave do KMS

Se você usar uma chave gerenciada pelo cliente ou a Chave gerenciada pela AWS na sua conta para proteger a tabela do DynamoDB, as políticas nessa chave do KMS deverão conceder ao DynamoDB permissão para usá-la em seu nome. O contexto de autorização na Chave gerenciada pela AWS para o DynamoDB inclui sua política de chaves e concessões que delegam permissões para usá-la.

Você tem controle total sobre as políticas e concessões em uma chave gerenciada pelo cliente. Como a Chave gerenciada pela AWS está na sua conta, você pode visualizar suas políticas e concessões. Porém, como ela é gerenciada pela AWS, você não pode alterar as políticas.

O DynamoDB não precisa de autorização adicional para usar a Chave pertencente à AWS padrão para proteger as tabelas do DynamoDB na sua Conta da AWS.

Política de chaves para uma Chave gerenciada pela AWS

Quando o DynamoDB usa a Chave gerenciada pela AWS para o DynamoDB (aws/dynamodb) em operações de criptografia, ele faz isso em nome do usuário que está acessando o recurso do DynamoDB. A política de chaves na Chave gerenciada pela AWS concede a todos os usuários na conta permissão para usar a Chave gerenciada pela AWS para operações especificadas. Porém, a permissão é concedida somente quando o DynamoDB faz a solicitação em nome do usuário. A condição ViaService na política de chaves não permite que nenhum usuário use a Chave gerenciada pela AWS, a menos que a solicitação seja proveniente do serviço DynamoDB.

Essa política de chaves, como as políticas de todas as Chaves gerenciadas pela AWS, é estabelecida pela AWS. Você não pode alterá-la, mas pode visualizá-la a qualquer momento. Para obter mais detalhes, consulte Visualizar uma política de chaves.

As declarações de política na política de chaves têm os seguintes efeitos:

  • Permita que os usuários na conta usem a Chave gerenciada pela AWS para o DynamoDB em operações de criptografia somente quando essa solicitação for proveniente do DynamoDB em seu nome. A política também permite que os usuários criem concessões para a chave do KMS.

  • Permite identidades autorizadas do IAM na conta visualizem as propriedades da Chave gerenciada pela AWS para o DynamoDB e revoguem a concessão que permite ao DynamoDB usar a chave do KMS. O DynamoDB usa concessões para operações de manutenção em andamento.

  • Permite que o DynamoDB execute operações somente leitura para encontrar a Chave gerenciada pela AWS para o DynamoDB na sua conta.

{ "Version" : "2012-10-17", "Id" : "auto-dynamodb-1", "Statement" : [ { "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB", "Effect" : "Allow", "Principal" : { "AWS" : "*" }, "Action" : [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ], "Resource" : "*", "Condition" : { "StringEquals" : { "kms:CallerAccount" : "111122223333", "kms:ViaService" : "dynamodb.us-west-2.amazonaws.com" } } }, { "Sid" : "Allow direct access to key metadata to the account", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111122223333:root" }, "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource" : "*" }, { "Sid" : "Allow DynamoDB Service with service principal name dynamodb.amazonaws.com to describe the key directly", "Effect" : "Allow", "Principal" : { "Service" : "dynamodb.amazonaws.com" }, "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*" ], "Resource" : "*" } ] }

Política de chaves para uma chave gerenciada pelo cliente

Ao escolher uma chave gerenciada pelo cliente para proteger uma tabela do DynamoDB, o DynamoDB obtém permissão para usar a chave do KMS em nome da entidade principal que faz a seleção. Essa entidade principal, um usuário ou uma função, deve ter as permissões em uma chave do KMS exigida pelo DynamoDB. É possível fornecer essas permissões em uma política de chaves, em uma política do IAM ou em uma concessão.

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

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

  • Permite que o DynamoDB use a chave do KMS em operações de criptografia e crie concessões, mas somente quando está atuando em nome de entidades principais na conta que tem permissão para usar o DynamoDB. Se as entidades principais especificadas na instrução de política não tiverem permissão para usar o DynamoDB, a chamada falhará, mesmo se vier do serviço do DynamoDB.

  • A chave de condição kms:ViaService concede as permissões somente quando a solicitação é proveniente do DynamoDB em nome das entidades principais listadas na instrução da política. Esses principais não podem chamar essas operações diretamente. Observe que o valor de kms:ViaService,dynamodb.*.amazonaws.com, tem um asterisco (*) na posição da região. O DynamoDB requer a permissão para ser independente de qualquer Região da AWS particular, para que ele possa fazer chamadas entre regiões como suporte a tabelas globais do DynamoDB.

  • Concede aos administradores da chave do KMS (usuários que podem assumir a função db-team) acesso somente leitura à chave do KMS e permissão para revogar concessões, incluindo as concessões exigidas pelo DynamoDB para proteger a tabela.

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

{ "Id": "key-policy-dynamodb", "Version":"2012-10-17", "Statement": [ { "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB", "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" : "dynamodb.*.amazonaws.com" } } }, { "Sid": "Allow administrators to view the KMS 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": "*" } ] }

Usar concessões para autorizar o DynamoDB

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

O DynamoDB 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 incluir várias tabelas criptografadas na mesma chave do KMS, haverá uma concessão de cada tipo para cada tabela. A concessão é restrita pelo contexto de criptografia do DynamoDB, que inclui o nome da tabela e o ID da Conta da AWS, bem como a permissão para retirar a concessão caso ela não seja mais necessária.

Para criar as concessões, o DynamoDB deve ter permissão para chamar CreateGrant em nome do usuário que criou a tabela criptografada. Para Chaves gerenciadas pela AWS, o DynamoDB recebe a permissão kms:CreateGrant da política de chaves, o que permite que os usuários da conta chamem CreateGrant na chave do KMS somente quando o DynamoDB faz a solicitação em nome de um usuário autorizado.

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

Contexto de criptografia do DynamoDB

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 DynamoDB usa o mesmo contexto de criptografia em todas as operações de criptografia do AWS KMS. Se você usar uma chave gerenciada pelo cliente ou uma Chave gerenciada pela AWS para proteger a tabela do DynamoDB, poderá usar o contexto de criptografia para identificar o uso da chave do KMS em logs e registros de auditoria. Ele também aparece em texto simples em logs, como o AWS CloudTrail e o Amazon CloudWatch Logs.

O contexto de criptografia também pode ser usado como uma condição para autorização em políticas e concessões. O DynamoDB usa o contexto de criptografia para restringir as concessões que permitem acesso à chave gerenciada pelo cliente ou à Chave gerenciada pela AWS na sua conta e região.

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

"encryptionContextSubset": { "aws:dynamodb:tableName": "Books" "aws:dynamodb:subscriberId": "111122223333" }
  • Tabela – O primeiro par de chave-valor identifica a tabela que o DynamoDB está criptografando. A chave é aws:dynamodb:tableName. O valor é o nome da tabela.

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

    Por exemplo:

    "aws:dynamodb:tableName": "Books"
  • Conta – O segundo par de chave-valor identifica a Conta da AWS. A chave é aws:dynamodb:subscriberId. O valor é o ID de conta.

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

    Por exemplo:

    "aws:dynamodb:subscriberId": "111122223333"

Monitoramento da interação do DynamoDB com o AWS KMS

Se você usa uma chave gerenciada pelo cliente ou uma Chave gerenciada pela AWS para proteger suas tabelas do DynamoDB, você poderá usar logs do AWS CloudTrail para rastrear as solicitações que o DynamoDB envia ao AWS KMS em seu nome.

As solicitações GenerateDataKey, Decrypt e CreateGrant são discutidas nesta seção. Além disso, o DynamoDB usa uma operação DescribeKey para determinar se a chave do KMS escolhida existe na conta e na região. Usa também uma operação RetireGrant para remover uma concessão quando você exclui uma tabela.

GenerateDataKey

Quando você habilita a criptografia em repouso em uma tabela, o DynamoDB cria uma chave de tabela exclusiva. 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 DynamoDB. Os parâmetros incluem o Amazon Resource Name (ARN) da chave do KMS, 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.05", "userIdentity": { "type": "AWSService", "invokedBy": "dynamodb.amazonaws.com" }, "eventTime": "2018-02-14T00:15:17Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-west-2", "sourceIPAddress": "dynamodb.amazonaws.com", "userAgent": "dynamodb.amazonaws.com", "requestParameters": { "encryptionContext": { "aws:dynamodb:tableName": "Services", "aws:dynamodb:subscriberId": "111122223333" }, "keySpec": "AES_256", "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, "responseElements": null, "requestID": "229386c1-111c-11e8-9e21-c11ed5a52190", "eventID": "e3c436e9-ebca-494e-9457-8123a1f5e979", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333", "sharedEventID": "bf915fa6-6ceb-4659-8912-e36b69846aad" }
Decrypt

Quando você acessa uma tabela criptografada do DynamoDB, o DynamoDB 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 da tabela. O DynamoDB envia uma solicitação Decrypt solicitação ao AWS KMS que especifica a chave do 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 do KMS do texto cifrado.

{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-02-14T16:42:15Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAIGDT3HGFQZX4RY6RU", "arn": "arn:aws:iam::111122223333:role/Admin", "accountId": "111122223333", "userName": "Admin" } }, "invokedBy": "dynamodb.amazonaws.com" }, "eventTime": "2018-02-14T16:42:39Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "dynamodb.amazonaws.com", "userAgent": "dynamodb.amazonaws.com", "requestParameters": { "encryptionContext": { "aws:dynamodb:tableName": "Books", "aws:dynamodb:subscriberId": "111122223333" } }, "responseElements": null, "requestID": "11cab293-11a6-11e8-8386-13160d3e5db5", "eventID": "b7d16574-e887-4b5b-a064-bf92f8ec9ad3", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
CreateGrant

Quando você usa uma chave gerenciada pelo cliente ou uma Chave gerenciada pela AWS para proteger sua tabela do DynamoDB, o DynamoDB 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 DynamoDB cria são específicas de uma tabela. O 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 Amazon Resource Name (ARN) da chave do KMS para a tabela, a entidade principal favorecida e a entidade principal que está sendo retirada (o serviço DynamoDB) e as operações que a concessão abrange. Incluem também uma restrição que requer que todas as operações de criptografia usem o contexto de criptografia.

{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-02-14T00:12:02Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE", "arn": "arn:aws:iam::111122223333:role/Admin", "accountId": "111122223333", "userName": "Admin" } }, "invokedBy": "dynamodb.amazonaws.com" }, "eventTime": "2018-02-14T00:15:15Z", "eventSource": "kms.amazonaws.com", "eventName": "CreateGrant", "awsRegion": "us-west-2", "sourceIPAddress": "dynamodb.amazonaws.com", "userAgent": "dynamodb.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "retiringPrincipal": "dynamodb.us-west-2.amazonaws.com", "constraints": { "encryptionContextSubset": { "aws:dynamodb:tableName": "Books", "aws:dynamodb:subscriberId": "111122223333" } }, "granteePrincipal": "dynamodb.us-west-2.amazonaws.com", "operations": [ "DescribeKey", "GenerateDataKey", "Decrypt", "Encrypt", "ReEncryptFrom", "ReEncryptTo", "RetireGrant" ] }, "responseElements": { "grantId": "5c5cd4a3d68e65e77795f5ccc2516dff057308172b0cd107c85b5215c6e48bde" }, "requestID": "2192b82a-111c-11e8-a528-f398979205d8", "eventID": "a03d65c3-9fee-4111-9816-8bf96b73df01", "readOnly": false, "resources": [ { "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }