コンテンツにスキップ

RDS.2

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

コントロールの説明

RDS DB インスタンスの PubliclyAccessible 設定が false になっているかをチェックする。PubliclyAccessible が true の場合に FAILED となる。

PubliclyAccessible=true の場合、RDS はパブリック DNS 名を解決可能にする。ただし、実際にインターネットからアクセスできるのは、パブリックサブネット(IGW へのルートがあるサブネット)に配置されている場合に限られる。RDS.46 との関係は RDS.46 を参照。

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

検証環境

検証環境の構成図

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

結果

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

検証の流れ

    flowchart LR
    A[1. デフォルト状態の確認<br>PASSED] --> B[2. PubliclyAccessible=true で<br>RDS インスタンス起動]
    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": "RDS.2"}],
    "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 DB インスタンスが存在しないため PASSED。2 件返るのは、東京リージョン(ap-northeast-1)と集約リージョン(ap-southeast-1)の 2 リージョンで Security Hub が有効化されているためである。

2. PubliclyAccessible=true で RDS インスタンス起動

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

available 確認

RDS インスタンスの起動には数分かかる。

aws rds describe-db-instances \
  --db-instance-identifier rds2-test \
  --query 'DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier,DBInstanceStatus:DBInstanceStatus,PubliclyAccessible:PubliclyAccessible,Endpoint:Endpoint.Address}' \
  --region ap-northeast-1
[
    {
        "DBInstanceIdentifier": "rds2-test",
        "DBInstanceStatus": "available",
        "PubliclyAccessible": true,
        "Endpoint": "<エンドポイント>"
    }
]

パブリック DNS の解決確認

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

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

3. FAILED 確認

RDS.2 の Config ルールは Configuration changes 型であり、RDS インスタンスの作成・変更時に自動評価される。手動トリガーは不要だが、反映に数分かかる場合がある。

Config リソース ID の確認

Config の RDS リソース ID は DB インスタンス識別子ではなく内部 ID(DbiResourceId)が使われる。

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-rds-instance-public-access-check-<サフィックス> \
  --query 'EvaluationResults[].{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.2"}],
    "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:rds:ap-northeast-1:<アカウント ID>:db:rds2-test"
    },
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>"
    },
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>"
    }
]

4. PubliclyAccessible=false に変更

aws rds modify-db-instance \
  --db-instance-identifier rds2-test \
  --no-publicly-accessible \
  --apply-immediately \
  --query 'DBInstance.{DBInstanceIdentifier:DBInstanceIdentifier,PubliclyAccessible:PubliclyAccessible}' \
  --region ap-northeast-1
{
    "DBInstanceIdentifier": "rds2-test",
    "PubliclyAccessible": true
}
modify-db-instance の即時レスポンスでは変更前の値が返る。反映には数分かかる。

変更の反映確認

aws rds describe-db-instances \
  --db-instance-identifier rds2-test \
  --query 'DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier,DBInstanceStatus:DBInstanceStatus,PubliclyAccessible:PubliclyAccessible,Endpoint:Endpoint.Address}' \
  --region ap-northeast-1
[
    {
        "DBInstanceIdentifier": "rds2-test",
        "DBInstanceStatus": "available",
        "PubliclyAccessible": false,
        "Endpoint": "<エンドポイント>"
    }
]

パブリック DNS の解決確認

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

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

5. PASSED 復帰確認

Configuration changes 型のため、設定変更が Config に検知されれば自動評価される。ただし、Config の記録更新には十数分かかる場合がある。

Config 評価結果の確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-rds-instance-public-access-check-<サフィックス> \
  --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.2"}],
    "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:rds:ap-northeast-1:<アカウント ID>:dbinstance/<Config リソース ID>"
    },
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>"
    }
]

6. インスタンス削除

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

削除完了確認

aws rds describe-db-instances \
  --db-instance-identifier rds2-test \
  --query 'DBInstances[].{DBInstanceStatus:DBInstanceStatus}' \
  --region ap-northeast-1
An error occurred (DBInstanceNotFound) when calling the DescribeDBInstances operation: DBInstance rds2-test not found.

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

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

補足:PubliclyAccessible のデフォルト値

create-db-instance--publicly-accessible--no-publicly-accessible も指定しない場合、デフォルト VPC の DB サブネットグループを使用するとデフォルトは true になる(公式ドキュメント)。

Amazonアソシエイトリンク