説明
alicloud_db_instance の security_ips に 0.0.0.0/0 を含めると、すべての IPv4 接続元が許可範囲に入ります。接続経路が存在する場合、データベースへのアクセスが不要なクライアントも接続を試みることができます。認証とデータベース権限は引き続き適用されます。
0.0.0.0 は、同じ意味で使える別の表記ではありません。RDS for MySQL の公式資料では無効な入力とされています。エラーを解消するために無制限の 0.0.0.0/0 に変えるのではなく、必要なクライアントのアドレスを指定してください。
IP 許可リストは接続制御の一部です。パブリックエンドポイント、ネットワーク経路、許可リストのネットワークタイプ、セキュリティグループを併せて確認してください。IP 許可リストとセキュリティグループのどちらからも、必要以上のアクセスが許可されていないか確認する必要があります。
想定される影響
- すべての IPv4 接続元を許可し、外部からの接続経路もあると、不要な接続試行にさらされます。認証や権限制御にも問題があれば、データの漏えいや改変につながるおそれがあります。
- 無効な IP の項目は、設定エラーや、意図したアクセス制限が適用されない問題を起こす場合があります。無効な項目自体が、すべての外部アクセスを許可した状態を示すわけではありません。
対処方法
security_ipsから無制限の範囲と無効な項目を削除し、必要なクライアントの実際の IP アドレスか、必要最小限の CIDR 範囲に置き換えてください。NAT を経由する場合は、実際の接続で使われる接続元アドレスを確認してください。- 許可リストのネットワークタイプとセキュリティグループを併せて確認し、パブリックエンドポイントが不要なら内部接続を使ってください。データベースの権限と通信の暗号化も適切に設定してください。
- 使用するプロバイダーのスキーマで構成を検証し、変更計画を確認してください。適用後は、必要なアプリケーション接続と管理接続が維持され、承認されていない接続元が拒否されることをテストしてください。
例
以下は許可範囲を比較する部分的な例です。変数とネットワークリソースは別途定義し、エンジンバージョン、インスタンスクラス、ストレージ容量は、利用するリージョンでサポートされる組み合わせを選んでください。connect_timeout の値もアプリケーションの要件に合わせて確認してください。
すべての IPv4 アドレスを許可
resource "alicloud_db_instance" "default" {
engine = "MySQL"
engine_version = var.engine_version
instance_type = var.instance_type
instance_storage = var.instance_storage
security_ips = ["0.0.0.0/0", "10.23.12.0/24"]
parameters {
name = "connect_timeout"
value = "50"
}
}
0.0.0.0/0 には、すべての IPv4 アドレスが含まれます。同じリストにプライベートな範囲を追加しても、アクセス範囲は狭まりません。
必要なクライアントだけを許可
resource "alicloud_db_instance" "default" {
engine = "MySQL"
engine_version = var.engine_version
instance_type = var.instance_type
instance_storage = var.instance_storage
security_ips = ["10.23.12.24"]
parameters {
name = "connect_timeout"
value = "50"
}
}
1 つのクライアントアドレスだけを指定します。アクセスが必要な実際のアドレスに置き換え、正しいネットワークタイプに適用してください。許可リスト全体、セキュリティグループ、接続経路、認証も併せて確認する必要があります。