Dans cet article, nous allons créer la même CMK que dans l’article précédent, mais cette fois en Infrastructure as Code avec Terraform. L’avantage est de rendre la création reproductible, versionnée et automatisable.

Création d’une Customer Managed Key pour EBS
dans un fichier terraform par exemple appelé kms.tf, je crée mes clés (dans mon article je parle que de la clé pour EBS, mais pour chaque service on doit créer une clé)
resource "aws_kms_key" "vprisme-ebs" {
description = "EBS encryption key for EBS"
# Key policy controlling who can use and manage this key
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Sid = "EnableRootAccountFullAccess"
Effect = "Allow"
Principal = {
AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
}
Action = "kms:*"
Resource = "*"
},
# On peut ajouter des administrateurs de clé
{
Sid = "AllowAdmins"
Effect = "Allow"
Principal = {
AWS = var.key_admin_arns
}
Action = [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion"
]
Resource = "*"
},
# Ici on peut ajouter la liste des users qui vont utiliser la clé
{
Sid = "AllowUsers"
Effect = "Allow"
Principal = {
AWS = var.key_user_arns
}
Action = [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]
Resource = "*"
}
]
})
tags = {
Name = "vprisme-key"
}
}
resource "aws_kms_alias" "vprisme-ebs" {
name = "alias/vprisme-ebs"
target_key_id = aws_kms_key.vprism-ebs.key_id
}
J’applique le code terrafor
$ terraform init
$ terraform plan
$ terraform apply
$ terraform plan
$ terraform apply

En cherchant dans la console, je vois bien la clé

Je peux maintenant utiliser la clé pour crypter un nouveau volume par exemple
resource "aws_ebs_volume" "test-volume" {
availability_zone = "us-east-1a"
size = 22
type = "gp3"
encrypted = true
kms_key_id = aws_kms_key.vprisme-ebs.arn
tags = {
Name = "test-volume"
}
}
J’applique le code terraform
$ terraform init
$ terraform plan
$ terraform apply
$ terraform plan
$ terraform apply

En vérifiant dans la console, on trouvera bien un volume crypté avec notre clé créé
