Back to Checks
iac

EBS volume encryption should use Customer Managed Keys

AWS-0027
Service: ec2Severity: low
OfficialBuilt-inVerified

Encryption using AWS keys provides protection for your EBS volume. To increase control of the encryption and manage factors like rotation use customer managed keys.

Run this check with Prowler

Run in Prowler Cloud
Run
prowler iac --checks AWS-0027

Recommendation

Enable encryption using customer managed keys

Check Code

# METADATA
# title: EBS volume encryption should use Customer Managed Keys
# description: |
#   Encryption using AWS keys provides protection for your EBS volume. To increase control of the encryption and manage factors like rotation use customer managed keys.
# scope: package
# schemas:
#   - input: schema["cloud"]
# related_resources:
#   - https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html
# custom:
#   id: AWS-0027
#   long_id: aws-ec2-volume-encryption-customer-key
#   aliases:
#     - AVD-AWS-0027
#     - volume-encryption-customer-key
#     - aws-ebs-encryption-customer-key
#     - aws-ec2-volume-encryption-customer-key
#   provider: aws
#   service: ec2
#   severity: LOW
#   recommended_action: Enable encryption using customer managed keys
#   input:
#     selector:
#       - type: cloud
#         subtypes:
#           - service: ec2
#             provider: aws
#   examples: checks/cloud/aws/ec2/encryption_customer_key.yaml
package builtin.aws.ec2.aws0027

import rego.v1

import data.lib.cloud.metadata
import data.lib.cloud.value

deny contains res if {
	some volume in input.aws.ec2.volumes
	isManaged(volume)
	without_cmk(volume)
	res := result.new(
		"EBS volume does not use a customer-managed KMS key.",
		metadata.obj_by_path(volume, ["encryption", "kmskeyid"]),
	)
}

without_cmk(volume) if value.is_empty(volume.encryption.kmskeyid)

without_cmk(volume) if not volume.encryption.kmskeyid