Elasticsearch encryption with KMS disabled This product is not supported for your selected
Datadog site . (
).
Id: cloudformation-aws-elasticsearch-domain-encryption-with-kms-disabled
Provider: AWS
Platform: CloudFormation
Severity: High
Category: Encryption
Learn More Description Elasticsearch domains must use AWS KMS-backed encryption at rest to protect indexed data, snapshots, and backups from unauthorized access and to provide customer control and auditability of encryption keys.
In CloudFormation, the AWS::Elasticsearch::Domain resource must include the EncryptionAtRestOptions property with KmsKeyId defined and not null. Resources missing EncryptionAtRestOptions or with EncryptionAtRestOptions.KmsKeyId undefined will be flagged. The KmsKeyId value should reference a customer-managed AWS KMS key ARN or a Ref to an AWS::KMS::Key, rather than relying solely on the service default key.
Secure configuration example:
MyDomain :
Type : AWS::Elasticsearch::Domain
Properties :
DomainName : my-domain
EncryptionAtRestOptions :
Enabled : true
KmsKeyId : !Ref MyKmsKey
MyKmsKey :
Type : AWS::KMS::Key
Properties :
Description : KMS key for Elasticsearch encryption
Compliant Code Examples AWSTemplateFormatVersion : "2010-09-09"
Description : Creates RDS Cluster
Resources :
ElasticsearchDomain :
Type : AWS::Elasticsearch::Domain
Properties :
DomainName : "test"
ElasticsearchClusterConfig :
DedicatedMasterEnabled : "true"
InstanceCount : "2"
ZoneAwarenessEnabled : "true"
InstanceType : "m3.medium.elasticsearch"
DedicatedMasterType : "m3.medium.elasticsearch"
DedicatedMasterCount : "3"
EncryptionAtRestOptions :
Enabled : true
KmsKeyId : "some-kms-key-id"
EBSOptions :
EBSEnabled : true
Iops : 0
VolumeSize : 20
VolumeType : "gp2"
SnapshotOptions :
AutomatedSnapshotStartHour : "0"
AccessPolicies :
Version : "2012-10-17"
Statement :
-
Effect : "Allow"
Principal :
AWS : "arn:aws:iam::123456789012:user/es-user"
Action : "es:*"
Resource : "arn:aws:es:us-east-1:846973539254:domain/test/*"
AdvancedOptions :
rest.action.multi.allow_explicit_index : "true"
{
"Resources" : {
"ElasticsearchDomain" : {
"Type" : "AWS::Elasticsearch::Domain" ,
"Properties" : {
"AccessPolicies" : {
"Version" : "2012-10-17" ,
"Statement" : [
{
"Effect" : "Allow" ,
"Principal" : {
"AWS" : "arn:aws:iam::123456789012:user/es-user"
},
"Action" : "es:*" ,
"Resource" : "arn:aws:es:us-east-1:846973539254:domain/test/*"
}
]
},
"AdvancedOptions" : {
"rest.action.multi.allow_explicit_index" : "true"
},
"DomainName" : "test" ,
"ElasticsearchClusterConfig" : {
"DedicatedMasterCount" : "3" ,
"DedicatedMasterEnabled" : "true" ,
"InstanceCount" : "2" ,
"ZoneAwarenessEnabled" : "true" ,
"InstanceType" : "m3.medium.elasticsearch" ,
"DedicatedMasterType" : "m3.medium.elasticsearch"
},
"EncryptionAtRestOptions" : {
"Enabled" : true ,
"KmsKeyId" : "some-kms-key-id"
},
"EBSOptions" : {
"EBSEnabled" : true ,
"Iops" : 0 ,
"VolumeSize" : 20 ,
"VolumeType" : "gp2"
},
"SnapshotOptions" : {
"AutomatedSnapshotStartHour" : "0"
}
}
}
},
"AWSTemplateFormatVersion" : "2010-09-09" ,
"Description" : "Creates RDS Cluster"
}
Non-Compliant Code Examples AWSTemplateFormatVersion : "2010-09-09"
Description : Creates RDS Cluster
Resources :
ElasticsearchDomain :
Type : AWS::Elasticsearch::Domain
Properties :
DomainName : "test"
ElasticsearchClusterConfig :
DedicatedMasterEnabled : "true"
InstanceCount : "2"
ZoneAwarenessEnabled : "true"
InstanceType : "m3.medium.elasticsearch"
DedicatedMasterType : "m3.medium.elasticsearch"
DedicatedMasterCount : "3"
EncryptionAtRestOptions :
Enabled : true
EBSOptions :
EBSEnabled : true
Iops : 0
VolumeSize : 20
VolumeType : "gp2"
SnapshotOptions :
AutomatedSnapshotStartHour : "0"
AccessPolicies :
Version : "2012-10-17"
Statement :
-
Effect : "Allow"
Principal :
AWS : "arn:aws:iam::123456789012:user/es-user"
Action : "es:*"
Resource : "arn:aws:es:us-east-1:846973539254:domain/test/*"
AdvancedOptions :
rest.action.multi.allow_explicit_index : "true"
{
"Description" : "Creates RDS Cluster" ,
"Resources" : {
"ElasticsearchDomain" : {
"Type" : "AWS::Elasticsearch::Domain" ,
"Properties" : {
"EncryptionAtRestOptions" : {
"Enabled" : true
},
"EBSOptions" : {
"EBSEnabled" : true ,
"Iops" : 0 ,
"VolumeSize" : 20 ,
"VolumeType" : "gp2"
},
"SnapshotOptions" : {
"AutomatedSnapshotStartHour" : "0"
},
"AccessPolicies" : {
"Version" : "2012-10-17" ,
"Statement" : [
{
"Effect" : "Allow" ,
"Principal" : {
"AWS" : "arn:aws:iam::123456789012:user/es-user"
},
"Action" : "es:*" ,
"Resource" : "arn:aws:es:us-east-1:846973539254:domain/test/*"
}
]
},
"AdvancedOptions" : {
"rest.action.multi.allow_explicit_index" : "true"
},
"DomainName" : "test" ,
"ElasticsearchClusterConfig" : {
"DedicatedMasterType" : "m3.medium.elasticsearch" ,
"DedicatedMasterCount" : "3" ,
"DedicatedMasterEnabled" : "true" ,
"InstanceCount" : "2" ,
"ZoneAwarenessEnabled" : "true" ,
"InstanceType" : "m3.medium.elasticsearch"
}
}
}
},
"AWSTemplateFormatVersion" : "2010-09-09"
}
AWSTemplateFormatVersion : "2010-09-09"
Description : Creates RDS Cluster2
Resources :
ElasticsearchDomain :
Type : AWS::Elasticsearch::Domain
Properties :
DomainName : "test"
ElasticsearchClusterConfig :
DedicatedMasterEnabled : "true"
InstanceCount : "2"
ZoneAwarenessEnabled : "true"
InstanceType : "m3.medium.elasticsearch"
DedicatedMasterType : "m3.medium.elasticsearch"
DedicatedMasterCount : "3"
EBSOptions :
EBSEnabled : true
Iops : 0
VolumeSize : 20
VolumeType : "gp2"
SnapshotOptions :
AutomatedSnapshotStartHour : "0"
AccessPolicies :
Version : "2012-10-17"
Statement :
-
Effect : "Allow"
Principal :
AWS : "arn:aws:iam::123456789012:user/es-user"
Action : "es:*"
Resource : "arn:aws:es:us-east-1:846973539254:domain/test/*"
AdvancedOptions :
rest.action.multi.allow_explicit_index : "true"