説明
Cloud SQLの公開IPに直接接続できるアドレス範囲が広すぎると、データベースに接続する必要がないクライアントからも接続試行を受ける可能性があります。authorized_networksの0.0.0.0/0は、すべてのIPv4アドレスを含みます。ネットワーク接続が許可されても、データベースの認証と権限は別途必要です。
公開IPに承認済みネットワークがないことは、インターネット上のすべてのアドレスから直接接続できることを意味しません。Cloud SQL Auth Proxyやコネクタは、適切に認証すれば承認済みネットワークの登録なしで接続でき、公開IPと非公開IPのどちらの経路でも使用できます。
想定される影響
- 不要に広い接続範囲は、認証情報を狙う攻撃や脆弱性の悪用を試みる機会を増やす可能性があります。
- 許可されたクライアントが有効な認証情報とデータベース権限を持つ場合、意図しないデータ参照や変更につながるおそれがあります。
対処方法
- 公開IPへの直接接続が必要な場合は、
authorized_networksで実際に必要なクライアントアドレスだけを許可し、不要な全範囲の指定を削除してください。 - 非公開アクセスだけが必要な場合は、非公開IPまたはPrivate Service Connectの経路を準備してテストしてから、公開IPを無効にしてください。IPの接続経路とProxy・コネクタの使用は分けて判断してください。
- IAMとデータベースの認証・権限を確認し、必要な接続は成功し、許可していない直接接続は拒否されることを検証してください。
ipv4_enabledを省略しても公開IPは無効になりません。
例
使用するプロバイダーとデータベースのバージョンがサポートされていることを確認してください。変更後の例には、別途定義したgoogle_compute_network.privateとプライベートサービスアクセス接続が必要です。既存インスタンスに適用する場合は、名前の変更を含むTerraformの計画と接続の切り替えを確認してください。
変更前
hcl
resource "google_sql_database_instance" "public_sql_instance" {
name = "postgres-instance-2"
database_version = "POSTGRES_11"
settings {
tier = "db-f1-micro"
ip_configuration {
authorized_networks {
name = "pub-network"
value = "0.0.0.0/0"
}
}
}
}
公開IPへの直接接続を許可する範囲に、すべてのIPv4アドレスを含めています。データベース認証を省略する設定ではありません。
変更後
hcl
resource "google_sql_database_instance" "private_sql_instance" {
name = "private-instance-1"
database_version = "POSTGRES_11"
settings {
tier = "db-f1-micro"
ip_configuration {
ipv4_enabled = false
private_network = google_compute_network.private.id
}
}
}
公開IPv4を無効にし、VPCネットワークを指定しています。これらの設定に加えて必要な非公開接続を構成し、クライアントの接続を確認してください。