コンテンツにスキップ

RDS.1

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

コントロールの説明

RDS スナップショットがパブリック共有されていないかをチェックする。スナップショットの restore 属性に all が含まれる場合に FAILED となる。

RDS スナップショットをパブリックにすると、任意の AWS アカウントからスナップショットを復元してデータにアクセスできるようになる。デフォルトではスナップショットはプライベート(作成元アカウントのみ復元可能)であり、明示的に modify-db-snapshot-attributeall を追加しない限りパブリックにはならない。

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

検証環境

検証環境の構成図

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

結果

  • RDS スナップショットが存在しない場合は PASSED
  • スナップショット作成直後はプライベート(restore 属性が空)であり、PASSED
  • restore 属性に all を追加するとパブリックになり FAILED
  • all を削除してプライベートに戻すと PASSED に復帰
  • デフォルトでは保護されている(スナップショットのデフォルトはプライベート)

検証の流れ

    flowchart LR
    A[1. デフォルト状態の確認<br>PASSED] --> B[2. RDS インスタンス起動<br>→ スナップショット作成<br>→ インスタンス削除]
    B --> C[3. デフォルトでプライベート<br>であることを確認<br>PASSED]
    C --> D[4. スナップショットを<br>パブリックに変更]
    D --> E[5. FAILED 確認]
    E --> F[6. プライベートに戻す]
    F --> G[7. PASSED 復帰確認]
    G --> H[8. クリーンアップ]
  

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

Security Hub finding の確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "RDS.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>"
    }
]

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

2. RDS インスタンス起動 → スナップショット作成 → インスタンス削除

スナップショットを作成するために一時的に RDS インスタンスを起動する。スナップショット作成後、インスタンスは不要なので削除する。

インスタンス起動

aws rds create-db-instance \
  --db-instance-identifier rds1-test \
  --db-instance-class db.t3.micro \
  --engine mysql \
  --master-username admin \
  --master-user-password '<パスワード>' \
  --allocated-storage 20 \
  --no-publicly-accessible \
  --db-subnet-group-name default \
  --no-multi-az \
  --query 'DBInstance.{DBInstanceIdentifier:DBInstanceIdentifier,DBInstanceStatus:DBInstanceStatus}' \
  --region ap-northeast-1
{
    "DBInstanceIdentifier": "rds1-test",
    "DBInstanceStatus": "creating"
}

available になるまで数分待つ。

aws rds describe-db-instances \
  --db-instance-identifier rds1-test \
  --query 'DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier,DBInstanceStatus:DBInstanceStatus}' \
  --region ap-northeast-1
[
    {
        "DBInstanceIdentifier": "rds1-test",
        "DBInstanceStatus": "available"
    }
]

スナップショット作成

aws rds create-db-snapshot \
  --db-instance-identifier rds1-test \
  --db-snapshot-identifier rds1-test-snapshot \
  --query 'DBSnapshot.{DBSnapshotIdentifier:DBSnapshotIdentifier,Status:Status}' \
  --region ap-northeast-1
{
    "DBSnapshotIdentifier": "rds1-test-snapshot",
    "Status": "creating"
}

available になるまで待つ。

aws rds describe-db-snapshots \
  --db-snapshot-identifier rds1-test-snapshot \
  --query 'DBSnapshots[].{DBSnapshotIdentifier:DBSnapshotIdentifier,Status:Status}' \
  --region ap-northeast-1
[
    {
        "DBSnapshotIdentifier": "rds1-test-snapshot",
        "Status": "available"
    }
]

インスタンス削除

スナップショットは独立して存在するため、インスタンスは削除できる。

aws rds delete-db-instance \
  --db-instance-identifier rds1-test \
  --skip-final-snapshot \
  --query 'DBInstance.{DBInstanceIdentifier:DBInstanceIdentifier,DBInstanceStatus:DBInstanceStatus}' \
  --region ap-northeast-1
{
    "DBInstanceIdentifier": "rds1-test",
    "DBInstanceStatus": "deleting"
}

3. デフォルトでプライベートであることを確認

restore 属性の確認

aws rds describe-db-snapshot-attributes \
  --db-snapshot-identifier rds1-test-snapshot \
  --query 'DBSnapshotAttributesResult.DBSnapshotAttributes' \
  --region ap-northeast-1
[
    {
        "AttributeName": "restore",
        "AttributeValues": []
    }
]

restore 属性が空であり、パブリック共有されていない(プライベート)。

Config 評価結果の確認

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-rds-snapshots-public-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-rds-snapshots-public-prohibited-<サフィックス> \
  --query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<Config リソース ID>",
        "ComplianceType": "COMPLIANT"
    }
]

スナップショット作成直後はプライベートであり、COMPLIANT。

4. スナップショットをパブリックに変更

aws rds modify-db-snapshot-attribute \
  --db-snapshot-identifier rds1-test-snapshot \
  --attribute-name restore \
  --values-to-add all \
  --query 'DBSnapshotAttributesResult.DBSnapshotAttributes' \
  --region ap-northeast-1
[
    {
        "AttributeName": "restore",
        "AttributeValues": [
            "all"
        ]
    }
]

5. FAILED 確認

Config ルールの手動トリガー

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

Config 評価結果の確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-rds-snapshots-public-prohibited-<サフィックス> \
  --query 'EvaluationResults[?ComplianceType==`NON_COMPLIANT`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<Config リソース ID>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

Security Hub finding の FAILED 確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "RDS.1"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}],
    "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:rds:ap-northeast-1:<アカウント ID>:snapshot:rds1-test-snapshot"
    }
]

6. プライベートに戻す

aws rds modify-db-snapshot-attribute \
  --db-snapshot-identifier rds1-test-snapshot \
  --attribute-name restore \
  --values-to-remove all \
  --query 'DBSnapshotAttributesResult.DBSnapshotAttributes' \
  --region ap-northeast-1
[
    {
        "AttributeName": "restore",
        "AttributeValues": []
    }
]

7. PASSED 復帰確認

Config ルールの手動トリガー

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

Config 評価結果の確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-rds-snapshots-public-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<Config リソース ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<Config リソース ID>",
        "ComplianceType": "COMPLIANT"
    }
]

Security Hub finding の PASSED 確認

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

8. クリーンアップ

aws rds delete-db-snapshot \
  --db-snapshot-identifier rds1-test-snapshot \
  --query 'DBSnapshot.{DBSnapshotIdentifier:DBSnapshotIdentifier,Status:Status}' \
  --region ap-northeast-1
{
    "DBSnapshotIdentifier": "rds1-test-snapshot",
    "Status": "deleted"
}

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

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

Amazonアソシエイトリンク