説明
CloudFormation の AWS::RDS::DBInstance で PubliclyAccessible を有効にすると、RDS インスタンスが公開アドレスを使用できるようになります。実際に外部から接続できるかどうかは、サブネットのルーティングやセキュリティグループなどのネットワーク設定によって決まります。ネットワーク接続ができても、データベースの認証とデータへのアクセス権限は別途必要です。
内部のアプリケーションだけが使うデータベースには、不要な公開アドレスを付与しないことを推奨します。PubliclyAccessible を省略した場合の既定の動作は、VPC と DB サブネットグループの構成によって異なる場合があります。意図するアクセス方法を明示的に設定してください。
想定される影響
- インターネットへの接続経路と広範なセキュリティグループの許可がそろうと、意図しない接続元からログインや脆弱性の悪用を試みることができます。実際のデータアクセスには、認証や権限などの追加条件が関係します。
- 現在は接続を制限していても、不要な公開アドレスを残していると、後のルートやセキュリティグループの変更で外部から接続できるようになるおそれがあります。
対処方法
- 内部用のインスタンスには
PubliclyAccessible: falseを明示してください。アプリケーションや管理ツールに必要なプライベート接続経路を準備してから、公開アクセスを無効にしてください。 - DB サブネットグループのサブネットとルート、セキュリティグループを合わせて確認し、必要なクライアントとデータベースのポートだけを許可してください。変更後も必要な接続が維持されることをテストしてください。
- 業務上公開アクセスが必要な場合は、セキュリティグループを承認済みの接続元に限定し、データベース認証と通信の暗号化を適用してください。デプロイ済みインスタンスの設定がテンプレートと一致することも確認してください。
例
以下は公開アクセス設定だけを比較する例で、DB サブネットグループとセキュリティグループは含んでいません。Engine、EngineVersion、DB インスタンスクラスには、デプロイ先のリージョンでサポートされる値を選んでください。SecretPassword01 は例示用のパスワードです。実際のデプロイで使ったり、テンプレートにパスワードを直接保存したりしないでください。対応する構成では、Secrets Manager による RDS のパスワード管理などを利用してください。
変更前
yaml
Resources:
MyDB:
Type: "AWS::RDS::DBInstance"
Properties:
DBInstanceIdentifier: mydbinstance
DBName: mydb
DBInstanceClass: db.m5.large
AllocatedStorage: 50
Engine: MySQL
EngineVersion: 8.0.16
MasterUsername: admin
MasterUserPassword: SecretPassword01
PubliclyAccessible: true
変更後
yaml
Resources:
MyDB:
Type: "AWS::RDS::DBInstance"
Properties:
DBInstanceIdentifier: mydbinstance
DBName: mydb
DBInstanceClass: db.m5.large
AllocatedStorage: 50
Engine: MySQL
EngineVersion: 8.0.16
MasterUsername: admin
MasterUserPassword: SecretPassword01
PubliclyAccessible: false
説明:
- 変更前:
PubliclyAccessible: trueで公開アドレスの使用を有効にします。外部から実際に接続できるかどうかは、ルーティングとセキュリティグループにも依存します。 - 変更後:
PubliclyAccessible: falseで公開アドレスの使用を無効にします。必要なプライベート接続、認証、パスワード管理、セキュリティグループは別途構成し、検証する必要があります。