コンテンツにスキップ

Redshift.1

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

概要

Redshift.1 は Redshift クラスターがパブリックアクセス可能(PubliclyAccessible: true)になっている場合に FAILED となる Security Hub CSPM コントロール。本記事では、Security Hub finding を EventBridge でフィルタし、AWS マネージドの SSM Automation AWSConfigRemediation-DisablePublicAccessToRedshiftCluster を起動してクラスターの PubliclyAccessiblefalse に変更する構成を検証する。

RDS.1 との類似性

RDS.1 自動修復 と同じく AWS マネージドの修復ランブック(AWSConfigRemediation- プレフィックス)を使用するパターン。EventBridge Input Transformer で finding の Details からクラスター識別子を抽出して渡す。

項目RDS.1 自動修復Redshift.1 自動修復(本記事)
対象 APIrds:ModifyDBSnapshotAttributeredshift:ModifyCluster
Config ルールsecurityhub-rds-snapshots-public-prohibited-<サフィックス>securityhub-redshift-cluster-public-access-check-<サフィックス>
Security Hub finding の Resource TypeAwsRdsDbSnapshotAwsRedshiftCluster
識別子フィールドDetails.AwsRdsDbSnapshot.DbSnapshotIdentifierDetails.AwsRedshiftCluster.ClusterIdentifier
SSM Automation ドキュメントAWSSupport-ModifyRDSSnapshotPermissionAWSConfigRemediation-DisablePublicAccessToRedshiftCluster
パラメータ型SnapshotIdentifiers(StringList)ClusterIdentifier(String)

自動修復の構成

Redshift クラスターがパブリック化(create-cluster --publicly-accessible / modify-cluster --publicly-accessible)
  → Config ルール securityhub-redshift-cluster-public-access-check-<サフィックス> が NON_COMPLIANT
  → Security Hub finding Redshift.1 が FAILED
  → EventBridge ルールが finding をフィルタ(Input Transformer でクラスター識別子を抽出)
  → SSM Automation AWSConfigRemediation-DisablePublicAccessToRedshiftCluster を起動
  → modify-cluster で PubliclyAccessible: false に変更
  → Config 再評価 → COMPLIANT
  → Security Hub finding → PASSED
EventBridge 発火タイミングの注意: Security Hub は Config の評価結果が変化した時点で finding を発行・更新する。同じ状態(FAILED → FAILED)が続く場合、Security Hub Findings - Imported イベントは発行されないため、EventBridge の発火タイミングは「コンプライアンス状態の変化点」に限られる。本番運用では新規パブリック化時の PASSED → FAILED 変化で発火するため問題にならないが、本記事の検証では FAILED finding の観測タイミングを確保するために EventBridge を一時的に DISABLED にしているため、後述のステップ 6.3〜6.6 で「PASSED → FAILED」の状態変化を意図的に起こしている。詳細は RDS.1 自動修復の構成 の callout 参照。
2025 年 1 月以降のデフォルト変更: AWS は 2025 年 1 月から、新規・復元したプロビジョン済み Redshift クラスターのデフォルトを PubliclyAccessible: false に変更している。本検証では FAILED 状態を作るために --publicly-accessible を明示指定してクラスターを作成する。

使用するランブック

AWSConfigRemediation-DisablePublicAccessToRedshiftCluster(AWS マネージド)を使用する。redshift:ModifyClusterPubliclyAccessible: false を設定する単純な構成。

パラメータ役割
ClusterIdentifierString修復対象のクラスター識別子
AutomationAssumeRoleStringSSM Automation が redshift:ModifyCluster を呼ぶための IAM ロール ARN

Security Hub finding 構造

Redshift.1 の finding には Resources[0].Details.AwsRedshiftCluster.ClusterIdentifier にクラスター識別子が含まれる(ASFF AwsRedshift リソース で確認)。EventBridge Input Transformer で直接抽出可能。

{
  "Resources": [{
    "Type": "AwsRedshiftCluster",
    "Id": "arn:aws:redshift:<リージョン>:<アカウント ID>:cluster:<クラスター識別子>",
    "Details": {
      "AwsRedshiftCluster": {
        "ClusterIdentifier": "<クラスター識別子>",
        "PubliclyAccessible": true,
        ...
      }
    }
  }]
}

検証環境

検証環境の構成図

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

結果

検証項目結果
Security Hub finding(FAILED)から EventBridge へのトリガー✓ 状態変化(PASSED → FAILED)で発火確認
Input Transformer でクラスター識別子抽出Resources[0].Details.AwsRedshiftCluster.ClusterIdentifier から取得
マネージドランブック起動と修復実行✓ Status: Success
クラスターの PubliclyAccessible が false に変更
Config / Security Hub PASSED 復帰✓ Compliance: PASSED, Workflow: RESOLVED

実測時間:

  • Redshift クラスター作成: 約 4 分(ra3.large x 2 ノード)
  • 設定変更 → Config CI 更新: 約 10〜15 分(Configuration changes 型、CI 更新ラグあり。手動トリガー + タグ操作で CI 再キャプチャ誘発が必要な場合あり)
  • Config NON_COMPLIANT → Security Hub FAILED: 約 3 分
  • finding 発行 → EventBridge 発火 → SSM Automation 実行完了: 約 1 分
  • 修復完了 → Config COMPLIANT → Security Hub PASSED: 約 3〜5 分
Redshift の Configuration changes 型ルールは CI 更新ラグが大きい: 実機検証で、modify-cluster --publicly-accessible 実行後に Config が CI を更新するまで 10〜15 分のラグが発生した。start-config-rules-evaluation による手動トリガーや、タグ操作(create-tags)による CI 再キャプチャの誘発を組み合わせる必要があった。本記事のステップ 6 は、本検証で実際に必要になった操作を 6.1〜6.5 のサブステップに分解して記載している。

検証の流れ

    flowchart LR
    A[1. 事前確認] --> B[2. 修復用 IAM ロール作成]
    B --> C[3. EventBridge ルール作成<br>DISABLED 状態]
    C --> D[4. Redshift クラスター作成<br>publicly-accessible]
    D --> E[5.1 FAILED 観測]
    E --> F[5.2 プライベート化<br>5.3 PASSED 観測]
    F --> G[5.4 EventBridge 有効化<br>5.5 再パブリック化]
    G --> H[6. 自動修復実行確認]
    H --> I[7. PASSED 復帰確認]
    I --> J[8. クリーンアップ]
  

1. 事前確認

Config ルールの存在確認

aws configservice describe-config-rules \
  --query "ConfigRules[?contains(ConfigRuleName, 'redshift-cluster-public-access-check')].ConfigRuleName" \
  --output text \
  --region ap-northeast-1
securityhub-redshift-cluster-public-access-check-<サフィックス>

既存の EventBridge ルール確認

aws events list-rules \
  --name-prefix "redshift-1-auto-remediation" \
  --region ap-northeast-1 \
  --query 'Rules[].Name' \
  --output json
[]

既存の IAM ロール確認

aws iam list-roles \
  --query "Roles[?starts_with(RoleName, 'redshift-1-')].RoleName" \
  --output json
[]

2. 修復用 IAM ロール作成

2.1 SSM Automation 実行ロール

cat <<'EOF' > /tmp/ssm-automation-trust.json
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"Service": "ssm.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }]
}
EOF

aws iam create-role \
  --role-name redshift-1-automation-role \
  --assume-role-policy-document file:///tmp/ssm-automation-trust.json \
  --query 'Role.Arn' \
  --output text
arn:aws:iam::<アカウント ID>:role/redshift-1-automation-role
cat <<'EOF' > /tmp/redshift-policy.json
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "ssm:StartAutomationExecution",
      "ssm:GetAutomationExecution",
      "redshift:DescribeClusters",
      "redshift:ModifyCluster"
    ],
    "Resource": "*"
  }]
}
EOF

aws iam put-role-policy \
  --role-name redshift-1-automation-role \
  --policy-name redshift-permission \
  --policy-document file:///tmp/redshift-policy.json

(出力なし)

2.2 EventBridge から SSM Automation 起動するロール

cat <<'EOF' > /tmp/eventbridge-trust.json
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"Service": "events.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }]
}
EOF

aws iam create-role \
  --role-name redshift-1-eventbridge-role \
  --assume-role-policy-document file:///tmp/eventbridge-trust.json \
  --query 'Role.Arn' \
  --output text
arn:aws:iam::<アカウント ID>:role/redshift-1-eventbridge-role
cat <<'EOF' > /tmp/eventbridge-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ssm:StartAutomationExecution",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::<アカウント ID>:role/redshift-1-automation-role",
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": "ssm.amazonaws.com"
        }
      }
    }
  ]
}
EOF

aws iam put-role-policy \
  --role-name redshift-1-eventbridge-role \
  --policy-name eventbridge-ssm-automation \
  --policy-document file:///tmp/eventbridge-policy.json

(出力なし)

3. EventBridge ルール作成

3.1 ルール本体作成(DISABLED 状態)

cat <<'EOF' > /tmp/eventbridge-pattern.json
{
  "source": ["aws.securityhub"],
  "detail-type": ["Security Hub Findings - Imported"],
  "detail": {
    "findings": {
      "Compliance": {
        "SecurityControlId": ["Redshift.1"],
        "Status": ["FAILED"]
      },
      "Workflow": {
        "Status": ["NEW"]
      },
      "Resources": {
        "Type": ["AwsRedshiftCluster"]
      }
    }
  }
}
EOF

aws events put-rule \
  --name redshift-1-auto-remediation \
  --event-pattern file:///tmp/eventbridge-pattern.json \
  --state DISABLED \
  --region ap-northeast-1 \
  --query 'RuleArn' \
  --output text
arn:aws:events:ap-northeast-1:<アカウント ID>:rule/redshift-1-auto-remediation

ルール作成後、EventPattern が正しいことを確認する。

aws events describe-rule \
  --name redshift-1-auto-remediation \
  --region ap-northeast-1 \
  --query '{State:State,EventPattern:EventPattern}' \
  --output json

State が DISABLED、EventPattern 内の SecurityControlIdRedshift.1 であることを確認する。

3.2 ターゲット設定(Input Transformer 付き)

EVENTBRIDGE_ROLE_ARN=$(aws iam get-role \
  --role-name redshift-1-eventbridge-role \
  --query 'Role.Arn' \
  --output text)

AUTOMATION_ROLE_ARN=$(aws iam get-role \
  --role-name redshift-1-automation-role \
  --query 'Role.Arn' \
  --output text)

cat <<EOF > /tmp/eventbridge-target.json
[
  {
    "Id": "ssm-automation-target",
    "Arn": "arn:aws:ssm:ap-northeast-1::automation-definition/AWSConfigRemediation-DisablePublicAccessToRedshiftCluster:\$DEFAULT",
    "RoleArn": "$EVENTBRIDGE_ROLE_ARN",
    "InputTransformer": {
      "InputPathsMap": {
        "clusterId": "\$.detail.findings[0].Resources[0].Details.AwsRedshiftCluster.ClusterIdentifier"
      },
      "InputTemplate": "{\"ClusterIdentifier\": [\"<clusterId>\"], \"AutomationAssumeRole\": [\"$AUTOMATION_ROLE_ARN\"]}"
    }
  }
]
EOF

aws events put-targets \
  --rule redshift-1-auto-remediation \
  --targets file:///tmp/eventbridge-target.json \
  --region ap-northeast-1
{
    "FailedEntryCount": 0,
    "FailedEntries": []
}

4. Redshift クラスター作成(publicly-accessible)

aws redshift create-cluster \
  --cluster-identifier redshift1-remediation-test \
  --node-type ra3.large \
  --number-of-nodes 2 \
  --master-username admin \
  --master-user-password 'TempPassword123!' \
  --publicly-accessible \
  --region ap-northeast-1 \
  --query 'Cluster.{ClusterIdentifier:ClusterIdentifier,ClusterStatus:ClusterStatus,PubliclyAccessible:PubliclyAccessible}' \
  --output json
{
    "ClusterIdentifier": "redshift1-remediation-test",
    "ClusterStatus": "creating",
    "PubliclyAccessible": true
}

available 待ち(約 10〜20 分)。

while true; do
  STATUS=$(aws redshift describe-clusters \
    --cluster-identifier redshift1-remediation-test \
    --query 'Clusters[0].ClusterStatus' \
    --output text \
    --region ap-northeast-1)
  echo "$(date '+%H:%M:%S') status: $STATUS"
  case "$STATUS" in
    available) break ;;
    failed) echo "失敗"; break ;;
    *) sleep 60 ;;
  esac
done
HH:MM:SS status: creating
(数分間 creating を繰り返す)
HH:MM:SS status: available

5. FAILED 観測と自動修復の起動準備

5.1 Security Hub finding が FAILED になることを確認

sleep 300

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ComplianceStatus":[{"Comparison":"EQUALS","Value":"FAILED"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status,ClusterId:Resources[0].Details.AwsRedshiftCluster.ClusterIdentifier}' \
  --output json
{
    "Compliance": "FAILED",
    "Workflow": "NEW",
    "ClusterId": "redshift1-remediation-test"
}

5.2 プライベート化

aws redshift modify-cluster \
  --cluster-identifier redshift1-remediation-test \
  --no-publicly-accessible \
  --region ap-northeast-1 \
  --query 'Cluster.{ClusterIdentifier:ClusterIdentifier,PubliclyAccessible:PubliclyAccessible}' \
  --output json
{
    "ClusterIdentifier": "redshift1-remediation-test",
    "PubliclyAccessible": false
}

クラスターが available に戻るまで待機する。

while true; do
  STATUS=$(aws redshift describe-clusters \
    --cluster-identifier redshift1-remediation-test \
    --query 'Clusters[0].ClusterStatus' \
    --output text \
    --region ap-northeast-1)
  echo "$(date '+%H:%M:%S') status: $STATUS"
  [ "$STATUS" = "available" ] && break
  sleep 30
done
HH:MM:SS status: modifying
(数分間 modifying を繰り返す)
HH:MM:SS status: available

5.3 PASSED 観測

Configuration changes 型で CI 更新ラグが大きいため、start-config-rules-evaluation の手動トリガーで Config を再評価してから Security Hub の反映を待つ。

sleep 300

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status}' \
  --output json
{
    "Compliance": "FAILED",
    "Workflow": "NEW"
}

5 分待ってもまだ FAILED。さらに待つ。

sleep 300

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status,UpdatedAt:UpdatedAt}' \
  --output json
{
    "Compliance": "FAILED",
    "Workflow": "NEW",
    "UpdatedAt": "<更新時刻>"
}

10 分経過してもまだ FAILED。Config 手動トリガーで再評価する。

RULE_NAME=$(aws configservice describe-config-rules \
  --query "ConfigRules[?contains(ConfigRuleName, 'redshift-cluster-public-access-check')].ConfigRuleName | [0]" \
  --output text \
  --region ap-northeast-1)

aws configservice start-config-rules-evaluation \
  --config-rule-names $RULE_NAME \
  --region ap-northeast-1

sleep 60

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name $RULE_NAME \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='redshift1-remediation-test'].{Compliance:ComplianceType,RecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1 \
  --output json
[
    {
        "Compliance": "COMPLIANT",
        "RecordedTime": "<評価時刻>"
    }
]

Config 評価が COMPLIANT になったら、Security Hub への反映を待つ。

sleep 120

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status}' \
  --output json
{
    "Compliance": "PASSED",
    "Workflow": "RESOLVED"
}

5.4 EventBridge ルールを有効化

aws events enable-rule \
  --name redshift-1-auto-remediation \
  --region ap-northeast-1

aws events describe-rule \
  --name redshift-1-auto-remediation \
  --region ap-northeast-1 \
  --query 'State'
"ENABLED"

5.5 再パブリック化

aws redshift modify-cluster \
  --cluster-identifier redshift1-remediation-test \
  --publicly-accessible \
  --region ap-northeast-1 \
  --query 'Cluster.{ClusterIdentifier:ClusterIdentifier,PubliclyAccessible:PubliclyAccessible}' \
  --output json
{
    "ClusterIdentifier": "redshift1-remediation-test",
    "PubliclyAccessible": false
}

modify-cluster の応答は非同期で、変更前の値(false)が返る場合がある。describe-clusters で実際の状態を確認する。

aws redshift describe-clusters \
  --cluster-identifier redshift1-remediation-test \
  --region ap-northeast-1 \
  --query 'Clusters[0].{PubliclyAccessible:PubliclyAccessible,ClusterStatus:ClusterStatus}' \
  --output json
{
    "PubliclyAccessible": true,
    "ClusterStatus": "available"
}

6. 自動修復の実行確認

6.1 待機後の状態確認(CI 更新ラグの観測)

sleep 600

aws ssm describe-automation-executions \
  --filters Key=DocumentNamePrefix,Values=AWSConfigRemediation-DisablePublicAccessToRedshiftCluster \
  --max-results 5 \
  --region ap-northeast-1 \
  --query 'AutomationExecutionMetadataList[].{Status:AutomationExecutionStatus,ExecutionStartTime:ExecutionStartTime,ExecutionId:AutomationExecutionId}' \
  --output json
[]

10 分待ってもまだ SSM Automation が起動していない。クラスター状態と Security Hub finding を確認する。

aws redshift describe-clusters \
  --cluster-identifier redshift1-remediation-test \
  --region ap-northeast-1 \
  --query 'Clusters[0].{PubliclyAccessible:PubliclyAccessible,ClusterStatus:ClusterStatus}' \
  --output json

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status}' \
  --output json
{
    "PubliclyAccessible": true,
    "ClusterStatus": "available"
}
{
    "Compliance": "PASSED",
    "Workflow": "RESOLVED"
}

クラスターは PubliclyAccessible: true(再パブリック化済み)だが、Security Hub は PASSED のまま。Config が CI を更新していないことを示している。

6.2 Config 手動トリガー(CI が古いことを確認)

RULE_NAME=$(aws configservice describe-config-rules \
  --query "ConfigRules[?contains(ConfigRuleName, 'redshift-cluster-public-access-check')].ConfigRuleName | [0]" \
  --output text \
  --region ap-northeast-1)

aws configservice start-config-rules-evaluation \
  --config-rule-names $RULE_NAME \
  --region ap-northeast-1

sleep 60

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name $RULE_NAME \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='redshift1-remediation-test'].{Compliance:ComplianceType,RecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1 \
  --output json
[
    {
        "Compliance": "COMPLIANT",
        "RecordedTime": "<評価時刻>"
    }
]

COMPLIANT が返る。CI が更新されていないため、Config はクラスターを依然 PubliclyAccessible: false と認識している。

6.3 タグ操作で CI 再キャプチャ誘発

ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

aws redshift create-tags \
  --resource-name arn:aws:redshift:ap-northeast-1:${ACCOUNT_ID}:cluster:redshift1-remediation-test \
  --tags Key=ci-refresh,Value=true \
  --region ap-northeast-1

sleep 60

aws configservice start-config-rules-evaluation \
  --config-rule-names $RULE_NAME \
  --region ap-northeast-1

sleep 60

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name $RULE_NAME \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='redshift1-remediation-test'].{Compliance:ComplianceType,RecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1 \
  --output json
[
    {
        "Compliance": "COMPLIANT",
        "RecordedTime": "<評価時刻>"
    }
]

タグ操作直後でもまだ COMPLIANT。さらに待機が必要。

6.4 再評価(NON_COMPLIANT 検出)

sleep 180

aws configservice start-config-rules-evaluation \
  --config-rule-names $RULE_NAME \
  --region ap-northeast-1

sleep 60

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name $RULE_NAME \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='redshift1-remediation-test'].{Compliance:ComplianceType,RecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1 \
  --output json
[
    {
        "Compliance": "NON_COMPLIANT",
        "RecordedTime": "<評価時刻>"
    }
]

NON_COMPLIANT 検出。Security Hub finding と SSM Automation 履歴を確認する。

6.5 SSM Automation 起動確認

sleep 180

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status}' \
  --output json
{
    "Compliance": "FAILED",
    "Workflow": "NEW"
}
aws ssm describe-automation-executions \
  --filters Key=DocumentNamePrefix,Values=AWSConfigRemediation-DisablePublicAccessToRedshiftCluster \
  --max-results 5 \
  --region ap-northeast-1 \
  --query 'AutomationExecutionMetadataList[].{Status:AutomationExecutionStatus,ExecutionStartTime:ExecutionStartTime,ExecutionId:AutomationExecutionId}' \
  --output json
[
    {
        "Status": "Success",
        "ExecutionStartTime": "<開始時刻>",
        "ExecutionId": "<実行 ID>"
    }
]
aws redshift describe-clusters \
  --cluster-identifier redshift1-remediation-test \
  --region ap-northeast-1 \
  --query 'Clusters[0].{PubliclyAccessible:PubliclyAccessible,ClusterStatus:ClusterStatus}' \
  --output json
{
    "PubliclyAccessible": false,
    "ClusterStatus": "available"
}

Security Hub FAILED → EventBridge 発火 → SSM Automation Success → クラスター PubliclyAccessible: false の連鎖が確認できた。

7. PASSED 復帰確認

7.1 クラスターの PubliclyAccessible が false に戻ったことを確認

aws redshift describe-clusters \
  --cluster-identifier redshift1-remediation-test \
  --region ap-northeast-1 \
  --query 'Clusters[0].{ClusterIdentifier:ClusterIdentifier,PubliclyAccessible:PubliclyAccessible}' \
  --output json
{
    "ClusterIdentifier": "redshift1-remediation-test",
    "PubliclyAccessible": false
}

7.2 Security Hub finding 確認

5.3 と同様、Config 手動トリガーが必要になる。

sleep 300

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status,UpdatedAt:UpdatedAt}' \
  --output json
{
    "Compliance": "FAILED",
    "Workflow": "NEW",
    "UpdatedAt": "<更新時刻>"
}

5 分経過してもまだ FAILED。Config 手動トリガーを実行し、Security Hub への反映を確認する。

aws configservice start-config-rules-evaluation \
  --config-rule-names $RULE_NAME \
  --region ap-northeast-1

sleep 120

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status,UpdatedAt:UpdatedAt}' \
  --output json
{
    "Compliance": "FAILED",
    "Workflow": "NEW",
    "UpdatedAt": "<更新時刻>"
}

依然 FAILED(UpdatedAt も変わっていない)。Config 側を確認する。

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name $RULE_NAME \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='redshift1-remediation-test'].{Compliance:ComplianceType,RecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1 \
  --output json
[
    {
        "Compliance": "COMPLIANT",
        "RecordedTime": "<評価時刻>"
    }
]

Config は COMPLIANT。Security Hub への反映を待つ。

sleep 180

aws securityhub get-findings \
  --filters '{"ComplianceSecurityControlId":[{"Comparison":"EQUALS","Value":"Redshift.1"}],"ResourceId":[{"Comparison":"PREFIX","Value":"arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-remediation-test"}]}' \
  --region ap-northeast-1 \
  --query 'Findings[0].{Compliance:Compliance.Status,Workflow:Workflow.Status,UpdatedAt:UpdatedAt}' \
  --output json
{
    "Compliance": "PASSED",
    "Workflow": "RESOLVED",
    "UpdatedAt": "<更新時刻>"
}

8. クリーンアップ

Redshift クラスター削除

aws redshift delete-cluster \
  --cluster-identifier redshift1-remediation-test \
  --skip-final-cluster-snapshot \
  --region ap-northeast-1 \
  --query 'Cluster.{ClusterIdentifier:ClusterIdentifier,ClusterStatus:ClusterStatus}' \
  --output json
{
    "ClusterIdentifier": "redshift1-remediation-test",
    "ClusterStatus": "deleting"
}

削除完了を確認する。

while true; do
  aws redshift describe-clusters \
    --cluster-identifier redshift1-remediation-test \
    --region ap-northeast-1 >/dev/null 2>&1 || { echo "削除完了"; break; }
  echo "$(date '+%H:%M:%S') deleting..."
  sleep 60
done
HH:MM:SS deleting...
...
削除完了

EventBridge ルール削除

aws events remove-targets \
  --rule redshift-1-auto-remediation \
  --ids ssm-automation-target \
  --region ap-northeast-1 \
  --query '{FailedEntryCount:FailedEntryCount}' \
  --output json
{
    "FailedEntryCount": 0
}
aws events delete-rule \
  --name redshift-1-auto-remediation \
  --region ap-northeast-1

(出力なし)

IAM ロール削除

aws iam delete-role-policy \
  --role-name redshift-1-automation-role \
  --policy-name redshift-permission

aws iam delete-role \
  --role-name redshift-1-automation-role

aws iam delete-role-policy \
  --role-name redshift-1-eventbridge-role \
  --policy-name eventbridge-ssm-automation

aws iam delete-role \
  --role-name redshift-1-eventbridge-role

(4 つとも出力なし)

aws iam list-roles \
  --query "Roles[?starts_with(RoleName, 'redshift-1-')].RoleName" \
  --output json
[]

参考

Amazonアソシエイトリンク