AWS SQS server side encryption is not enabled
ID |
sqs_server_unencrypted |
Severity |
high |
Vendor |
AWS |
Resource |
SQS |
Description
Amazon Simple Queue Service (SQS) provides the ability to encrypt queues so sensitive data is passed securely. It uses server-side encryption (SSE) and supports AWS-managed Customer Master Key (CMK), as well as self-created/self-managed keys (known as SQS.managed encryption keys). SSE encrypts only the body of the message, with queue metadata and message metadata out of scope, and logged messages not encrypted.
If you operate in a regulated market, such as HIPAA for healthcare, PCI DSS for finance, or FedRAMP for government, you need to ensure sensitive data messages passed in this service are encrypted at rest.
It is recommended to encrypt data queued using SQS. See Server-side encryption for SQS for more details.
Examples
CloudFormation
{
"Resources": {
"MySourceQueue": { (1)
"Type": "AWS::SQS::Queue",
"Properties": {
"RedrivePolicy": {
"deadLetterTargetArn": "example_arn",
"maxReceiveCount": 5
}
}
}
}
}
1 | Missing KmsMasterKeyId property means server side encryption is disabled. |
Resources:
MySourceQueue: (1)
Type: AWS::SQS::Queue
Properties:
RedrivePolicy:
deadLetterTargetArn: "example_arn"
maxReceiveCount: 5
1 | Missing KmsMasterKeyId property means server side encryption is disabled. |
Mitigation / Fix
Buildtime
CloudFormation
{
"Resources": {
"MySourceQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"RedrivePolicy": {
"deadLetterTargetArn": "example_arn",
"maxReceiveCount": 5
},
"KmsMasterKeyId": "kms_id" (1)
}
}
}
}
1 | KmsMasterKeyId set to true means server side encryption is enabled. |
Resources:
MySourceQueue:
Type: AWS::SQS::Queue
Properties:
RedrivePolicy:
deadLetterTargetArn: "example_arn"
maxReceiveCount: 5
KmsMasterKeyId: "kms_id" (1)
1 | KmsMasterKeyId set to true means server side encryption is enabled. |
Terraform
resource "aws_sqs_queue" "my_queue" {
name = "terraform-example-queue"
kms_master_key_id = "alias/aws/sqs"
kms_data_key_reuse_period_seconds = 300
}
Alternatively, set encryption with SQS-managed if you do not care about key management.
resource "aws_sqs_queue" "my_queue" {
name = "terraform-example-queue"
sqs_managed_sse_enabled = true
}