AWS KMS
Tags: aws, devops, cloud, security
Published: 2023-05-19 14:33:41

**Anotações sobre o AWS KMS para ajudar na preparação das certificações AWS.**

Até o momento as anotações são para as certificações abaixo:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/se0sqtegn424nami6rz8.png)

- [Link oficial](https://aws.amazon.com/pt/kms/)
- [FAQ](https://aws.amazon.com/pt/kms/faqs/)


---

##**Definição do fornecedor**
_O AWS Key Management Service (KMS) oferece a você controle centralizado das Keys criptográficas usadas para proteger seus dados._

---
##**Anotações gerais**

- **Usa Envelope Encryption**
- Com **Admin **é possível acessar arquivos criptografados
- É Regional
- Pode trazer sua própria Key
- Pode habilitar o uso da Key em outras contas durante a criação
- 265-bit
- Free Tier 20.000 solicitações
- **FIPS 140–2**
- Suporte Keys assimétricas e assinatura digital
- **Sempre DESABILITAR a key**
- Pode ser acessado através de VPC EndPoint
- **Sign API** - Para criar assinatura digital
- **KMS Key --> Key Meta-Data + Key Material**
- Por padrão o Key Material é AWS KMS
- CMK (Customer Master Key) - SSE-KMS 
- `GenerateDataKeyWithoutPlaintext `- API deve retornar apenas a cópia criptografada da chave de dados que será usada posteriormente para criptografia

---

##**Principais diferenças SSE Keys**
<u>SSE-KMS</u>
- Gerenciada pela AWS
- Rotação automática de chaves
- Fornecem uma trilha de auditoria que mostre quando foi usada e por quem
<u>SSE-S3</u>
- Rotação automática de chaves
<u>SSE-C</u>
- Gerenciada pelo cliente
- Rotação automática de chaves
- Se você perder a chave de criptografia, perderá todos os objetos criptografados por essa chave.

---
##**Envelope Encryption(Criptografia de Envelope)**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/wellarchitected/latest/financial-services-industry-lens/use-envelope-encryption-with-customer-master-keys.html)

- É um processo em que você criptografa dados de texto sem formatação com uma chave de dados e, em seguida, criptografa a chave de dados com uma chave mestra de texto **sem formatação** de nível superior.
- `aws kms generate-data-key` - Comando para criptografar
- `aws ksm encrypt` - Não funciona na criptografia de envelope
- O KMS (_CMK (Customer Master Key)_) suporta **o envio de dados com menos de 4KB para serem criptografados**, a criptografia de envelope pode oferecer benefícios significativos de desempenho
- **Envelope encryption é um método otimizado para criptografar dados que usa duas Keys diferentes (_Master key and Data keys_)**

_Quando você criptografa seus dados, os dados são protegidos, mas é necessário proteger a Keys de criptografia. Uma estratégia é para criptografá-la. Envelope encryption é a prática de criptografar dados de texto simples com uma Keys de dados e criptografar a Keys de dados em outra Keys._


**A criptografia de envelope oferece vários benefícios:**
**Proteção de Keys de dados**

Quando você criptografa uma Keys de dados, não precisa se preocupar em armazenar a Keys de dados criptografada porque a Keys de dados é inerentemente protegida pela criptografia. A Keys de dados criptografada pode ser armazenada com segurança junto com os dados criptografados.

**Criptografar os mesmos dados com várias Keys**

As operações de criptografia podem ser demoradas, especialmente quando os dados que estão sendo criptografados são objetos grandes. Em vez de recriptografar dados brutos várias vezes com diferentes Keys, você pode recriptografar somente as Keys de dados que protegem os dados brutos.

**Combinação de pontos fortes de vários algoritmos**

Em geral, os algoritmos de Keys simétrica são mais rápidos e geram textos cifrados menores do que os algoritmos de Keys pública. No entanto, os algoritmos de Keys pública fornecem separação inerente de funções e gerenciamento de Keys mais fácil. A criptografia de envelope permite associar os pontos fortes de cada estratégia.


Você pode até mesmo criptografar a Keys de criptografia dos dados em outra Keys de criptografia e criptografar essa Keys de criptografia em outra Keys de criptografia. Mas em algum momento deverá manter uma Keys em texto simples para que possa descriptografar as Keys e seus dados. Essa Keys de criptografia em texto simples de nível superior é chamada de chKeys ve raiz.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o15gfy3n7ab9e09ajqf3.png)

O AWS KMS ajuda você a proteger suas Keys de criptografia armazenando-as e gerenciando-as com segurança. As Keys-raiz armazenadas no AWS KMS, conhecidas como AWS KMS keys, nunca saem descriptografadas dos módulos de segurança de hardware validados para FIPS do AWS KMS. Para usar uma Keys do KMS, é necessário chamar o AWS KMS.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2kiet9l4vozdnr720tm9.png)


**Referências**
- [Envelope encryption](https://jayendrapatil.com/aws-key-management-service-kms/#Envelope_encryption)

---
##**Key Policies**
[Documentação oficial](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default)

_Uma Key policies é uma policy de recursos para uma AWS KMS Key. _

- As Key policies são a principal forma de controlar o acesso às KMS Key. 
- **Os elementos Effect e Principal não se referem à conta de usuário root da AWS**
- **Cada KMS Key deve ter exatamente uma Key policies.**
- As instruções na Key policies determinam quem tem permissão para usar a KMS Key e como eles podem usá-la. 
- Você também pode usar IAM Policies e Grants para controlar o acesso à KMS Keys, mas cada KMS Key deve ter uma Key policies.
- Nenhum AWS Principal, incluindo o usuário root da conta ou o criador da key, tem permissões para uma KMS Key, a menos que seja explicitamente permitido e nunca negado em uma Key policies, IAM Police ou Grant.


---
##**Data Key Caching**
[Documentação oficial](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/data-key-caching.html)

_Data key caching de dados armazena data keys e o material criptográfico relacionado em um cache. Ao criptografar ou descriptografar dados, o AWS Encryption SDK procura uma chave de dados correspondente no cache. Se encontrar uma correspondência, ele usará a cached data key em vez de gerar uma nova._ 

- Melhorar o desempenho
- **Reduzir os custos**
- Pode reutilizar chaves de dados.
- Ele gera várias chaves de dados.
- Suas operações criptográficas são inaceitavelmente lentas, caras, limitadas ou consomem muitos recursos.


---
##**KMS em Sistemas distribuídos**
[Documentação oficial](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)

- Usa `API GenarateDataKeyWitouyPlaintext` para gerar as key
- `API Decrypt` é usada para descriptografar o dado


**Referências**

- [GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)


---
##**Controle de acesso baseado em recursos**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/control-access.html)

- Key policies
- Grants

- O AWS KMS exige que você anexe políticas baseadas em recursos às Customer Master Keys (CMKs), chamadas de key policies

---
##**Key Administrator**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/key-policies.html#key-policy-default-allow-administrators)


---
##**Key Usage**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)


---
##**Symmetric vs Asymmetric**
[Documentação oficial](https://docs.aws.amazon.com/kms/latest/developerguide/key-types.html#symm-asymm-choose)

**Symmetric**
[Documentação oficial](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)

- Single 256 bit encryption
- Usado na CMK


**Asymmetric**
[Documentação oficial](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)

- Public and Private key
- **Utilizado em várias operações como: Sing-In, Encrypt e Decrypt**
- Key_Spec - RSA_2048, RSA_3072, RSA_4096

**Exemplo de Sing-In**

- `aws kms sign --key-id "key-id" --message fileb://demo.txt --signing-algorithm RSASSA_PKCS1_V1_5_SHA_256 --query Signature --output text | base64 -d > sign.txt`
 
- `aws kms verify --key-id "key-id" --message fileb://demo.txt --signature fileb://sign.txt --signing-algorithm RSASSA_PKCS1_V1_5_SHA_256`


**Referências**

- [AWS KMS CLI](https://docs.aws.amazon.com/cli/latest/reference/kms/index.html#cli-aws-kms)
- [Chaves assimétricas no AWS KMS](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/symmetric-asymmetric.html)
- [Special considerations for downloading public keys](https://docs.aws.amazon.com/kms/latest/developerguide/download-public-key.html#download-public-key-considerations)

---
##**Customer Managed vs AWS Managed**
**AWS Managed CMK**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/concepts.html#aws-managed-cmk)

_AWS Managed Keys são chaves do KMS na sua conta que são criadas, gerenciadas e utilizadas em seu nome por um produto da AWS integrado ao AWS KMS para proteger seus recursos nesse serviço._

- Used AWS Services
- Criado, gerenciado por um serviço AWS
- **Usuário não pode gerenciar, deletar**
- **Required. Every year (approximately 365 days)**
- **Não pode ser deletada**

**Customer Managed CMK**
[Documentação oficial](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)

_As chaves do KMS que você cria são customer managed keys. Customer managed keys são chaves do KMS em sua Conta da AWS que você cria, detém e gerencia. _

- **Optional. Every year (approximately 365 days)**
- **Você tem controle total sobre essas chaves do KMS.**
- Uma Customer Master Key (CMK) é uma representação lógica de uma chave mestra.
- É configurado durante a criação da Key, o Key Admin e o Key User
- O CMK inclui metadados, como Alias, ID da chave, Data de criação, Descrição e key state.
- **O CMK também contém o Key Material usado para criptografar e descriptografar dados.**
- **Eles são criados e gerenciados pelo cliente AWS.**
- O acesso a eles pode ser controlado usando o serviço AWS IAM.
- **Enable and Disable**
- **NUNCA PODE SER EXPORTADA**



**AWS Owned CMK**

- São uma coleção de CMKs que um serviço da AWS possui e gerencia para uso em várias contas da AWS.
- Não estão em sua conta da AWS.
- **Você não pode visualizar ou gerenciar esses CMKs.**
- Utilizado em múltiplas contas

**CloudHMS Keys**

- Keys generated from CloudHSM hardware device


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ni11c7o4e574ux6yioxn.png)




![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zt0gjryetemc7zhh1iet.png)


---
##**Schedule Key Deletion**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/deleting-keys.html)

- **Mínimo de 7 dias e Máximo de 30 (_Padrão_) para deletar a key**
- Vem habilitado por padrão
- Allow key administrators to delete this key.
- **Você nunca deleta a key diretamente, sempre é agendado.**
- **Quando a key está no processo de agendamento para deletar não é possível criptografar ou descriptografar **
- **Apenas é possível agendar a exclusão de uma chave gerenciada pelo cliente. **
- **Não é possível excluir Chaves gerenciadas pela AWS ou Chaves pertencentes à AWS.**
- **O AWS KMS nunca exclui suas chaves do KMS, a menos que você as programe explicitamente para exclusão e o período de espera obrigatório expire.**
- **Caso não tenha certeza, desabilite a chave do KMS em vez de excluí-la. Você poderá reabilitar a chave do KMS desabilitada se precisar usá-la mais tarde, mas não poderá recuperar aquela que foi excluída.**

**Referências**
[Habilitar e desabilitar Keys](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/enabling-keys.html)

---
##**Conectar-se ao AWS KMS por meio de um endpoint da VPC**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/kms-vpc-endpoint.html)


---
##**Criar um alarme que detecte o uso de uma chave do KMS com exclusão pendente**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/deleting-keys-creating-cloudwatch-alarm.html)


---
##**Excluir AWS KMS keys**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/deleting-keys.html)

---
##**Serviços integrados**
[Documentação oficial](https://aws.amazon.com/pt/kms/features/#AWS_Service_Integration)

- EBS, RDS, EFS, S3, Redshift


---
##**Determinar a utilização anterior de uma chave do KMS**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/deleting-keys-determining-usage.html)

- Examinar as permissões da chave do KMS para determinar o escopo da utilização em potencial
- Examinar os logs do AWS CloudTrail para determinar a utilização real

---
##**Como o Amazon Redshift usa o AWS KMS**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/services-redshift.html)

**Sequência de criptografia**

1. The Master Key encrypt the Cluster Key
2. The Cluster Key encrypts the database key
3. The database key encrypts the data encryption keys


---
##**Cross Account Access**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/key-policy-modifying-external-accounts.html)

---
##**Policy Conditions - ViaService**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/policy-conditions.html)
**kms: viaservice**

_A Condition `kms:ViaService` limita o uso de uma AWS KMS Key (chave do KMS) para solicitações provenientes **de serviços da AWS especificados**._

- **Allow ou Deny por serviço**
- A condição deve filtrar o sempre o serviço, por exemplo EC2 ou RDS


**Exemplo de Allow**

```
{
  "**Effect": "Allow"**,
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:user/ExampleUser"
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:CreateGrant",
    "kms:ListGrants",
    "kms:DescribeKey"
  ],
  "Resource": "*",
**"Condition": {
    "StringEquals": {
      "kms:ViaService": [
        "ec2.us-west-2.amazonaws.com",
        "rds.us-west-2.amazonaws.com"**
      ]
    }
  }
}
```

**Exemplo de Deny**

```
{
  **"Effect": "Deny"**,
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:user/ExampleUser"
  },
  "Action": [
    "kms:Encrypt"    
  ],
  "Resource": "*",
*  **"Condition": {
    "StringEquals": {
      "kms:ViaService": [
          "lambda.us-west-2.amazonaws.com"**
      ]
    }
  }
}
```

---




---
##**AWS CLI para KMS**
**Encrypt**
[Documentação oficial](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kms/encrypt.html)

- `aws kms encrypt --key-id "key-id" --plaintext fileb://plaintext.txt`

**Decrypt**
[Documentação oficial](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kms/decrypt.html#examples)

- aws kms decrypt --ciphertext-blob "CiphertextBlob"
- **key-id só requerido quando é "_decriptado_" com CMK assimétrica**


---
##**VPC Endpoints**
[Documentação oficial](https://docs.aws.amazon.com/kms/latest/developerguide/kms-vpc-endpoint.html)

- **A comunicação PRIVADA com outros recursos da AWS ocorrem dentro da rede da AWS**
- Através da subnet privada



---
##**Best Pratices**
[Documentação oficial](https://d1.awsstatic.com/whitepapers/aws-kms-best-practices.pdf)

- Rotação com frequência (a cada 3 anos)
- AWS Managed, Customer Managed with imported key material
- AWS Managed Keys não podem ser deletadas

---
##**Multi-Regions**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/multi-region-keys-overview.html)

_O AWS KMS oferece suporte a chaves de várias regiões, que são AWS KMS keys em diferentes Regiões da AWS que podem ser usadas de maneira alternada, como se você tivesse a mesma chave em várias Regiões._

- **Pode habilitar e desabilitar Key Rotation sempre na Primary Key**
- **Pode agendar a deleção da Primary Key, mas ela só será deletada depois que as Replica Key forem deletadas**
- Keys multi-regiões são compatíveis com Client-Side Encryption  no AWS Encryption SDK, no AWS S3 Encryption Client e no AWS DynamoDB Encryption Client
- Para snapshosts na mesma região pode utilizar a mesma key ou uma diferente
- Para outras regiões não pode utilizar a mesma
- O AWS KMS oferece suporte a Keys multirregionais, que são Keys do AWS KMS em diferentes regiões da AWS que podem ser usadas de forma intercambiável, como se você tivesse a mesma Keys em várias regiões.
- As Keys de várias regiões têm o mesmo Key Material e ID de Keys, portanto, os dados podem ser criptografados em uma região da AWS e descriptografados em outra região da AWS sem recriptografar ou fazer uma chamada entre regiões para o AWS KMS.
- As Keys de várias regiões nunca saem do AWS KMS sem criptografia.
- As Keys de várias regiões não são globais e cada Keys de várias regiões precisa ser replicada e gerenciada de forma independente.

**Opções na criação da Key**

- Single-Region key
- Multi-Region key


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/myu6320058tvdo4i5uba.png)



**Referências**

- [Keys multirregiões do KMS](https://aws.amazon.com/pt/about-aws/whats-new/2021/06/kms-multi-region-keys/)
- [AWS KMS Multi Region | AWS KMS | Multi Region | Key Management Service | KMS Multi Region](https://www.youtube.com/watch?v=MBlVg8HijCw)
- [AWS Key Management Service: Multi-Region Keys | Amazon Web Services
](https://www.youtube.com/watch?v=igikgFCd48g)

---
##**KMS com Parameter Store**

Para executar qualquer operação em um secure string parameter, o Parameter Store deve ser capaz de usar o AWS KMS CMK especificado para a operação pretendida. 
A maioria das falhas do Parameter Store relacionadas a CMKs são causadas pelos seguintes problemas:

**As credenciais que um aplicativo está usando não têm permissão para executar a ação especificada na CMK** - Para corrigir esse erro, execute o aplicativo com credenciais diferentes ou revise o IAM ou a política de chave que está impedindo a operação.
- **A CMK não foi encontrada** - Isso geralmente acontece quando você usa um identificador incorreto para a CMK. 
- **A CMK não está habilitada** - quando isso ocorre, o Parameter Store retorna uma exceção InvalidKeyId com uma mensagem de erro detalhada do AWS KMS. Se o estado da CMK for Desativado, ative-o. Se for Importação Pendente, conclua o procedimento de importação. Se o estado da chave for Exclusão pendente, cancele a exclusão da chave ou use uma CMK diferente.

---
**AWS S3 c/ AWS KMS**
Deve ter permissão ao fazer upload ou download de um objeto no S3 criptografado com uma chave AWS KMS

- kms:Decrypt
- kms:Encrypt
- kms:ReEncrypt*
- kms:GenerateDataKey*
- kms:DescribeKey

---
##**Como proteger a integridade de seus dados criptografados usando o AWS Key Management Service e o EncryptionContext**
[Documentação oficial](https://aws.amazon.com/pt/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/)

Em sua essência, EncryptionContext é um mapa de chave-valor (ambas as strings) fornecido ao KMS com cada solicitação de criptografia e descriptografia. Os mapas na criptografia e na descriptografia devem corresponder ou a solicitação de descriptografia falhará.

O EncryptionContext oferece três benefícios:

- Dados adicionais autenticados (AAD)
- Trilha de auditoria
- Contexto de autorização


---
##**Referências**
- [AWS Security](https://www.youtube.com/playlist?list=PLR5Btp19bh09wbaZhQ-U9w2mds9SdV6W9)
- [Como proteger seus dados com AWS KMS](https://www.youtube.com/watch?v=GVk8jAYro0Y)
- [Como AWS KMS ajuda a proteger seu conteúdo](https://www.youtube.com/watch?v=jfJavBwYMdQ)
- [Conceitos do AWS KMS](https://docs.aws.amazon.com/pt_br/kms/latest/developerguide/concepts.html)
- [AWS Key Management Service – KMS](https://jayendrapatil.com/tag/kms-key-material/)
- [What is AWS Key Management Service? | Amazon Web Services](https://www.youtube.com/watch?v=8Z0wsE2HoSo)
- [Getting Started with AWS Key Management Service](https://www.youtube.com/watch?v=-5MPXHvKDnc&t=2s)
- **https://docs.aws.amazon.com/kms/latest/developerguide/getting-started.html**
- [Conceitos de Segurança na AWS](https://guilhermeteles.com.br/conceitos-de-seguranca-na-aws/)
- [TutorialsDojo - AWS Key Management Service (AWS KMS)](https://tutorialsdojo.com/aws-key-management-service-aws-kms/)