ネットワークアクセス設定の確認が必要な Cloud SQL インスタンス

Cloud SQL の IP 設定と承認済みネットワークを確認し、必要なクライアントだけが接続できるように構成します。

説明

Cloud SQL の IP 設定では、パブリック IP を使用するかどうかと、直接接続を許可するネットワークを指定します。承認済みネットワークの範囲が広すぎると、接続する必要のないクライアントもデータベースへのアクセスを試みることができます。特に 0.0.0.0/0 はすべての IPv4 アドレスを含むため、必要なクライアントだけに接続を制限できません。

パブリック IP の使用、ネットワーク接続の許可、データベースの認証は別々の制御です。承認済みネットワークは IP アドレスを指定した直接接続に適用されます。Cloud SQL Auth Proxy は、承認済みネットワークのリストがなくても、IAM 権限を確認したうえで接続を提供できます。IP 設定や承認済みネットワークが省略されている場合は、接続方式と稼働中のインスタンスの実際の設定を合わせて確認する必要があります。

想定される影響

  • ネットワーク設定が不要な外部接続を許可していると、望ましくないクライアントからデータベースの認証を試みられる可能性があります。
  • 認証やデータベースの権限にも問題がある場合は、データの漏えいや変更につながるおそれがあります。パブリック IP があるだけで、データへのアクセス権限まで付与されるわけではありません。
  • アドレス範囲が誤っていたり、接続方式に合わない設定があったりすると、正常なアプリケーションの接続が妨げられたり、意図した範囲を超えてアクセスが許可されたりする場合があります。

対処方法

  • 必要なプライベートまたはパブリックのネットワーク経路を決め、その経路で認証を伴うコネクタを使うか直接接続するかを選んでください。コネクタでもプライベート IP を使えます。パブリック IP が不要なら、プライベート接続の経路を用意してから無効にしてください。
  • 直接接続では、実際に必要なクライアントのアドレスだけを登録してください。選択した接続方式の承認済みネットワーク要件と、データベースの認証、権限、TLS を確認してください。
  • settings.ip_configuration を明示し、0.0.0.0/0 などの広すぎる許可範囲を削除してください。デプロイ後に実際の設定を確認し、アプリケーションが正常に接続できることを試してください。

IP の設定例

以下は IP 設定を確認するための抜粋であり、完全な構成ではありません。resource_name、プロジェクト、サービスアカウントのファイルパスには、環境に合った値が必要です。文字列 0.0.0.0 は、全 IPv4 アドレス範囲を表す CIDR の 0.0.0.0/0 とは異なります。例のアドレスやネットワーク名を、そのまま信頼できるクライアント情報として使わないでください。

確認が必要な接続設定

yaml
- name: sql_instance
  google.cloud.gcp_sql_instance:
    auth_kind: serviceaccount
    name: "{{ resource_name }}-2"
    project: test_project
    region: us-central1
    service_account_file: /tmp/auth.pem
    settings:
      ip_configuration:
        authorized_networks:
          - name: "google dns server"
            value: "0.0.0.0"
      tier: db-n1-standard-1
    state: present

- name: sql_instance2
  google.cloud.gcp_sql_instance:
    auth_kind: serviceaccount
    name: "{{ resource_name }}-2"
    project: test_project
    region: us-central1
    service_account_file: /tmp/auth.pem
    settings:
      ip_configuration:
        ipv4_enabled: yes
      tier: db-n1-standard-1
    state: present

単一アドレスの指定

yaml
- name: sql_instance
  google.cloud.gcp_sql_instance:
    auth_kind: serviceaccount
    name: "{{ resource_name }}-2"
    project: test_project
    region: us-central1
    service_account_file: /tmp/auth.pem
    settings:
      ip_configuration:
        authorized_networks:
          - name: app-admin-host
            value: 8.8.8.8/32
      tier: db-n1-standard-1
    state: present

補足:

  • 確認が必要な接続設定: 最初のタスクの value: "0.0.0.0" は、実際に必要なクライアントのアドレスに変更してください。二つ目は承認済みネットワークなしで ipv4_enabled: yes を指定しています。接続方式と認証設定の確認が必要であり、この設定だけで誰でも直接接続できるわけではありません。
  • 単一アドレスの指定: 8.8.8.8/32 は Google Public DNS のアドレス一つを表します。app-admin-host という名前を付けても、組織の管理用ホストにはなりません。実際のクライアントのアドレスを確認して設定してください。

参考資料