SQS の保管時の暗号化設定がデフォルトで SSE-SQS が設定されるようになりました

2022.10.06

いわさです。

Amazon SQS ではサーバーサイド暗号化の機能があり、AWS によって管理されている SSE-SQS や KMS で管理する SSE-KMS などを設定することが出来ました。

これまでは特に指定しなければ暗号化は有効化されないオプションという位置づけだったのですが、本日のアップデートでデフォルトで有効化されるようになりました。
有効化されるときに選択される暗号化キー種別は SSE-SQS です。

アップデート情報のとおりのそのままの軽微な内容ではありますが、CLI とか CloudFormation でもデフォルトなのか?というのを確認してみたので共有しますね。

マネジメントコンソール

マネジメントコンソールで新規の SQS キューを作成しようとすると以下のように初期状態で選択された状態になっていました。

なるほど。

AWS CLI

さて、AWS CLI だとどういう動きになるでしょうか。
以下のようにキュー名のみで暗号化設定は指定しません。

% aws --version
aws-cli/2.8.0 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off

% aws sqs create-queue --queue-name hoge1006queue --profile hoge 
{
    "QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789012/hoge1006queue"
}

特に CLI は SQS に関するアップデートはされていませんでしたが果たして。。。

おぉ、こちらも暗号化が有効化されていますね。
CloudTrail も少し眺めてみました。

{
    "eventVersion": "1.08",
    "userIdentity": {
:
    },
    "eventTime": "2022-10-06T00:35:16Z",
    "eventSource": "sqs.amazonaws.com",
    "eventName": "CreateQueue",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "203.0.113.1",
    "userAgent": "aws-cli/2.8.0 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off command/sqs.create-queue",
    "requestParameters": {
        "queueName": "hoge1006queue"
    },
    "responseElements": {
        "queueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789012/hoge1006queue"
    },
:
}

リクエストパラメータにどこかのタイミングで設定されているというわけでもないですね。
AWS 内部の動作としてデフォルトが設定されるようになっています。

そうなると当然 CloudFormation や CDK などでも同じ動きになりそうです。
念の為確認してみます。

CloudFormation

先程と同じように以下のようにキュー名だけで作成してみます。

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources: 
  HogeQueue:
    Type: AWS::SQS::Queue
    Properties: 
      QueueName: hoge1006cfn

SSE-SQS が有効化されています。

AWS CDK

CDK も以下のようにデフォルトスタックでコメントアウトされていた部分をそのまま使ってみましょう。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as sqs from 'aws-cdk-lib/aws-sqs';

export class Hoge1006SqsStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const queue = new sqs.Queue(this, 'Hoge1006SqsQueue', {
      visibilityTimeout: cdk.Duration.seconds(300)
    });
  }
}

こちらも SSE-SQS が有効化されていますね。
Synth してみると以下のようになるので、まぁそうかという感じですよね。

% cdk synth                

Resources:
  Hoge1006SqsQueue147E2BFF:
    Type: AWS::SQS::Queue
    Properties:
      VisibilityTimeout: 300
    UpdateReplacePolicy: Delete
    DeletionPolicy: Delete
:

無効化したい場合

SSE-KMS ならともかく SSE-SQS を明示的に無効化したいシーンは私には思いつかないですが、無効化したい場合は明示的に指定する必要があります。
以下は CloudFormation の例です。

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources: 
  HogeQueue:
    Type: AWS::SQS::Queue
    Properties: 
      QueueName: hoge1006cfn2
      SqsManagedSseEnabled: false

無効化されましたね。

さいごに

本日は SQS の保管時の暗号化設定がデフォルトで SSE-SQS が設定されるようになったので、作成パターンごとに設定されるのかを検証してみました。

明示的に無効化を指定していない限りはどの作成方法でもデフォルトで有効化されますね。
SSE-SQS が有効化されて困るシーンは少ないと思うので弊害はないはず(セキュリティ的には望ましいはず)ですが、過去の CloudFormation テンプレートなど使っても当時と異なる場合があるのでデフォルトが変わったんだなーというところだけ覚えておきましょう。暗号化無効になるはずと思ってたところ有効化されてましたみたいなシーンが出てきそうです。