公開アクセスが有効な RDS インスタンス

RDS の公開アクセスは、不要な外部接続経路を作る可能性があります。内部用データベースにはプライベート接続を使い、経路とアクセス権限も制限してください。

説明

publiclyAccessible: true は、RDS インスタンスでパブリック IP アドレスを使用する設定です。実際にインターネットから接続するには、サブネットのルーティング、セキュリティグループ、DNS などの条件も整っている必要があります。データベースの認証と権限は別途適用されます。

内部アプリケーションだけで使うデータベースに、公開アドレスは必要ありません。公開アクセスを無効にし、アプリケーションと管理作業に必要な経路だけを許可することで、不要な外部接続の可能性を減らせます。

想定される影響

  • インターネットへの経路とセキュリティグループが広い範囲からの接続を許可すると、想定外の利用者がログインや脆弱性の悪用を試みる可能性があります。アカウントの侵害や権限の悪用により、データが漏えいしたり改変されたりするおそれがあります。
  • 現在はセキュリティグループで制限していても、不要なパブリック IP アドレスがあると、後のネットワークルール変更によって外部からの接続経路が開く可能性が残ります。

対処方法

  • 内部用データベースでは publiclyAccessible: false を明示してください。変更前に、VPC 内の接続や VPN などで必要なプライベート経路を確保してください。
  • DB サブネットグループ、ルーティング、セキュリティグループを併せて確認してください。pulumi preview で変更内容を確認し、適用後も必要な接続が利用できることをテストしてください。
  • 公開アクセスが必要な場合は、承認された接続元と必要なデータベースのポートだけを許可してください。データベース認証、最小権限、通信の暗号化を適用し、パスワードを安全に管理してください。

例

次の例は公開アクセスの設定を比較しています。実際のデプロイでは DB サブネットグループとセキュリティグループを指定し、サポートされるエンジンバージョン、インスタンスクラス、ストレージを選んでください。manageMasterUserPassword により、RDS が Secrets Manager でパスワードを管理します。skipFinalSnapshot: true は削除時の最終スナップショットを省略するため、運用環境のバックアップと復旧の要件に合わせて変更してください。

変更前

yaml
name: aws-rds
runtime: yaml
description: An RDS Instance
resources:
  default:
    type: aws:rds:Instance
    properties:
      allocatedStorage: 20
      dbName: mydb
      engine: mysql
      instanceClass: db.t3.micro
      manageMasterUserPassword: true
      skipFinalSnapshot: true
      username: foo
      publiclyAccessible: true

変更後

yaml
name: aws-rds
runtime: yaml
description: An RDS Instance
resources:
  default:
    type: aws:rds:Instance
    properties:
      allocatedStorage: 20
      dbName: mydb
      engine: mysql
      instanceClass: db.t3.micro
      manageMasterUserPassword: true
      skipFinalSnapshot: true
      username: foo
      publiclyAccessible: false

説明: 公開アクセスを無効にすると、パブリック IP アドレスを使用しなくなります。プライベート接続、認証、パスワード管理、バックアップも併せて検証してください。

参考資料