コンテンツにスキップ

Redshift.1

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

コントロールの説明

Redshift クラスターの PubliclyAccessible 設定が false になっているかをチェックする。PubliclyAccessible が true の場合に FAILED となる。

Redshift クラスターは VPC 内に配置され、RDS と同様に PubliclyAccessible フラグでパブリック IP の付与とパブリック DNS 名の解決先を制御する(検証で確認済み)。通常、Redshift はデータウェアハウスとして VPC 内のアプリケーションや BI ツールからアクセスするため、パブリックにする必要はない。

対応する Config ルール: REDSHIFT_CLUSTER_PUBLIC_ACCESS_CHECK(評価頻度: Configuration changes)

検証環境

検証環境の構成図

--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。

結果

  • Redshift クラスターが存在しない場合は PASSED
  • PubliclyAccessible=true で起動すると FAILED。エンドポイントの DNS 名がパブリック IP アドレスに解決される
  • PubliclyAccessible=false に変更すると PASSED に復帰。DNS 名の解決先がプライベート IP アドレスに変わる。エンドポイントの DNS 名自体は変わらない
  • クラスターを削除しても PASSED に復帰(別途確認済み)
  • デフォルトでは保護されていない(PubliclyAccessible のデフォルトは true)
  • Configuration changes 型だが、Config の記録更新に十数分かかる場合がある

検証の流れ

    flowchart LR
    A[1. デフォルト状態の確認<br>PASSED] --> B[2. PubliclyAccessible=true で<br>Redshift クラスター起動]
    B --> C[3. FAILED 確認]
    C --> D[4. PubliclyAccessible=false に変更]
    D --> E[5. PASSED 復帰確認]
    E --> F[6. クラスター削除]
  

1. デフォルト状態の確認

Security Hub finding の確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "Redshift.1"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>"
    },
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>"
    }
]

Redshift クラスターが存在しないため PASSED。2 件返るのは、東京リージョン(ap-northeast-1)と集約リージョン(ap-southeast-1)の 2 リージョンで Security Hub が有効化されているためである。

2. PubliclyAccessible=true で Redshift クラスター起動

aws redshift create-cluster \
  --cluster-identifier redshift1-test \
  --node-type ra3.large \
  --cluster-type single-node \
  --master-username admin \
  --master-user-password '<パスワード>' \
  --publicly-accessible \
  --query 'Cluster.{ClusterIdentifier:ClusterIdentifier,ClusterStatus:ClusterStatus,PubliclyAccessible:PubliclyAccessible}' \
  --region ap-northeast-1
{
    "ClusterIdentifier": "redshift1-test",
    "ClusterStatus": "creating",
    "PubliclyAccessible": true
}

available 確認

Redshift クラスターの起動には数分かかる。

aws redshift describe-clusters \
  --cluster-identifier redshift1-test \
  --query 'Clusters[].{ClusterIdentifier:ClusterIdentifier,ClusterStatus:ClusterStatus,PubliclyAccessible:PubliclyAccessible,Endpoint:Endpoint.Address}' \
  --region ap-northeast-1
[
    {
        "ClusterIdentifier": "redshift1-test",
        "ClusterStatus": "available",
        "PubliclyAccessible": true,
        "Endpoint": "<エンドポイント>"
    }
]

パブリック DNS の解決確認

PubliclyAccessible=true の場合、エンドポイントの DNS 名がパブリック IP アドレスに解決される。

dig +short <エンドポイント>
<パブリック IP アドレス>

3. FAILED 確認

Configuration changes 型の Config ルールだが、Config の記録更新に十数分かかる場合がある。

Config ルールの手動トリガー

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

Config 評価結果の確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-redshift-cluster-public-access-check-<サフィックス> \
  --query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "redshift1-test",
        "ComplianceType": "NON_COMPLIANT"
    }
]

Security Hub finding の FAILED 確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "Redshift.1"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
  --region ap-northeast-1
[
    {
        "Status": "FAILED",
        "ResourceId": "arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-test"
    },
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>"
    },
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>"
    }
]

4. PubliclyAccessible=false に変更

aws redshift modify-cluster \
  --cluster-identifier redshift1-test \
  --no-publicly-accessible \
  --query 'Cluster.{ClusterIdentifier:ClusterIdentifier,PubliclyAccessible:PubliclyAccessible}' \
  --region ap-northeast-1
{
    "ClusterIdentifier": "redshift1-test",
    "PubliclyAccessible": true
}
modify-cluster の即時レスポンスでは変更前の値が返る。反映には数分かかる。

変更の反映確認

aws redshift describe-clusters \
  --cluster-identifier redshift1-test \
  --query 'Clusters[].{ClusterIdentifier:ClusterIdentifier,ClusterStatus:ClusterStatus,PubliclyAccessible:PubliclyAccessible,Endpoint:Endpoint.Address}' \
  --region ap-northeast-1
[
    {
        "ClusterIdentifier": "redshift1-test",
        "ClusterStatus": "available",
        "PubliclyAccessible": false,
        "Endpoint": "<エンドポイント>"
    }
]

パブリック DNS の解決確認

PubliclyAccessible=false に変更後、エンドポイントの DNS 名がプライベート IP アドレスに解決されるようになる。

dig +short <エンドポイント>
<プライベート IP アドレス>

5. PASSED 復帰確認

Configuration changes 型のため、Config の記録更新に十数分かかる場合がある。

Config 評価結果の確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-redshift-cluster-public-access-check-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`redshift1-test`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "redshift1-test",
        "ComplianceType": "COMPLIANT"
    }
]

Security Hub finding の PASSED 確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "Redshift.1"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "arn:aws:redshift:ap-northeast-1:<アカウント ID>:cluster:redshift1-test"
    },
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>"
    }
]

6. クラスター削除

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

削除完了確認

aws redshift describe-clusters \
  --cluster-identifier redshift1-test \
  --query 'Clusters[].ClusterStatus' \
  --region ap-northeast-1
An error occurred (ClusterNotFound) when calling the DescribeClusters operation: Cluster redshift1-test not found.

補足:Config ルール名の確認方法

aws configservice describe-config-rules \
  --query 'ConfigRules[?contains(Source.SourceIdentifier,`REDSHIFT_CLUSTER_PUBLIC_ACCESS_CHECK`)].ConfigRuleName' \
  --region ap-northeast-1

Amazonアソシエイトリンク