説明
RDSのpublicly_accessibleは、インスタンスで公開アドレスを使うかどうかを制御します。公開アクセスが有効で、サブネットのルーティングとセキュリティグループも外部接続を許可していれば、インターネットからデータベースへの接続を試みられます。データへのアクセスには、データベースの認証と権限も必要です。
内部接続だけを使うデータベースでは公開アドレスを使用せず、必要なアプリケーション接続と管理経路だけを許可する必要があります。
想定される影響
- 接続が不要な外部クライアントにも、データベースへの接続を試みる経路ができる可能性があります。
- 認証情報の漏えいや過剰な権限が重なると、不正なデータの読み取り・変更のリスクが高まります。公開アドレスだけで、認証なしにデータへアクセスできるわけではありません。
対処方法
- 内部用インスタンスには
publicly_accessible = falseを明示してください。モジュールを使う場合は、入力値が実際のインスタンス設定に反映されることを確認してください。 - インターネットへの直接経路がないサブネットを使い、セキュリティグループとネットワークACLで必要なクライアントだけを許可してください。外部のプライベートネットワークにはVPNやDirect Connectなどの接続を準備し、DNSと認証をテストしてください。
- 公開アクセスの変更は
apply_immediatelyに関係なく即時に適用され、DB自体は停止しません。ただし、公開経路を使っていたクライアントは接続できなくなる可能性があります。代替経路を先に確認し、同時に適用されるほかの変更の影響もterraform planで確認してください。
例
以下の部分的な例では、同じリソースの公開アクセス設定を変更します。対応するdb_instance_class、同じVPCのDBサブネットグループ、必要なセキュリティグループIDの変数を定義してください。ルーティングとアクセス規則を構成し、RDSが管理するパスワードとTerraformの状態へのアクセスも保護する必要があります。
変更前
hcl
resource "aws_db_instance" "public_instance" {
allocated_storage = 20
storage_type = "gp2"
engine = "mysql"
instance_class = var.db_instance_class
db_name = "mydb"
username = "foo"
manage_master_user_password = true
db_subnet_group_name = var.db_subnet_group_name
vpc_security_group_ids = var.db_security_group_ids
publicly_accessible = true
}
変更後
hcl
resource "aws_db_instance" "public_instance" {
allocated_storage = 20
storage_type = "gp2"
engine = "mysql"
instance_class = var.db_instance_class
db_name = "mydb"
username = "foo"
manage_master_user_password = true
db_subnet_group_name = var.db_subnet_group_name
vpc_security_group_ids = var.db_security_group_ids
publicly_accessible = false
}
説明:
- 変更前: 公開アドレスを使用する設定です。実際の外部接続には、ルーティングとセキュリティグループによる許可も必要です。
- 変更後: 公開アドレスの使用を無効にしています。必要なクライアントがプライベート経路を使い、適切な認証と権限で接続できることを確認してください。