Criptografia e descriptografia de segredos no AWS Secrets Manager - AWS Secrets Manager

Criptografia e descriptografia de segredos no AWS Secrets Manager

O Secrets Manager usa criptografia de envelope com chaves do AWS KMS e chaves de dados para proteger o valor de cada segredo. Sempre que o valor de um segredo muda, o Secrets Manager gera uma nova chave de dados para protegê-lo. A chave de dados é criptografada em uma chave do KMS e é armazenada nos metadados do segredo. Para descriptografar o segredo, o Secrets Manager primeiro descriptografa a chave de dados criptografada usando a chave do KMS no AWS KMS.

O Secrets Manager não usa a chave do KMS para criptografar o valor do segredo diretamente. Em vez disso, ele usa a chave do KMS para gerar e criptografar uma chave de dados simétrica de Padrão de criptografia avançada (AES) de 256 bits e usa a chave de dados para criptografar o valor do segredo. O Secrets Manager usa a chave de dados de texto simples para criptografar o valor do segredo fora do AWS KMS e, em seguida, a remove da memória. Ele armazena a cópia criptografada da chave de dados nos metadados do segredo.

Ao criar um segredo, é possível escolher qualquer chave simétrica de criptografia gerenciada pelo cliente na região e na Conta da AWSou usar a Chave gerenciada pela AWS para o Secrets Manager (aws/secretsmanager). No console, se você escolher o valor padrão para a chave de criptografia, o Secrets Manager criará a Chave gerenciada pela AWS aws/secretsmanager, se ainda não existir, e o associará ao segredo. É possível usar a mesma chave do KMS ou diferentes chaves do KMS para cada segredo na sua conta. O Secrets Manager só oferece suporte a chaves de criptografia simétricas do KMS.

Você pode alterar a chave de criptografia de um segredo no console, na AWS CLI ou em um SDK da AWS com UpdateSecret. Quando você altera a chave de criptografia, o Secrets Manager criptografa novamente versões do segredo que têm os rótulos de preparação AWSCURRENT, AWSPENDING e AWSPREVIOUS com a nova chave de criptografia. Quando o valor do segredo mudar, o Secrets Manager também o criptografará com a nova chave. Você pode usar a chave antiga ou a nova para descriptografar o segredo, quando recuperá-lo.

Para localizar a chave do KMS associada a um segredo, visualize o segredo no console ou chame ListSecrets ou DescribeSecret. Quando o segredo é associado à Chave gerenciada pela AWS do Secrets Manager (aws/secretsmanager), essas operações não retornam um identificador de chave do KMS.

Processos de criptografia e descriptografia

Para criptografar o valor de um segredo, o Secrets Manager usa o processo descrito a seguir.

  1. O Secrets Manager chama a operação GenerateDataKey do AWS KMS com o ID da chave do KMS do segredo e uma solicitação para uma chave simétrica AES de 256 bits. O AWS KMS gera uma chave de dados de texto simples e uma cópia desta chave de dados criptografada pela chave do KMS.

  2. O Secrets Manager usa a chave de dados de texto simples e o algoritmo Padrão de criptografia avançada (AES) para criptografar o valor do segredo fora do AWS KMS. Ele remove a chave de texto simples da memória o mais rápido possível após o uso.

  3. O Secrets Manager armazena a chave de dados criptografada nos metadados do segredo para que fique disponível para descriptografar o valor do segredo. No entanto, nenhuma das APIs do Secrets Manager retorna o segredo criptografado ou a chave de dados criptografada.

Para descriptografar um valor do segredo criptografado:

  1. O Secrets Manager chama a operação Decrypt do AWS KMS e passa a chave de dados criptografada.

  2. O AWS KMS usa a chave do KMS do segredo para descriptografar a chave de dados. Ele gera a chave de dados de texto simples.

  3. O Secrets Manager usa a chave de dados de texto simples para descriptografar o valor do segredo. Então, ele remove a chave de dados da memória o mais rápido possível.

Como o Secrets Manager usa a chave do KMS

O Secrets Manager usa a chave do KMS associada a um segredo para gerar uma chave de dados para o valor de cada segredo. O Secrets Manager também usa a chave do KMS para descriptografar essa chave de dados quando precisa descriptografar o valor do segredo criptografado. É possível rastrear as solicitações e respostas em eventos do AWS CloudTrail, no Amazon CloudWatch Logs e em trilhas de auditoria.

As seguintes operações do Secrets Manager acionam uma solicitação para usar a chave do KMS.

GenerateDataKey

O Secrets Manager chama a operação GenerateDataKey do AWS KMS em resposta às seguintes operações do Secrets Manager.

  • CreateSecret: se o novo segredo incluir um valor, o Secrets Manager solicitará uma nova chave de dados para criptografá-lo.

  • PutSecretValue: o Secrets Manager solicita uma nova chave de dados para criptografar o valor do segredo especificado.

  • UpdateSecret: se você alterar o valor do segredo ou a chave do KMS, o Secrets Manager solicitará uma nova chave de dados para criptografar o novo valor do segredo.

nota

A operação RotateSecret não chama GenerateDataKey, pois não altera o valor do segredo. No entanto, se a função Lambda que invoca RotateSecret mudar o valor do segredo, sua chamada para a operação PutSecretValue acionará uma solicitação GenerateDataKey.

Decrypt

Para descriptografar um valor de segredo criptografado, o Secrets Manager chama a operação Decrypt do AWS KMS para descriptografar a chave de dados criptografada do segredo. Ele usa a chave de dados de texto simples para descriptografar o valor do segredo criptografado.

O Secrets Manager chama a operação Decrypt em resposta às seguintes operações do Secrets Manager.

  • GetSecretValue: o Secrets Manager descriptografa o valor do segredo antes de retorná-lo ao autor da chamada.

  • PutSecretValue e UpdateSecret: a maioria das solicitações PutSecretValue e UpdateSecret não aciona uma operação Decrypt. No entanto, quando uma solicitação PutSecretValue ou UpdateSecret tenta alterar o valor do segredo em uma versão existente de um segredo, o Secrets Manager descriptografa o valor do segredo existente e o compara com o valor do segredo da solicitação para confirmar se são iguais. Essa ação garante que as operações do Secrets Manager sejam idempotentes.

Validar o acesso à chave do KMS

Ao estabelecer ou alterar a chave do KMS associada ao segredo, o Secrets Manager chama as operações GenerateDataKey e Decrypt com a chave do KMS especificada. Essas chamadas confirmam que o autor da chamada tem permissão para usar a chave do KMS para essas operações. O Secrets Manager descarta os resultados dessas operações; ele não os usa em qualquer operação de criptografia.

Você pode identificar essas chamadas de validação, pois o valor da chave SecretVersionId com contexto de criptografia nessas solicitações é RequestToValidateKeyAccess.

nota

No passado, as chamadas de validação do Secrets Manager não incluíam um contexto de criptografia. Você pode encontrar chamadas sem contexto de criptografia em logs do AWS CloudTrail mais antigos.

Permissões para a chave do KMS

Quando o Secrets Manager usa uma chave do KMS em operações de criptografia, ele atua em nome do usuário que está acessando ou atualizando o valor do segredo.

  • Para recuperar um segredo, o usuário deve ter a permissão kms:Decrypt concedida em uma política do IAM ou em uma política de chaves.

  • Para atualizar o segredo, o usuário deve ter ambas as permissõeskms:Decrypt e kms:GenerateDataKey concedidas em uma política do IAM ou em uma política de chaves.

Para permitir que a chave do KMS seja usada apenas para solicitações provenientes do Secrets Manager, use a chave de condição kms:ViaService com o valor secretsmanager.<Region>.amazonaws.com.

Também é possível usar as chaves ou valores no contexto de criptografia como condição para usar a chave do KMS em operações de criptografia. Por exemplo, você pode usar um operador de condição de string em um IAM ou documento de política de chaves ou usar uma restrição de concessão em uma concessão.

Política de chaves da Chave gerenciada pela AWS (aws/secretsmanager)

A política de chaves da Chave gerenciada pela AWS do Secrets Manager (aws/secretsmanager) concede aos usuários permissão para usar a chave do KMS para operações especificadas somente quando o Secrets Manager faz a solicitação em nome do usuário. A política de chaves não permite que qualquer usuário utilize a chave do KMS diretamente.

Essa política de chaves, como as políticas de todas as Chaves gerenciadas pela AWS, é estabelecida pelo serviço. Não é possível alterar a política de chaves, mas é possível 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 da conta usem a chave do KMS para operações de criptografia somente quando a solicitação for proveniete do Secrets Manager em seu nome. A chave de condição kms:ViaService impõe essa restrição.

  • Permite que a conta da AWS crie políticas do IAM que permitem que os usuários visualizem as propriedades da chave do KMS e revoguem concessões.

  • Embora o Secrets Manager não use concessões para obter acesso à chave do KMS, a política também permite que o Secrets Manager crie concessões para a chave do KMS em nome do usuário e permite que a conta revogue qualquer concessão que permite que o Secrets Manager use a chave do KMS. Esses são elementos padrão do documento de política de uma Chave gerenciada pela AWS.

Veja a seguir uma política de chaves para um exemplo de Chave gerenciada pela AWS do Secrets Manager.

{ "Version" : "2012-10-17", "Id" : "auto-secretsmanager-1", "Statement" : [ { "Sid" : "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS S ecrets Manager", "Effect" : "Allow", "Principal" : { "AWS" : "*" }, "Action" : [ "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:Describ eKey" ], "Resource" : "*", "Condition" : { "StringEquals" : { "kms:ViaService" : "secretsmanager.us-west-2.amazonaws.com", "kms:CallerAccount" : "111122223333" } } },{ "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" : "*" } ] }

Contexto de criptografia do Secrets Manager

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.

Nas solicitações GenerateDataKey e Decrypt para o AWS KMS, o Secrets Manager usa um contexto de criptografia com dois pares de nome e valor que identificam o segredo e sua versão, como mostrado no exemplo a seguir. Os nomes não variam, mas os valores de contexto de criptografia combinados serão diferentes para cada valor de segredo.

"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" }

É possível usar o contexto de criptografia para identificar essas operações de criptografia em logs e registros de auditoria, como AWS CloudTrail e o Amazon CloudWatch Logs, e como uma condição para a autorização em políticas e concessões.

O contexto de criptografia do Secrets Manager consiste em dois pares de nome e valor.

  • SecretARN: o primeiro par de nome e valor identifica o segredo. A chave é SecretARN. O valor é o nome de recurso da Amazon (ARN) do segredo.

    "SecretARN": "ARN of an Secrets Manager secret"

    Por exemplo, se o ARN do segredo fosse arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3, o contexto de criptografia incluiria o seguinte par.

    "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3"
  • SecretVersionId: o segundo par de nome e valor identifica a versão do segredo. A chave é SecretVersionId. O valor é o ID da versão.

    "SecretVersionId": "<version-id>"

    Por exemplo, se o ID de versão do segredo fosse EXAMPLE1-90ab-cdef-fedc-ba987SECRET1, o contexto de criptografia incluiria o seguinte par.

    "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1"

Quando você estabelece ou altera a chave do KMS de um segredo, o Secrets Manager envia solicitações GenerateDataKey e Decrypt para o AWS KMS para confirmar que o autor da chamada tem permissão para usar a chave do KMS para essas operações. Ele descarta as respostas; não as usa no valor do segredo.

Nessas solicitações de validação, o valor do SecretARN é o ARN real do segredo, mas o valor SecretVersionId é RequestToValidateKeyAccess, como mostrado no seguinte exemplo de contexto de criptografia. Esse valor especial ajuda você a identificar solicitações de validação em logs e trilhas de auditoria.

"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "RequestToValidateKeyAccess" }
nota

No passado, as solicitações de validação do Secrets Manager não incluíam um contexto de criptografia. Você pode encontrar chamadas sem contexto de criptografia em logs do AWS CloudTrail mais antigos.

Monitorar a interação do Secrets Manager com o AWS KMS

Você pode usar o AWS CloudTrail e o Amazon CloudWatch Logs para rastrear as solicitações que o Secrets Manager envia para o AWS KMS em seu nome. Para obter mais informações sobre o monitoramento do uso de segredos, consulte Monitorar segredos do AWS Secrets Manager.

GenerateDataKey

Quando você cria ou altera o valor de um segredo, o Secrets Manager envia uma solicitação GenerateDataKey ao AWS KMS que especifica a chave do KMS do segredo.

O evento que registra a operação GenerateDataKey é semelhante ao evento de exemplo a seguir. A solicitação foi invocada por secretsmanager.amazonaws.com. Os parâmetros incluem o nome do recurso da Amazon (ARN) da chave do KMS do segredo, um especificador de chaves que requer uma chave de 256 bits e o contexto de criptografia que identifica o segredo e a versão.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-05-31T23:23:41Z" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2018-05-31T23:23:41Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "keySpec": "AES_256", "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" } }, "responseElements": null, "requestID": "a7d4dd6f-6529-11e8-9881-67744a270888", "eventID": "af7476b6-62d7-42c2-bc02-5ce86c21ed36", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
Decrypt

Sempre que você obtém ou altera o valor de um segredo, o Secrets Manager envia uma solicitação Decrypt para o AWS KMS para descriptografar a chave de dados criptografada.

O evento que registra a operação Decrypt é semelhante ao evento de exemplo a seguir. O usuário é o principal em 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 obtém o ID da chave do KMS a partir do texto cifrado.

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-05-31T23:36:09Z" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2018-05-31T23:36:09Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" } }, "responseElements": null, "requestID": "658c6a08-652b-11e8-a6d4-ffee2046048a", "eventID": "f333ec5c-7fc1-46b1-b985-cbda13719611", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }