Redshift.1
概要
Redshift.1 は Redshift クラスターがパブリックアクセス可能(PubliclyAccessible: true)になっている場合に FAILED となる Security Hub CSPM コントロール。本記事では、Security Hub finding を EventBridge でフィルタし、AWS マネージドの SSM Automation AWSConfigRemediation-DisablePublicAccessToRedshiftCluster を起動してクラスターの PubliclyAccessible を false に変更する構成を検証する。
RDS.1 との類似性
RDS.1 自動修復 と同じく AWS マネージドの修復ランブック(AWSConfigRemediation- プレフィックス)を使用するパターン。EventBridge Input Transformer で finding の Details からクラスター識別子を抽出して渡す。
| 項目 | RDS.1 自動修復 | Redshift.1 自動修復(本記事) |
|---|---|---|
| 対象 API | rds:ModifyDBSnapshotAttribute | redshift:ModifyCluster |
| Config ルール | securityhub-rds-snapshots-public-prohibited-<サフィックス> | securityhub-redshift-cluster-public-access-check-<サフィックス> |
| Security Hub finding の Resource Type | AwsRdsDbSnapshot | AwsRedshiftCluster |
| 識別子フィールド | Details.AwsRdsDbSnapshot.DbSnapshotIdentifier | Details.AwsRedshiftCluster.ClusterIdentifier |
| SSM Automation ドキュメント | AWSSupport-ModifyRDSSnapshotPermission | AWSConfigRemediation-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 → PASSEDSecurity Hub Findings - Imported イベントは発行されないため、EventBridge の発火タイミングは「コンプライアンス状態の変化点」に限られる。本番運用では新規パブリック化時の PASSED → FAILED 変化で発火するため問題にならないが、本記事の検証では FAILED finding の観測タイミングを確保するために EventBridge を一時的に DISABLED にしているため、後述のステップ 6.3〜6.6 で「PASSED → FAILED」の状態変化を意図的に起こしている。詳細は RDS.1 自動修復の構成 の callout 参照。PubliclyAccessible: false に変更している。本検証では FAILED 状態を作るために --publicly-accessible を明示指定してクラスターを作成する。使用するランブック
AWSConfigRemediation-DisablePublicAccessToRedshiftCluster(AWS マネージド)を使用する。redshift:ModifyCluster で PubliclyAccessible: false を設定する単純な構成。
| パラメータ | 型 | 役割 |
|---|---|---|
ClusterIdentifier | String | 修復対象のクラスター識別子 |
AutomationAssumeRole | String | SSM 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 分
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-1securityhub-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 textarn:aws:iam::<アカウント ID>:role/redshift-1-automation-rolecat <<'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 textarn:aws:iam::<アカウント ID>:role/redshift-1-eventbridge-rolecat <<'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 textarn: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 jsonState が DISABLED、EventPattern 内の SecurityControlId が Redshift.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
doneHH:MM:SS status: creating
(数分間 creating を繰り返す)
HH:MM:SS status: available5. 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
doneHH:MM:SS status: modifying
(数分間 modifying を繰り返す)
HH:MM:SS status: available5.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
doneHH: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[]参考
- Redshift.1 Redshift クラスターがパブリックアクセスを許可していないこと - コントロール自体の検証
- RDS.1 自動修復 - 同じ EventBridge → SSM Automation 構成(マネージドランブック使用)
- 自動修復の概要 - 全コントロールの一覧と方針
- AWSConfigRemediation-DisablePublicAccessToRedshiftCluster - SSM Automation ドキュメント