Google Cloud Load Balancing 用の SSL プロキシの設定

Google Cloud SSL プロキシは、グローバル負荷分散層でユーザー SSL(TLS)接続を停止し、SSL または TCP を介してインスタンス全体で接続を分散します。Cloud SSL プロキシは HTTP(S) 以外のトラフィックを対象にしています。HTTP(S) トラフィックの場合は、代わりに HTTP(S) 負荷分散を使用することをおすすめします。

SSL 負荷分散は、IPv4 アドレスと IPv6 アドレスのクライアント トラフィックに対応しています。クライアントの IPv6 リクエストは、グローバル負荷分散層で終了し、IPv4 経由でバックエンドに送信されます。

概要

SSL トラフィックに SSL(TLS)プロキシを使用すると、グローバル負荷分散層で SSL セッションを停止し、SSL(推奨)または TCP を使用して仮想マシン インスタンスにトラフィックを転送できます。

SSL プロキシは、グローバル負荷分散サービスです。複数のリージョンにインスタンスをデプロイできます。また、ロードバランサによって、容量のある最も近いリージョンにトラフィックが自動的に転送されます。最も近いリージョンが容量に達すると、ロードバランサは使用可能な容量を持つ別のリージョンに新しい接続を自動的に転送します。既存のユーザー接続は現在のリージョンにそのまま残ります。

最高レベルのセキュリティを実現するには、SSL プロキシのデプロイに、エンドツーエンドの暗号化を使用します。これを行うには、使用するバックエンド サービスを、SSL を介したトラフィックを受け入れるように構成します。これにより、SSL プロキシ層で復号化されたクライアント トラフィックは、バックエンド インスタンスに送信される前に、もう一度暗号化されるようになります。このエンドツーエンドの暗号化では、SSL 処理を行えるように、インスタンスに証明書と鍵を用意しておく必要があります。

SSL プロキシの利点

  • 高度なルーティング機能 - ロードバランサによって、容量のあるバックエンドの場所にリクエストをルーティングできます。それに対して、L3/L4 ロードバランサは容量に注意を払わずにリージョンのバックエンドにルーティングする必要があります。より高度なルーティングを使用すると、x*N ではなく、N+1 または N+2 でプロビジョニングできるようになります。
  • 仮想マシン インスタンスのより効率的な使用 - 使用されている暗号の CPU 効率が良くない場合、SSL 処理によって CPU に多大な負担が掛かる可能性があります。CPU パフォーマンスを最大限まで高めるために、ロードバランサとインスタンスの間の SSL に ECDSA SSL 証明書、TLS1.2、そして可能であれば ECDHE-ECDSA-AES128-GCM-SHA256 暗号化スイートを使用します。
  • 証明書の管理 - 証明書を切り替える必要がある場合、1 か所で証明書を使用している顧客を更新するだけで済みます。また、自己署名証明書を使用してインスタンスの管理オーバーヘッドを削減することもできます。
  • セキュリティ パッチ - SSL または TCP スタックで脆弱性が生じると、インスタンスが安全に保てるように、ロードバランサで自動的にパッチを適用します。
  • SSL プロキシでは、次のポートがサポートされています。25、43、110、143、195、443、465、587、700、993、995、1883、5222

注:

  • グローバル負荷分散層とインスタンスの間で、暗号化されていない TCP でトラフィックを送信するようにすると、インスタンスから SSL 処理をオフロードできますが、同時に、グローバル負荷分散層とインスタンスの間のセキュリティが低下するため、そのような処理はおすすめしません。
  • SSL プロキシで HTTPS を処理することもできますが、推奨されません。HTTPS の場合は、代わりに HTTP(S)負荷分散を使用する必要があります。詳細については、よくある質問をご覧ください。
  • gcloud コマンドライン ツールを使用して SSL ポリシーを作成できます。

次に、SSL プロキシの仕組みを説明し、複数のインスタンスにトラフィックが負荷分散されるように SSL プロキシを設定する方法について詳しく説明していきます。

SSL プロキシを使用した Google Cloud 負荷分散

グローバル負荷分散層に SSL プロキシを設定すると、SSL 接続はグローバル層で停止され、使用可能な最も近いインスタンス グループへプロキシ処理されます。

この例では、Iowa と Boston のユーザーからのトラフィックはグローバル負荷分散層で停止され、分割された接続は選択されたバックエンド サービスに向かうように設定されます。

SSL ターミネーションを使用した Google Cloud Load Balancing(クリックして拡大)
SSL ターミネーションを使用した Google Cloud Load Balancing(クリックして拡大)

SSL 負荷分散の設定

この例は、us-central1us-east1 という 2 つのリージョンに存在する単純なサービスに対してグローバル SSL 負荷分散を設定する様子を示しています。次を設定します。

  1. 2 つのリージョンに分散している 4 つのインスタンス
  2. インスタンスを保持するインスタンス グループ
  3. バックエンド コンポーネント。次のものが含まれます。
    • ヘルスチェック - インスタンスの正常性をモニタリングします。
    • バックエンド サービス - インスタンス グループをモニタリングし、設定の超過を防止します。
    • バックエンド - インスタンス グループを保持します。
  4. フロントエンド コンポーネント。次のものが含まれます。
    • SSL 証明書のリソース
    • SSL 証明書を使用する SSL プロキシ自体
    • ユーザーのトラフィックをプロキシに送信する外部静的 IPv4 アドレスと転送ルール
    • ユーザーのトラフィックをプロキシに送信する外部静的 IPv6 アドレスと転送ルール
    • オプションの SSL ポリシー
  5. ロードバランサおよびヘルス チェッカーからの、インスタンスへのトラフィックを許可するファイアウォール ルール

その後、構成をテストします。

インスタンスとインスタンス グループの設定

このセクションでは、インスタンスおよびインスタンス グループを作成し、インスタンス グループにインスタンスを追加する方法を説明します。本番環境システムであれば、通常はインスタンス テンプレートに基づくマネージド インスタンス グループが使用されますが、初期テストを行う場合にはこの設定を使用した方が簡単です。

インスタンスの作成

テストの目的で、4 つのインスタンス、2 つのインスタンスのグループのそれぞれ 2 つに Apache をインストールしてください。通常、HTTP トラフィックには SSL 負荷分散を使用しませんが、Apache は広く使用されており、テスト用に簡単に設定できます。

これらのインスタンスはすべて ssl-lb のタグで作成されます。このタグは後でファイアウォール ルールによって使用されます。

Console


インスタンスの作成

  1. Google Cloud Platform Console の [VM インスタンス] ページに移動します。
    [VM インスタンス] ページに移動
  2. [インスタンスを作成] をクリックします。
  3. [名前] を ig-us-central1-1 に設定します。
  4. [ゾーン] を us-central1-b に設定します。
  5. [管理、ディスク、ネットワーキング、SSH キー] をクリックすると、拡張設定が表示されます。
  6. [管理] の [ネットワーキング] をクリックし、[タグ] フィールドに「ssl-lb」と入力します。
  7. [管理] をクリックし、[起動スクリプト] を次のとおりに設定します。
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-central1-1</h1></body></html>' | sudo tee /var/www/html/index.html
  8. 残りのフィールドはデフォルト値のままにします。
  9. [作成] をクリックします。
  10. 同じ設定で ig-us-central1-2 を作成します。ただし、[起動スクリプト] は次のように設定します。
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-central1-2</h1></body></html>' | sudo tee /var/www/html/index.html
  11. 同じ設定で ig-us-east1-1 を作成します。ただし、[ゾーン] には us-east1-b を設定し、[起動スクリプト] は次のように設定します。
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-east1-1</h1></body></html>' | sudo tee /var/www/html/index.html
  12. 同じ設定で ig-us-east1-2 を作成します。ただし、[ゾーン] には us-east1-b を設定し、[起動スクリプト] は次のように設定します。
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-east1-2</h1></body></html>' | sudo tee /var/www/html/index.html

gcloud


  1. ゾーン us-central1-big-us-central1-1 を作成します。

    gcloud compute instances create ig-us-central1-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-central1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US central 1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-1].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b n1-standard-1             10.240.0.8  23.251.150.133 RUNNING

  2. ゾーン us-central1-big-us-central1-2 を作成します。

    gcloud compute instances create ig-us-central1-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-central1-b \
         --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
           echo '<!doctype html><html><body><h1>SSL load balanced instance - US central 2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-2].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-2 us-central1-b n1-standard-1             10.240.0.11 23.251.148.160 RUNNING

  3. ゾーン us-east1-big-us-east1-1 を作成します。

    gcloud compute instances create ig-us-east1-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-east1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US east 1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-1].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-1 us-east1-b n1-standard-1             10.240.0.12 104.196.31.214 RUNNING

  4. ゾーン us-east1-big-us-east1-2 を作成します。

    gcloud compute instances create ig-us-east1-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-east1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US east 2</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-2].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-2 us-east1-b n1-standard-1             10.240.0.13 104.196.25.101 RUNNING

各ゾーンでのインスタンス グループの作成とインスタンスの追加

Console


  1. Google Cloud Platform Console の [インスタンス グループ] ページに移動します。
    [インスタンス グループ] ページに移動
  2. [インスタンス グループを作成] をクリックします。
  3. [名前] を us-ig1 に設定します。
  4. [ゾーン] を us-central1-b に設定します。
  5. [ポート名のマッピングを指定する] をクリックします。
    1. [ポート名] を ssl-lb に設定します。
    2. [ポート番号] を 443 に設定します。
  6. [グループ タイプ] で、[非マネージド インスタンス グループ] を選択します。
  7. [VM インスタンス] から ig-us-central1-1ig-us-central1-2 を選択します。
  8. その他の設定はそのまま使用します。
  9. [作成] をクリックします。
  10. 上記のステップを繰り返します(次のように設定します)。
    • 名前: us-ig2
    • ゾーン: us-east1-b
    • ポート名: ssl-lb
    • ポート番号: 443
    • インスタンス: ig-us-east1-1ig-us-east1-2
  11. 2 つのインスタンスにそれぞれ 2 つのインスタンス グループが作成されたことを確認してください。

gcloud


  1. us-ig1 インスタンス グループを作成します。

    gcloud compute instance-groups unmanaged create us-ig1 --zone us-central1-b
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].
    NAME   ZONE          NETWORK MANAGED INSTANCES
    us-ig1 us-central1-b                 0

  2. インスタンス グループの名前付きポートを設定します。

    gcloud compute instance-groups set-named-ports us-ig1 \
        --named-ports ssl-lb:443 \
        --zone us-central1-b
    

  3. ig-us-central1-1ig-us-central1-2us-ig1 に追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig1 \
        --instances ig-us-central1-1,ig-us-central1-2 \
        --zone us-central1-b
    

    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].

  4. us-ig2 インスタンス グループを作成します。

    gcloud compute instance-groups unmanaged create us-ig2 --zone us-east1-b
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].
    NAME   ZONE       NETWORK MANAGED INSTANCES
    us-ig2 us-east1-b                 0

  5. インスタンス グループの名前付きポートを設定します。

    gcloud compute instance-groups set-named-ports us-ig2 \
        --named-ports ssl-lb:443 \
        --zone us-east1-b
    

  6. ig-us-east1-1ig-us-east1-2us-ig2 に追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig2 \
         --instances ig-us-east1-1,ig-us-east1-2 \
         --zone us-east1-b
    

    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].

これで、それぞれが 2 つのインスタンスを持つ 2 つのリージョンに 1 つのインスタンス グループができました。

ロードバランサの構成

Console


ロードバランサの作成とバックエンド サービスの構成

  1. Google Cloud Platform Console の [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. [ロードバランサを作成] をクリックします。
  3. [TCP 負荷分散] で [設定を開始] をクリックします。
  4. [インターネット接続または内部専用] で [インターネットから自分の VM へ] を選択します。
  5. [接続終了] の下で、[はい(SSL プロキシ)] を選択します。
  6. [続行] をクリックします。
  7. [名前] を my-ssl-lb に設定します。
  8. [バックエンドの設定] をクリックします。
  9. バックエンド サービスの [名前] が my-ssl-lb と表示されます。
  10. [プロトコル] を SSL に設定します。
  11. [新しいバックエンド] の下で、インスタンス グループ us-ig1 を選択します。
  12. [ポート番号] を 443 に設定します。
  13. その他の設定はそのまま使用します。
  14. [バックエンドを追加] をクリックします。
  15. インスタンス グループ us-ig2 を選択します。
  16. [ポート番号] を 443 に設定します。
  17. [ヘルスチェック] で [ヘルスチェックを作成] を選択します。
    1. ヘルスチェックの [名前] を my-ssl-health-check に設定します。
    2. [プロトコル] を SSL に設定します。
    3. 他の設定はそのままにします。
    4. [保存して次へ] をクリックします。
  18. Google Cloud Platform Console で、[バックエンドの設定] の横に緑色のチェックマークが表示されていることを確認します。表示されていない場合には、上のすべてのステップが完了していることを再度確認してください。

フロントエンド サービスの構成

  1. [フロントエンドの設定] をクリックします。
  2. [新しいフロントエンドの IP とポート] の [名前] に「my-ssl-lb-forwarding-rule」と入力します。
  3. [IP アドレス] で [IP アドレスを作成] を選択します。
    1. [名前] に「ssl-lb-static-ip」と入力します。
    2. [予約] をクリックします。
  4. [証明書] の下で、[新しい証明書の作成] を選択します。
    1. [名前] に「my-ssl-cert」と入力します。
    2. 適切なフィールドに、以下をアップロードします。
      • 公開鍵証明書(crt ファイル)
      • 証明書チェーン(csr ファイル)
      • 秘密鍵(key ファイル)
    3. 別の SSL 証明書を追加するには、[証明書を追加] をクリックし、[証明書] プルダウン メニューから証明書を選択するか、[新しい証明書の作成] を選択して上記の手順に従います。
    4. 必要に応じてプロキシ プロトコルをオンにします。
    5. [作成] をクリックします。
  5. [完了] をクリックします。
  6. [フロントエンド IP とポートの追加] をクリックします。
  7. [名前] に「my-ssl-lb-ipv6-forwarding-rule」と入力します。
  8. [IP バージョン] を IPv6 に設定します。
  9. [IP アドレス] で [IP アドレスを作成] を選択します。
    1. [名前] に「ssl-lb-static-ipv6」と入力します。
    2. [予約] をクリックします。
  10. [証明書] で my-ssl-cert を選択します。
  11. [完了] をクリックします。
  12. Google Cloud Platform Console で、[フロントエンドの設定] の横に緑色のチェックマークが表示されていることを確認します。表示されていない場合には、上のすべてのステップが完了していることを再度確認してください。

確認と完了

  1. [確認と完了] をクリックします。
  2. 設定を再度確認します。
  3. [作成] をクリックします。

gcloud


ヘルスチェックの作成

gcloud compute health-checks create ssl my-ssl-health-check --port 443

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/healthChecks/my-ssl-health-check].
NAME                PROTOCOL
my-ssl-health-check SSL

バックエンド サービスの作成

gcloud compute backend-services create my-ssl-lb \
    --protocol SSL \
    --health-checks my-ssl-health-check \
    --timeout 5m \
    --global

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].
NAME      BACKENDS PROTOCOL
my-ssl-lb          SSL

あるいは、--protocol TCP を使用して、ロードバランサからインスタンスへの暗号化されていない通信を設定することもできます。

バックエンド サービスへのインスタンス グループの追加

gcloud compute backend-services add-backend my-ssl-lb \
    --instance-group us-ig1 \
    --instance-group-zone us-central1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8 \
    --global

Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].

gcloud compute backend-services add-backend my-ssl-lb \
    --instance-group us-ig2 \
    --instance-group-zone us-east1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8 \
    --global

Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].

SSL 証明書リソースの設定

アップロードする SSL 証明書を少なくとも 1 つ持っている必要があります。ない場合は、SSL 証明書をご覧ください。複数の SSL 証明書を使用する場合は、一度に 1 つずつ作成する必要があります。

gcloud compute ssl-certificates create my-ssl-cert \
    --certificate [CRT_FILE_PATH] \
    --private-key [KEY_FILE_PATH]

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates/ssl-cert1].
NAME      CREATION_TIMESTAMP
ssl-cert1 2016-02-20T20:53:33.584-08:00

ターゲット SSL プロキシの設定

SSL 負荷分散では、1~10 枚の SSL 証明書を設置できるターゲット SSL プロキシの作成をサポートしています。次のコマンドを実行する前に、SSL 証明書ごとにそのリソースを作成する必要があります。

プロキシ ヘッダーをオンにする場合は、PROXY_V1 ではなく none に設定します。

オプションで、ターゲット プロキシに SSL ポリシーを添付できます。まず、ポリシーを作成します。

gcloud beta compute ssl-policies create my-ssl-policy \
    --profile MODERN --min-tls-version 1.0

その後、ポリシーをターゲット プロキシに添付します。

gcloud compute target-ssl-proxies create my-ssl-lb-target-proxy \
    --backend-service my-ssl-lb \
    --ssl-certificates [SSL_CERT_1][,[SSL_CERT_2],...] \
    --ssl-policy my-ssl-policy
    --proxy-header NONE

[https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy] が作成されます。 NAME PROXY_HEADER SERVICE SSL_CERTIFICATES my-ssl-lb-target-proxy NONE my-ssl-lb ssl-cert1

グローバル静的 IPv4 アドレスと IPv6 アドレスの予約

これらの IP アドレスは、負荷分散されたサービスにユーザー(顧客)がアクセスするときに使用されます。

gcloud compute addresses create ssl-lb-static-ipv4 \
        --ip-version=IPV4 \
        --global

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/ssl-lb-static-ip].
NAME                 REGION ADDRESS               STATUS
ssl-lb-static-ip            [LB_STATIC_IP]        RESERVED

gcloud compute addresses create ssl-lb-static-ipv6 \
        --ip-version=IPV6 \
        --global

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/ssl-lb-static-ipv6].
NAME                 REGION ADDRESS                 STATUS
ssl-lb-static-ipv6          [LB_STATIC_IPV6]        RESERVED

グローバル転送ルールの設定

ターゲット プロキシに関連付けるグローバル転送ルールを作成します。[LB_STATIC_IP][LB_STATIC_IPV6] を、[グローバル静的 IP アドレスの予約] で生成した IP アドレスに置き換えます。

gcloud compute forwarding-rules create my-ssl-lb-forwarding-rule \
    --global \
    --target-ssl-proxy my-ssl-lb-target-proxy \
    --address [LB_STATIC_IP] \
    --ports 443

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-forwarding-rule].
NAME                         REGION IP_ADDRESS     IP_PROTOCOL TARGET
my-ssl-lb-forwarding-rule           [LB_STATIC_IP] SSL         my-ssl-lb-target-proxy

gcloud compute forwarding-rules create my-ssl-lb-ipv6-forwarding-rule \
    --global \
    --target-ssl-proxy my-ssl-lb-target-proxy \
    --address [LB_STATIC_IPV6] \
    --ports 443

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-ipv6-forwarding-rule].
NAME                           REGION    IP_ADDRESS       IP_PROTOCOL TARGET
my-ssl-lb-ipv6-forwarding-rule           [LB_STATIC_IPV6] SSL         my-ssl-lb-target-proxy

SSL ロードバランサのファイアウォール ルールの作成

ロードバランサとヘルス チェッカーからインスタンスへのトラフィックを許可するファイアウォール ルールを設定します。

Console


  1. Google Cloud Platform Console で [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動
  2. [ファイアウォール ルールの作成] をクリックします。
  3. [名前] に「allow-ssl-lb-and-health」と入力します。
  4. [VPC ネットワーク] に default を選択します。
  5. [ソースフィルタ] に IP ranges を設定します。
  6. [ソース IP 範囲] に 130.211.0.0/2235.191.0.0/16 を設定します。
  7. [許可対象プロトコルとポート] に tcp:443 を設定します。
  8. [ターゲットタグ] に ssl-lb を設定します。
  9. [作成] をクリックします。

gcloud


gcloud compute firewall-rules create allow-ssl-lb-and-health \
     --source-ranges 130.211.0.0/22,35.191.0.0/16 \
     --target-tags ssl-lb \
     --allow tcp:443

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-lb-and-health].
NAME                     NETWORK SRC_RANGES                  RULES   SRC_TAGS TARGET_TAGS
allow-ssl-lb-and-health default 130.211.0.0/22,35.191.0.0/16 tcp:443          ssl-lb

ロードバランサのテスト

ウェブブラウザで、HTTPS を介して静的 IP アドレスに接続します。このテスト設定では、インスタンスは自己署名証明書を使用します。このため、ページに初めてアクセスしたときに、ブラウザに警告が表示されます。警告は無視してクリックし、実際のページを表示してください。[IP_ADDRESS] は、作成した IPv4 または IPv6 アドレスに置き換えます。

https://[IP_ADDRESS]

ユーザーに最も近いリージョンからいずれかのホストが表示されます。そのリージョンの他のインスタンスが表示されるまでページをリロードします。他のリージョンからインスタンスを表示するには、最も近いリージョンでインスタンスを停止します。

あるいは、ローカルマシンのコマンドラインから curl を使用することもできます。SSL プロキシで自己署名証明書を使用する場合、-k も指定する必要があります。curl -k オプションを指定すると、自己署名証明書しかない場合や証明書がない場合でも curl が機能します。通常の証明書がある場合はこのパラメータを削除してもかまいません。独自のサイトをテストする場合にのみ、-k パラメータを使用してください。通常の状況下では有効な証明書が重要なセキュリティ手段です。証明書の警告は無視しないでください。

[IP_ADDRESS] は、作成した IPv4 または IPv6 アドレスに置き換えます。

curl -k https://[IP_ADDRESS]

追加 SSL プロキシ コマンド

ターゲット SSL プロキシをリスト

Console


Google Cloud Platform コンソールのターゲット プロキシ リストページに移動します。
ターゲット プロキシ リストページに移動

gcloud


gcloud compute target-ssl-proxies list

NAME                   PROXY_HEADER SERVICE   SSL_CERTIFICATES
my-ssl-lb-target-proxy NONE         my-ssl-lb ssl-cert1

ターゲット SSL プロキシの記述

Console


  1. Google Cloud Platform コンソールのターゲット プロキシ リストページに移動します。
    ターゲット プロキシ リストページに移動
  2. ターゲット SSL プロキシの名前をクリックします。

gcloud


gcloud compute target-ssl-proxies describe [PROXY_NAME]

creationTimestamp: '2016-02-20T20:55:17.633-08:00'
id: '9208913598676794842'
kind: compute#targetSslProxy
name: my-ssl-lb-target-proxy
proxyHeader: NONE
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy
service: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb
sslCertificates:
- https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates/ssl-cert1

ターゲット SSL の削除

ターゲット プロキシを削除するには、まず、そのターゲット プロキシを参照しているグローバル転送ルールを削除する必要があります。

Console


  1. Google Cloud Platform コンソールのグローバル転送ルール リストページに移動します。
    グローバル転送ルール リストページに移動
  2. グローバル転送ルールの隣にあるチェックボックスを選択します。
  3. [削除] をクリックします。
  4. Google Cloud Platform コンソールのターゲット プロキシ リストページに移動します。
    ターゲット プロキシ リストページに移動
  5. ターゲット SSL プロキシの隣のチェック ボックスを選択します。
  6. [削除] をクリックします。

または、次の手順を実行し、すべてのロードバランサ コンポーネントを削除することができます。

  1. Google Cloud Platform Console の [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. 削除する行の右側にある、ゴミ箱アイコンをクリックします。
  3. [ロードバランサを削除] をクリックします。

gcloud


  1. グローバル転送ルールを削除します。

    gcloud compute forwarding-rules delete my-ssl-lb-forwarding-rule \
        --global
    

    The following global forwarding rules will be deleted:
     - [my-ssl-lb-forwarding-rule]

    Do you want to continue (Y/n)? y

    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-forwarding-rule].

  2. SSL プロキシを削除します。

    gcloud compute target-ssl-proxies delete my-ssl-lb-target-proxy
    

    The following target ssl proxies will be deleted:
     - [my-ssl-lb-target-proxy]

    Do you want to continue (Y/n)? y

    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].

ターゲット SSL プロキシのバックエンド サービスの更新

update コマンドを使用すると、別のバックエンド サービスで SSL プロキシを指示できます。この例では、新しいバックエンド サービスを作成し、そこでプロキシを指示します。更新を行った後で、元のバックエンド サービスを参照するようにプロキシに指示します。

Console


このステップでは、gcloud コマンドライン ツールを使用します。

gcloud


  1. 同じヘルスチェックを使用して、2 番目のバックエンド サービスを作成します。

    gcloud compute backend-services create my-other-backend-service \
        --protocol SSL \
        --health-checks my-ssl-health-check \
        --global
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-other-backend-service].
    NAME                     BACKENDS PROTOCOL
    my-other-backend-service          SSL

  2. 新しいバックエンドで SSL プロキシを指示します。

    gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
        --backend-service my-other-backend-service
    

    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].

  3. このバックエンド サービスにはインスタンスが含まれていないため、この時点でプロキシを使用しようとしても、ウェブページは取得できません。元の構成のテストを続行するには、最初のバックエンド サービスで SSL プロキシを指示し直します。

    gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
        --backend-service my-ssl-lb
    

    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].

ターゲット SSL プロキシの SSL 証明書リソースの更新

このコマンドを使用して、SSL プロキシの SSL 証明書を置き換えます。必要な追加の SSL 証明書リソースを作成しておく必要があります。

Console


  1. Google Cloud Platform Console の [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. ロードバランサの隣にある [編集] をクリックします。
  3. [フロントエンドの設定] をクリックします。
  4. [証明書] プルダウン メニューで、新しい証明書を選択します。
  5. 証明書を追加する必要がある場合は、[Add certificate] をクリックします。
  6. [完了] をクリックします。

gcloud


最大 10 枚の SSL 証明書を使用する場合:

gcloud compute target-ssl-proxies set-ssl-certificates {PROXY_NAME] \
    --ssl-certificates [SSL_CERT_1][,[SSL_CERT_2],...]

[https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy] が更新されました。

オプション パラメータ

クライアント接続情報を保持するための PROXY プロトコル

SSL プロキシを使用した Google Cloud Load Balancing では、クライアントからの SSL 接続が停止され、インスタンスへの新しい接続が作成されるため、デフォルトで元のクライアント IP とポート情報は保持されません。

この情報を保持し、インスタンスに送信する必要がある場合、PROXY プロトコル(バージョン 1)を有効にする必要があります。この場合、ソース IP アドレス、宛先 IP アドレス、およびポート番号などの元の接続情報を含むヘッダーがさらに追加され、リクエストの一部としてインスタンスに送信されます。

このパラメータは、TCP および SSL ヘルスチェック用に設定することもできます。

一般に、PROXY プロトコル ヘッダーはユーザーが読み取れる単一の行であり、次のような形式になります。

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

PROXY プロトコルの例を以下に示します。

PROXY TCP4 192.0.2.1 198.51.100.1 15221 443\r\n

この例の場合、クライアント IP は 192.0.2.1、負荷分散 IP は 198.51.100.1、クライアント ポートは 15221、宛先ポートは 443 です。

クライアント IP が不明な場合、ロードバランサは次の形式で PROXY プロトコル ヘッダーを生成します。

PROXY UNKNOWN\r\n

プロキシの PROXY プロトコル ヘッダーの更新

このコマンドを使用して、既存のターゲット SSL プロキシの PROXY プロトコル ヘッダーを変更します。

Console


  1. Google Cloud Platform Console の [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. ロードバランサの [編集] をクリックします。
  3. [フロントエンドの設定] をクリックします。
  4. [プロキシ プロトコル] フィールドの値を変更します。
  5. [保存] をクリックして、変更を保存します。

gcloud


gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
    --proxy-header [NONE | PROXY_V1]

接続ドレイン

バックエンド サービスで接続ドレインを有効にすると、トラフィックを処理しているインスタンスが停止されたり、手動で削除されたり、自動スケーラ-によって削除されたりした場合に、ユーザーに対する中断を最小限に抑えることができます。接続ドレインの詳細については、接続ドレインの有効化を参照してください。

ロードバランサ コンポーネント

ヘルスチェック

ヘルスチェックでは、どのインスタンスが新しい接続を受け取れるかが判別されます。インスタンスの正常性を判別するために、TCP、SSL、HTTP、HTTP ヘルスチェックを構成できます。

  • バックエンド インスタンスで実行されているサービスが HTTP に基づく場合は、HTTP ヘルスチェックを使用します
  • バックエンド インスタンスで実行されているサービスが HTTPS に基づく場合は、HTTPS ヘルスチェックを使用します
  • バックエンド インスタンスで実行されているサービスが SSL を使用している場合は、SSL ヘルスチェックを使用します
  • 別の種類のヘルスチェックを使用する明白な理由がない限り、TCP ヘルスチェックを使用します

ヘルスチェックのファイアウォール ルール

負荷分散されたインスタンスのヘルスチェック プローブは、範囲 130.211.0.0/2235.191.0.0/16 のアドレスから受信します。これらの IP アドレス範囲は、ロードバランサがバックエンド インスタンスに接続するために使用されます。ファイアウォール ルールで、関連ポートでのこれらの接続を許可する必要があります。

手順については、SSL ロードバランサのファイアウォール ルールの作成をご覧ください。

ヘルスチェックの詳細については、ヘルスチェックのページをご覧ください。

ある特定の時点での外部 IP アドレスを調べる必要がある場合は、Google Compute Engine のよくある質問の手順に従ってください。

バックエンド サービス

バックエンド サービスは、それに含まれているインスタンス グループの容量、最大使用率、ヘルスチェックを定義します。

  • バックエンド サービスによって、受信するトラフィックは接続された 1 つ以上のバックエンドに送信されます(後で説明する負荷分散モードによって異なります)。各バックエンドは 1 つのインスタンス グループと、そのインスタンス グループ内のインスタンス間のトラフィックを調整する追加構成で構成されています。各インスタンス グループは、1 つ以上のインスタンスで構成されています。
  • 各バックエンド サービスでは、バックエンド サービスに追加されるすべてのインスタンス グループで、インスタンスに対してどのヘルスチェックが行われるかも指定されます。
  • ロードバランサを介したアイドル SSL プロキシ接続の存続期間は、バックエンド サービスのタイムアウトによって制限されます。

バックエンド サービスを設定するときは、インスタンス グループを追加し、各インスタンス グループ内のインスタンスにロードバランサが送信できるトラフィック数を決定する分散モードを指定する必要があります。特定のインスタンス グループの容量に達すると、容量があり、ユーザーに次に近いインスタンス グループに、その後のリクエストが送信されます。

SSL プロキシでは、次の分散モードがサポートされています。

  • UTILIZATION (デフォルト): インスタンス グループの現在の平均 CPU 使用率が、指定された値未満であれば、インスタンスはトラフィックを受け取ることができます。この値を設定するには、--max-utilization パラメータを使用し、0.0(0%)~1.0(100%)の値を渡します。デフォルトは 0.8(80%)です。
  • CONNECTION: 接続数が、指定された値未満であれば、インスタンスはトラフィックを受け取ることができます。この値は、次のいずれかにすることができます。
    • --max-connections: インスタンス グループ内のすべてのバックエンド インスタンスにわたる接続の最大数。
    • --max-connections-per-instance: 1 つのインスタンスが処理できる接続の最大数。グループの平均がこの数値を超えなければ、リクエストは転送されます。

分散モードを UTILIZATION に設定していても、--max-connections または --max-connections-per-instance を指定できます。--max-utilization と接続パラメータの両方が指定されている場合、いずれかの制限に到達すると、グループはすべて使用されているとみなされます。

SSL 証明書と鍵

秘密鍵と署名済み証明書がない場合は、テスト用に自己署名証明書を作成したり、認証局から本物の証明書を取得したりすることができます。詳細については、SSL 証明書を参照してください。本番用ロードバランサで自己署名証明書を使用しないでください。

詳細は SSL 証明書を参照してください。

グローバル転送ルール

グローバル転送ルールを作成して、特定の IP やポートをターゲット SSL プロキシに転送します。顧客のトラフィックが外部 IP アドレスに到達すると、この転送ルールによって、そのトラフィックを SSL プロキシに送信するようにネットワークに伝達されます。

詳細はグローバル転送ルールを参照してください。

推奨

  • クライアントの接続情報を保持する必要がある場合、PROXY プロトコル バージョン 1 ヘッダーを先頭に追加してロードバランサを構成する必要があります。
  • トラフィックが HTTPS の場合、負荷分散には SSL プロキシではなく、HTTPS 負荷分散を使用する必要があります。

トラブルシューティング

ロードバランサの IP からページをロードできない

インスタンスの正常性の確認

インスタンスが HEALTHY であることを確認します。

gcloud compute backend-services get-health my-ssl-lb
---
backend: https://www.googleapis.com/resourceviews/v1/projects/[PROJECT_ID]/zones/us-central1-b/resourceViews/us-ig1
status:
  kind: compute#backendServiceGroupHealth
---
backend: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2
status:
  kind: compute#backendServiceGroupHealth

ファイアウォール ルールが正しいことの確認

  • ヘルス チェッカーとロードバランサの両方で 130.211.0.0/22,35.191.0.0/16 が開いている必要があります。
  • ロードバランサとインスタンスの間で SSL を実行している場合、SSL ヘルスチェックを行う必要があります。その場合、tcp:443130.211.0.0/2235.191.0.0/16 からのファイアウォールで許可されている必要があります。インスタンスに対して TCP を実行している場合、TCP ヘルスチェックを行い、代わりに 130.211.0.0/2235.191.0.0/16 からの tcp:80 を開きます。
  • インスタンス タグを使用している場合、ファイアウォール ルールでそのタグが TARGET_TAGS としてリストにあることを確認し、すべてのインスタンスにそのタグがあることを確認します。この例では、インスタンスには ssl-lb のタグが付けられています。
gcloud compute firewall-rules list
NAME                      NETWORK SRC_RANGES                  RULES                        SRC_TAGS TARGET_TAGS
allow-ssl-lb-and-health  default 130.211.0.0/22,35.191.0.0/16 tcp:443                               ssl-lb

各インスタンスに到達可能なことの確認

インスタンスに個別にアクセスできるファイアウォール ルールを一時的に設定し、特定のインスタンスからページをロードできるか試してみます。

  1. ファイアウォールを開いて、ソースからタグ付けされたインスタンスへのトラフィックを許可します。

    gcloud compute firewall-rules create allow-ssl-0-0-0-0   \
        --source-ranges 0.0.0.0/0   \
        --target-tags ssl-lb    \
        --allow tcp:443
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-0-0-0-0].
    NAME              NETWORK SRC_RANGES RULES   SRC_TAGS TARGET_TAGS
    allow-ssl-0-0-0-0 default 0.0.0.0/0  tcp:443          ssl-lb

  2. いずれかのインスタンスの EXTERNAL_IP アドレスを見つけます。

    gcloud compute instances list
    

    NAME             ZONE           MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b  n1-standard-1             10.240.0.8  EXTERNAL_IP RUNNING
    ig-us-central1-2 us-central1-b  n1-standard-1             10.240.0.11 EXTERNAL_IP RUNNING
    ig-us-east1-1    us-east1-b     n1-standard-1             10.240.0.12 EXTERNAL_IP RUNNING
    ig-us-east1-2    us-east1-b     n1-standard-1             10.240.0.13 EXTERNAL_IP RUNNING

  3. 次に、ブラウザから直接 1 つ以上のインスタンスにアクセスします。

    https://[EXTERNAL_IP]
    
  4. この方法でインスタンスにアクセスできない場合、ソフトウェアが正しく実行されているか確認します。正しく実行されている場合、ロードバランサのファイアウォールが正しいか確認します。

    gcloud compute firewall-rules describe allow-ssl-lb-and-health
    

    allowed:
    - IPProtocol: tcp
      ports:
      - '443'
    creationTimestamp: '2016-02-20T22:27:15.094-08:00'
    description: ''
    id: '5304629236729177644'
    kind: compute#firewall
    name: allow-130-211-0-0-22-ssl
    network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
    selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-lb-and-health
    sourceRanges:
    - 130.211.0.0/22,35.191.0.0/16
    targetTags:
    - ssl-lb

  5. インスタンスが機能していることを確認したら、「from anywhere」ファイアウォールを削除します。

    gcloud compute firewall-rules delete allow-ssl-0-0-0-0
    

    The following firewalls will be deleted:
     - [allow-ssl-0-0-0-0]

    Do you want to continue (Y/n)? y

    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-0-0-0-0].

モニタリング

TCP/SSL 負荷分散は、モニタリング データを Stackdriver にエクスポートします。モニタリング指標は、TCP/SSL プロキシ ロードバランサの設定、使用率、およびパフォーマンスを評価したり、問題をトラブルシュートしたり、リソースの使用率やユーザー エクスペリエンスを向上させたりするために使用できます。

Stackdriver の事前に定義されたダッシュボードに加えて、カスタム ダッシュボードを作成して、アラートをセットアップし、Stackdriver Monitoring API を通して指標を照会することができます。

Stackdriver Monitoring ダッシュボードの表示

  1. Google Cloud Platform Console で Stackdriver にアクセスします。
    Stackdriver に移動
  2. [Resources] > [Google Cloud Load Balancers] を選択します。
  3. ロードバランサの名前をクリックします。

左側のペインでは、このロードバランサのさまざまな詳細を確認できます。右側のペインでは時系列のグラフを表示できます。[Breakdowns] リンクをクリックすると、特定の内訳が表示されます。

指標報告の頻度と保持

ロードバランサの指標は、1 分単位のバッチで Stackdriver にエクスポートされます。モニタリング データは 6 週間保持されます。ダッシュボードは、1H、6H、1D、1W、および 6W のデフォルト間隔のデータ分析を提供します。6W から 1 分までの任意の間隔で手動で分析を要求できます。

TCP/SSL プロキシ ロードバランサの指標

HTTP(S) ロードバランサの次の指標が Stackdriver に報告されます。

指標 説明
着信トラフィック プロキシを通じて外部エンドポイントから設定済みバックエンドに送信されるバイト数(バイト/秒単位)。
発信トラフィック

プロキシを通じて設定済みバックエンドから外部エンドポイントに送信されるバイト数(バイト/秒単位)。
オープン接続 所定のサンプル時点で開いている接続数。サンプルは 1 分間隔で取得されます。
秒あたりの新しい接続 作成された接続数(クライアントがバックエンドに正常に接続された場合)。カウントは 1 分単位の詳細度で行われますが、グラフを調整して秒あたりの値を表示することができます。詳細については、Stackdriver のドキュメントをご覧ください。
秒あたりの閉じた接続 閉じられた接続数。カウントは 1 分単位の粒度で行われますが、グラフを調整して秒あたりの値を表示することができます。詳細については、Stackdriver のドキュメントをご覧ください。
フロントエンド RTT クライアントとプロキシ間の接続ごとに測定された平滑化された RTT の分布(プロキシの TCP スタックによって、アプリケーション層のバイトがプロキシからクライアントに渡されるたびに測定)。

TCP/SSL プロキシ指標のフィルタリング項目

指標は、TCP/SSL プロキシ ロードバランサごとに集計されます。指標は、次の項目ごとにさらに詳細に分類できます。

特性 説明
BACKEND SCOPE 接続を処理したインスタンス グループの範囲(リージョンまたはゾーン)。
BACKEND ZONE インスタンス グループがゾーン インスタンス グループの場合、接続を処理したインスタンス グループのゾーン
BACKEND REGION インスタンス グループがリージョン インスタンス グループの場合、接続を処理したインスタンス グループのリージョン
PROXY CONTINENT ユーザーの TCP/SSL 接続を終端したプロキシの大陸(例: AmericaEuropeAsia)。
INSTANCE GROUP ユーザー接続を受け取ったインスタンス グループの名前。

FORWARDING RULE プロキシへの接続に使用された転送ルールの名前。
CLIENT COUNTRY ユーザーの国の名前。

よくある質問

SSL プロキシ負荷分散ではなく HTTPS 負荷分散の使用が必要になる場合

SSL プロキシでも HTTPS トラフィックを処理できますが、HTTPS 負荷分散にはたいていの場合に選択したほうがよい追加機能が備わっています。

HTTPS 負荷分散では、次の追加機能を使用できます。

  • HTTP/2 と SPDY/3.1 をネゴシエーションします。
  • 無効な HTTP リクエストまたはレスポンスを拒否します。
  • URL ホストとパスに基づいて、別のインスタンス グループにリクエストを転送します。
  • Cloud CDN と統合します。
  • インスタンス間でリクエストの負荷をより均等に分散し、インスタンスをより効率的に使用できます。HTTPS では各リクエストは別個に負荷分散されますが、SSL プロキシでは同じ SSL または TCP 接続からのすべてのバイトが同じインスタンスに送信されます。

Google Cloud Load Balancing の SSL プロキシは、Websocket over SSL や IMAP over SSL など、SSL を使用するその他のプロトコルに使用できます。

グローバル負荷分散層への接続の元の IP アドレスを表示できますか?

はい。PROXY プロトコル バージョン 1 ヘッダーを先頭に付けて、元の接続情報が維持されるようにロードバランサを設定できます。詳細については、プロキシの PROXY プロトコル ヘッダーの更新をご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント