コンテンツにスキップ

SQS.3

検証日: 2026-05-06 / リージョン: ap-northeast-1

概要

SQS.3 は、SQS キューのアクセスポリシー(キューポリシー)がパブリックアクセス(Principal: "*" または等価な Principal: {"AWS": "*"})を許可していないことをチェックする Security Hub CSPM コントロールである。対応する Config ルールは sqs-queue-no-public-access

SQS API のリクエストには AWS 認証情報による SigV4 署名が必須であり、SQS には S3 のような匿名 HTTP アクセス(pre-signed URL や匿名公開)の仕組みは存在しない。そのため、SQS における「パブリックアクセス」は、キューポリシーで Principal: "*" または等価な Principal: {"AWS": "*"} を許可し、全 AWS プリンシパル(自アカウント以外を含む全 AWS アカウントのユーザー・ロール)からのアクセスを許可している状態を指す。

検出範囲

SQS.3 の特徴は「キューポリシー内の Principal: "*" によるパブリックアクセスを検出し、特定の外部アカウントへのクロスアカウントアクセスは検出しない」点である。クロスアカウントアクセスは IAM Access Analyzer が担当する。

SQS キューはデフォルトではキューポリシーが存在しない。明示的にキューポリシーを設定しない限り、外部からのアクセスは発生しない。

キューポリシー設定外部プリンシパルからの呼び出しSQS.3IAM Access Analyzer
デフォルト(キューポリシーなし)拒否PASSEDfinding なし
Principal: "*"(パブリック)許可(全 AWS プリンシパル)FAILEDfinding(isPublic: true
組織外アカウント(クロスアカウント)指定アカウントのみ許可PASSEDfinding(isPublic: false
組織内アカウント(信頼ゾーン内)指定アカウントのみ許可PASSEDfinding なし

外部アクセス制御レイヤー

SQS キューの外部アクセスに関わるコントロールは以下の通り。SQS.3 は CSPM による検出レイヤーに位置する。

レイヤーコントロール役割
デフォルト保護デフォルトではキューポリシーが存在しない明示的に設定しない限り外部アクセスは発生しない
予防(RCP)CT.SQS.PV.1組織外プリンシパルからの SQS API アクセスを拒否(キューポリシーの内容は変更しない)
検出(CSPM)SQS.3(本記事)キューポリシーに Principal: "*" が設定されているキューを検出
検出(IAM Access Analyzer)SQS キューキューポリシーを解析し、パブリック・組織外クロスアカウントへの到達可能性を検出
CT.SQS.PV.1 は RCP 型であり、Lambda.1 に対応する CT.LAMBDA.PV.2(SCP 型)と動作が異なる。RCP はリソースへのアクセス自体を拒否するため、キューポリシーに Principal: "*" が残っていても組織外からの API 呼び出しは拒否される。ただし SQS.3 はキューポリシーの内容(Principal: "*" の有無)を見るため、RCP 適用後も FAILED のまま変わらないと想定される。本記事のステップ 10 でこれを検証する。

本記事で確認すること

SQS.3 に関わる検証は、既に他の記事で一部が完了している。本記事ではそれらをリンクで参照しつつ、未検証の項目を検証する。

#検証観点状態出典
1デフォルト状態でキューポリシーが存在しない検証済みIAM Access Analyzer SQS キュー
2デフォルト状態で SQS.3 が PASSED本記事で検証(2. デフォルト状態で SQS.3 PASSED を確認
3Principal: "*" 設定時に SQS.3 が FAILED本記事で検証(8. SQS.3 FAILED を確認
4Principal: "*" 設定時の IAM Access Analyzer finding(isPublic: true検証済みIAM Access Analyzer SQS キュー ステップ 3
5組織外アカウントを設定時に SQS.3 が PASSED のまま本記事で検証(4. SQS.3 が PASSED のままであることを確認
6組織外アカウントを設定時の IAM Access Analyzer finding(isPublic: false検証済みIAM Access Analyzer SQS キュー ステップ 4
7組織内アカウントを設定時に SQS.3 が PASSED のまま本記事で検証(6. SQS.3 が PASSED のままであることを確認
8組織内アカウントを設定時の IAM Access Analyzer finding記述のみ(信頼ゾーン内のため finding なし)IAM Access Analyzer Analyzer のタイプ
9キューポリシーから Principal: "*" を削除で SQS.3 が PASSED に復帰本記事で検証(9. Principal: * の削除で PASSED に復帰することを確認
10予防コントロール CT.SQS.PV.1 有効化後、SQS.3 finding がどうなるか(RCP 型は CSPM 動作を変えるか)本記事で検証(10. 予防コントロール CT.SQS.PV.1 有効化後の finding

本記事では #2、#3、#5、#7、#9、#10 の 6 点を検証する。

#5・#7 のように「SQS.3 が PASSED のまま変化しない」ことを確認する場合、Security Hub finding の UpdatedAt は Config の評価結果が変わらないと更新されないケースがある(VPC BPA 記事の UpdatedAt 教訓を参照)。そのため本記事では、Config の ResultRecordedTime がキューポリシー変更時刻より後であることをもって、設定変更後に再評価されたことを確認する。

Config ルールの手動トリガー(start-config-rules-evaluation)は 1 回で評価が走らない場合があり、同じ ResultRecordedTime が返ることがある。その場合は数分待ってから再度トリガーする。

SNS.4 の検証では新規 SNS トピック作成から Config が発見するまで約 10 分のラグが観測された。SQS でも同様のラグが発生する可能性がある。list-discovered-resources --resource-type AWS::SQS::Queue でテスト用キューが発見されていることを確認してから Config ルールをトリガーする。

結果

  • デフォルト状態: SQS キューをポリシー指定なしで作成すると、キューポリシーが空となり、SQS.3 は PASSED
  • 組織外アカウントの許可追加: キューポリシーに組織外アカウントへの許可を追加しても、SQS.3 は PASSED のまま(IAM Access Analyzer は isPublic: false の finding を生成)
  • 組織内アカウントの許可追加: キューポリシーに組織内アカウントへの許可を追加しても、SQS.3 は PASSED のまま(IAM Access Analyzer も信頼ゾーン内のため finding なし)
  • Principal: "*" の追加: キューポリシーに Principal: "*" の statement を追加すると、SQS.3 は FAILED に変化
  • Principal: "*" の削除: キューポリシーから Principal: "*" の statement を削除すると、SQS.3 は PASSED に復帰する
  • CT.SQS.PV.1(RCP 型)との連動: 有効化しても SQS.3 の finding は変化しない。RCP はキューポリシーを変更せず API アクセスを拒否するため、キューポリシーの内容をチェックする SQS.3 の評価結果は変わらない

検証環境

検証環境の構成図

本記事のコマンドは、--profile 指定がない場合は Workload アカウントで実行する。事前に export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。

検証の流れ

    flowchart LR
    A[1. テスト用キュー<br>作成] --> B[2. デフォルト状態で<br>SQS.3 PASSED 確認]
    B --> C[3. 組織外アカウント<br>許可追加]
    C --> D[4. SQS.3 PASSED<br>のまま確認]
    D --> E[5. 組織内アカウント<br>許可追加]
    E --> F[6. SQS.3 PASSED<br>のまま確認]
    F --> G[7. Principal:*<br>許可追加]
    G --> H[8. SQS.3 FAILED<br>確認]
    H --> I[9. Principal:* のみ<br>削除 → PASSED 復帰確認]
    I --> J[10. FAILED 状態に戻し<br>CT.SQS.PV.1 有効化の影響確認]
    J --> K[11. クリーンアップ]
  

1. テスト用キューの作成

ポリシー指定なしで SQS キューを作成すると、キューポリシーは空の状態となる。

なお、SQS キューのデフォルト状態ではキューポリシーが存在しないことは IAM Access Analyzer SQS キュー記事 で既に検証済み。本記事の本ステップではテスト用キューが正しく作成されたことを確認する目的でデフォルト状態のポリシーを確認する。

aws sqs create-queue \
  --queue-name sqs-3-test \
  --query 'QueueUrl' --output text \
  --region ap-northeast-1
https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test

キュー ARN を取得する。

aws sqs get-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test \
  --attribute-names QueueArn Policy \
  --query 'Attributes' \
  --region ap-northeast-1
{
    "QueueArn": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"
}

Policy 属性が返らない。デフォルトではキューポリシーが設定されていない。

2. デフォルト状態で SQS.3 PASSED を確認

SQS キュー作成後、Config が新規リソースを発見・記録するまでにラグがある。検証では約 3 分で発見された(SNS.4 の約 10 分より早い)。list-discovered-resources --resource-type AWS::SQS::Queue で本記事のテスト用キューが発見されていることを確認してから、Config ルールをトリガーする。

Config リソース発見の確認

キュー名でフィルタしたポーリング形式で発見を待つ。1 分おきに確認する例:

# SNS.4 で観測されたラグ(約 10 分)を見越して最大 15 分待つ
for i in $(seq 1 15); do
  RESULT=$(aws configservice list-discovered-resources \
    --resource-type AWS::SQS::Queue \
    --query 'resourceIdentifiers[?ends_with(resourceId, `/sqs-3-test`)].resourceId' --output text \
    --region ap-northeast-1)
  echo "$(date -u '+%H:%M:%S UTC') $i: $RESULT"
  if [ -n "$RESULT" ] && [ "$RESULT" != "None" ]; then
    echo "発見"
    break
  fi
  sleep 60
done
<時刻> 1:
<時刻> 2:
<時刻> 3: https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test
発見

検証では 3 分で発見された(SNS の 10 分より早い)。

Config ルール名の取得

aws configservice describe-config-rules \
  --query 'ConfigRules[?starts_with(ConfigRuleName, `securityhub-sqs-queue-no-public-access`)].ConfigRuleName' \
  --region ap-northeast-1
[
    "securityhub-sqs-queue-no-public-access-<サフィックス>"
]

Config ルール手動トリガー

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-sqs-queue-no-public-access-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。

Config の評価結果確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-sqs-queue-no-public-access-<サフィックス> \
  --query 'EvaluationResults[?ends_with(EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId, `/sqs-3-test`)].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test",
        "ComplianceType": "COMPLIANT",
        "ResultRecordedTime": "<評価時刻>"
    }
]

Security Hub finding 確認

Config の評価結果が Security Hub に反映されるまで 2〜3 分のラグがある。数分待ってから確認する。

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SQS.3"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test",
        "UpdatedAt": "<更新時刻>"
    }
]

3. 組織外アカウントを許可

SQS キューポリシーは set-queue-attributes で全体を上書きする形式のため、JSON ファイルにはそのステップまでに必要な全 statement を含める必要がある。本ステップではまだキューポリシー未設定の状態なので、組織外アカウントを Principal に指定する statement(Sid: cross-account-external)のみを含むキューポリシーを作成して適用する。

cat > /tmp/sqs-3-policy-step3.json << EOF
{
    "Version": "2012-10-17",
    "Id": "sqs-3-test-policy",
    "Statement": [
        {
            "Sid": "cross-account-external",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::<組織外アカウント ID>:root"},
            "Action": ["sqs:SendMessage", "sqs:ReceiveMessage"],
            "Resource": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"
        }
    ]
}
EOF

# --attributes は {"Policy": "<JSON 文字列>"} 形式で渡す必要がある
# `--attributes Policy="<JSON>"` のキーバリュー形式は、ポリシー JSON 内の "{", "}", ":" などを
# CLI パーサが誤解釈してエラーになるため、attrs JSON ファイルを生成して file:// で渡す
# 1. jq -c でポリシー JSON を単一行の文字列に整形
# 2. jq -n --arg で {"Policy": ...} 形式の attrs JSON を生成
POLICY_JSON=$(jq -c . /tmp/sqs-3-policy-step3.json)
jq -n --arg p "$POLICY_JSON" '{Policy: $p}' > /tmp/sqs-3-attrs-step3.json

aws sqs set-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test \
  --attributes file:///tmp/sqs-3-attrs-step3.json \
  --region ap-northeast-1
(出力なし)

4. SQS.3 が PASSED のままであることを確認

Config ルール手動トリガー

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-sqs-queue-no-public-access-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。

Config の評価結果確認

ResultRecordedTime がステップ 3(set-queue-attributes の実行時刻)より後であることを確認する。

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-sqs-queue-no-public-access-<サフィックス> \
  --query 'EvaluationResults[?ends_with(EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId, `/sqs-3-test`)].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test",
        "ComplianceType": "COMPLIANT",
        "ResultRecordedTime": "<set-queue-attributes 後の評価時刻>"
    }
]

組織外アカウントを許可しても、SQS.3 の Config 評価は COMPLIANT(PASSED)のまま。

Security Hub finding 確認

数分待ってから確認する。

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SQS.3"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test",
        "UpdatedAt": "<set-queue-attributes 後の更新時刻>"
    }
]

5. 組織内アカウントを許可

set-queue-attributes はキューポリシー全体を上書きするため、ステップ 3 で設定した組織外アカウント用 statement(Sid: cross-account-external)を含めた上で、組織内アカウント(Audit)を Principal に指定する statement(Sid: cross-account-internal)を追加した新しいキューポリシーを作成して適用する。

cat > /tmp/sqs-3-policy-step5.json << EOF
{
    "Version": "2012-10-17",
    "Id": "sqs-3-test-policy",
    "Statement": [
        {
            "Sid": "cross-account-external",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::<組織外アカウント ID>:root"},
            "Action": ["sqs:SendMessage", "sqs:ReceiveMessage"],
            "Resource": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"
        },
        {
            "Sid": "cross-account-internal",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::<組織内アカウント ID>:root"},
            "Action": ["sqs:SendMessage", "sqs:ReceiveMessage"],
            "Resource": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"
        }
    ]
}
EOF

POLICY_JSON=$(jq -c . /tmp/sqs-3-policy-step5.json)
jq -n --arg p "$POLICY_JSON" '{Policy: $p}' > /tmp/sqs-3-attrs-step5.json

aws sqs set-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test \
  --attributes file:///tmp/sqs-3-attrs-step5.json \
  --region ap-northeast-1
(出力なし)

6. SQS.3 が PASSED のままであることを確認

Config ルール手動トリガー

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-sqs-queue-no-public-access-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。

Config の評価結果確認

ResultRecordedTime がステップ 5(set-queue-attributes の実行時刻)より後であることを確認する。

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-sqs-queue-no-public-access-<サフィックス> \
  --query 'EvaluationResults[?ends_with(EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId, `/sqs-3-test`)].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test",
        "ComplianceType": "COMPLIANT",
        "ResultRecordedTime": "<set-queue-attributes 後の評価時刻>"
    }
]

Security Hub finding 確認

数分待ってから確認する。

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SQS.3"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test",
        "UpdatedAt": "<set-queue-attributes 後の更新時刻>"
    }
]

7. Principal: * を許可

本記事の検証パターンは Lambda.1 / KMS.5 / SNS.4 と共通である。複数の statement が混在する中に Principal: "*" の statement のみを追加し、ステップ 9 でそれだけを削除して PASSED 復帰を確認する。これにより、SQS.3 が「Principal: "*" の statement の存在」のみで判定していることを切り分けて確認できる。

set-queue-attributes はキューポリシー全体を上書きするため、ステップ 3 で追加した組織外アカウント用 statement(Sid: cross-account-external)とステップ 5 で追加した組織内アカウント用 statement(Sid: cross-account-internal)を含めた上で、新たに Principal: "*" の statement(Sid: public-access)を追加した新しいキューポリシーを作成して適用する。

cat > /tmp/sqs-3-policy-step7.json << EOF
{
    "Version": "2012-10-17",
    "Id": "sqs-3-test-policy",
    "Statement": [
        {
            "Sid": "cross-account-external",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::<組織外アカウント ID>:root"},
            "Action": ["sqs:SendMessage", "sqs:ReceiveMessage"],
            "Resource": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"
        },
        {
            "Sid": "cross-account-internal",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::<組織内アカウント ID>:root"},
            "Action": ["sqs:SendMessage", "sqs:ReceiveMessage"],
            "Resource": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"
        },
        {
            "Sid": "public-access",
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["sqs:SendMessage", "sqs:ReceiveMessage"],
            "Resource": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"
        }
    ]
}
EOF

POLICY_JSON=$(jq -c . /tmp/sqs-3-policy-step7.json)
jq -n --arg p "$POLICY_JSON" '{Policy: $p}' > /tmp/sqs-3-attrs-step7.json

aws sqs set-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test \
  --attributes file:///tmp/sqs-3-attrs-step7.json \
  --region ap-northeast-1
(出力なし)

8. SQS.3 FAILED を確認

Config ルール手動トリガー

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-sqs-queue-no-public-access-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。

キューポリシー変更直後の Config トリガーでは COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。

Config の評価結果確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-sqs-queue-no-public-access-<サフィックス> \
  --query 'EvaluationResults[?ends_with(EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId, `/sqs-3-test`)].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test",
        "ComplianceType": "NON_COMPLIANT",
        "ResultRecordedTime": "<set-queue-attributes 後の評価時刻>"
    }
]

Security Hub finding 確認

数分待ってから確認する。

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SQS.3"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "FAILED",
        "ResourceId": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test",
        "UpdatedAt": "<set-queue-attributes 後の更新時刻>"
    }
]

9. Principal: * の削除で PASSED に復帰することを確認

public-access statement のみを削除し、組織外アカウント用 statement(Sid: cross-account-external)と組織内アカウント用 statement(Sid: cross-account-internal)は残した状態で SQS.3 が PASSED に復帰することを確認する。ステップ 5 と同じキューポリシー(組織外・組織内 statement のみ)に戻す。

aws sqs set-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test \
  --attributes file:///tmp/sqs-3-attrs-step5.json \
  --region ap-northeast-1
(出力なし)

Config ルール手動トリガー

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-sqs-queue-no-public-access-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。

キューポリシー変更直後の Config トリガーでは NON_COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。

Config の評価結果確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-sqs-queue-no-public-access-<サフィックス> \
  --query 'EvaluationResults[?ends_with(EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId, `/sqs-3-test`)].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test",
        "ComplianceType": "COMPLIANT",
        "ResultRecordedTime": "<set-queue-attributes 後の評価時刻>"
    }
]

Security Hub finding 確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SQS.3"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test",
        "UpdatedAt": "<更新時刻>"
    }
]

組織外・組織内の statement は残っているが、Principal: "*" を削除したことで SQS.3 は PASSED に復帰。

10. 予防コントロール CT.SQS.PV.1 有効化後の finding

CT.SQS.PV.1 は RCP 型で、組織外プリンシパルからの API アクセスを拒否する。キューポリシーの内容(Principal: "*" 等)は変更しない。そのため、キューポリシーの内容をチェックする SQS.3 の評価結果は変化しない想定である。

本ステップでは、ステップ 7 のキューポリシー(Principal: "*" を含む)を再適用して FAILED 状態を作り直し、その後 CT.SQS.PV.1 を有効化して SQS.3 の評価が変化しないことを確認する。

キューポリシーを Principal: “*” を含む状態に戻す

ステップ 9 で PASSED に戻したため、再び FAILED 状態を作る必要がある。ステップ 7 のキューポリシー(Principal: "*" を含む)を再適用する。

aws sqs set-queue-attributes \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test \
  --attributes file:///tmp/sqs-3-attrs-step7.json \
  --region ap-northeast-1
(出力なし)

CT.SQS.PV.1 有効化

Control Tower で CT.SQS.PV.1 を対象の OU で有効化する。詳細な手順は CT.SQS.PV.1 の記事 を参照。

Config ルール手動トリガー

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-sqs-queue-no-public-access-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。

キューポリシー変更直後の Config トリガーでは COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。

Config の評価結果確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-sqs-queue-no-public-access-<サフィックス> \
  --query 'EvaluationResults[?ends_with(EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId, `/sqs-3-test`)].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test",
        "ComplianceType": "NON_COMPLIANT",
        "ResultRecordedTime": "<RCP 有効化後の評価時刻>"
    }
]

ResultRecordedTime が CT.SQS.PV.1 有効化時刻より後であることを確認する。これにより、RCP 適用後に Config の再評価が実行されたことを示す。

CT.SQS.PV.1(RCP 型)を有効化しても、キューポリシーの内容は変わらないため SQS.3 は FAILED のまま。RCP は実際の API アクセスをブロックするが、キューポリシーの内容に基づく CSPM の検出結果には影響しないことを示す。

Security Hub finding 確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SQS.3"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "FAILED",
        "ResourceId": "arn:aws:sqs:ap-northeast-1:<アカウント ID>:sqs-3-test",
        "UpdatedAt": "<更新時刻>"
    }
]

CT.SQS.PV.1 無効化

本ステップで CT.SQS.PV.1 を新たに有効化した場合のみ無効化する。元から有効な環境ではそのまま有効にしておく。手順は CT.SQS.PV.1 の記事 を参照。

11. クリーンアップ

CT.SQS.PV.1 の状態確認

ステップ 10 で CT.SQS.PV.1 を有効化した場合、既にステップ 10 末尾で無効化済み。元から有効な環境であれば有効のまま残す。

SQS キュー削除

aws sqs delete-queue \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/<アカウント ID>/sqs-3-test \
  --region ap-northeast-1
(出力なし)

一時ファイル削除

rm -f /tmp/sqs-3-policy-step3.json /tmp/sqs-3-policy-step5.json /tmp/sqs-3-policy-step7.json \
      /tmp/sqs-3-attrs-step3.json /tmp/sqs-3-attrs-step5.json /tmp/sqs-3-attrs-step7.json

Amazonアソシエイトリンク