バックエンド認証 TLS を設定する

このページでは、グローバル外部アプリケーション ロードバランサにセルフマネージド証明書を使用して、バックエンド認証 TLS(バックエンド認証)を設定する手順について説明します。

バックエンド認証 TLS を構成するには、次の操作を行う必要があります。

  • ルート証明書と中間証明書で構成される信頼構成リソースを作成します。
  • 信頼構成を参照する Backend Authentication Config リソースを作成します。
  • Backend Authentication Config リソースをロードバランサのバックエンド サービスに接続します。

始める前に

  • バックエンド認証 TLS とバックエンド mTLS の概要を確認します。
  • 信頼構成を管理するを確認します。
  • このガイドの手順で Google Cloud CLI を使用する場合は、インストールする必要があります。ロード バランシングに関連するコマンドについては、API と gcloud CLI のリファレンスをご覧ください。

    gcloud CLI を初めて実行する場合は、最初に gcloud init コマンドを実行して、認証を行います。

  • Compute Engine API、Certificate Manager API、ネットワーク セキュリティ、Network Services API の API を有効にします。詳細については、API を有効にするをご覧ください。

  • 次のサポート対象のバックエンドのいずれかで、グローバル外部アプリケーション ロードバランサを構成します。

    • VM インスタンス グループのバックエンド
    • ハイブリッド接続 NEG
    • ゾーン NEG

権限

このセクションでは、バックエンド認証 TLS を構成するために必要な権限について説明します。
オペレーション 権限
信頼構成を作成する ターゲットの Google Cloud プロジェクトに対する certificatemanager.trustconfigs.create
バックエンド認証構成リソースを作成する
  • ターゲット証明書の certificatemanager.certs.use
  • ターゲット信頼構成の certificatemanager.trustconfigs.use
  • ターゲットの Google Cloud プロジェクトに対する networksecurity.backendauthenticationconfigs.create
  • バックエンド認証構成リソースをロードバランサのバックエンド サービスに接続する
  • ターゲット バックエンド サービスに対する compute.backendservice.update
  • ターゲットの Backend Authentication Config リソースに対する networksecurity.backendauthenticationconfigs.use
  • 設定の概要

    以降のセクションでは、次の図に示すアーキテクチャに基づいてバックエンド認証 TLS を構成する手順について説明します。

    バックエンド認証 TLS のコンポーネント。
    バックエンド認証 TLS コンポーネント(クリックして拡大)

    ルート証明書と中間証明書を作成する

    このセクションでは、OpenSSL ライブラリを使用して、ルート証明書(信頼アンカー)と中間証明書を作成します。

    ルート証明書は証明書チェーンの最上位にあります。中間証明書は、ルート証明書まで遡る信頼チェーンの一部です。中間証明書は、ルート証明書によって暗号署名されます。ロードバランサは、サーバー証明書を受信すると、サーバー証明書から構成済みのトラスト アンカーまでの信頼チェーンを確立して、証明書を検証します。

    次のコマンドを使用して、ルート証明書と中間証明書を作成します。

    1. OpenSSL 構成ファイルを作成します。

      次の例では、構成ファイル(example.cnf)に [ca_exts] セクションが含まれています。このセクションには、証明書を CA に適したものとしてマークする X.509 拡張機能が指定されています。ルート証明書と中間証明書の要件の詳細については、証明書の要件をご覧ください。

      cat > example.cnf << EOF
      [req]
      distinguished_name = empty_distinguished_name
      
      [empty_distinguished_name]
      # Kept empty to allow setting via -subj command-line argument.
      
      [ca_exts]
      basicConstraints=critical,CA:TRUE
      keyUsage=keyCertSign
      extendedKeyUsage=serverAuth
      
      EOF
      
    2. 自己署名 X.509 ルート証明書(root.cert)を作成します。ルート証明書は、独自の秘密鍵(root.key)で自己署名されます。

      openssl req -x509 \
          -new -sha256 -newkey rsa:2048 -nodes \
          -days 3650 -subj '/CN=root' \
          -config example.cnf \
          -extensions ca_exts \
          -keyout root.key -out root.cert
      
    3. 中間証明書の証明書署名リクエスト(CSR)int.req を作成します。

      openssl req -new \
          -sha256 -newkey rsa:2048 -nodes \
          -subj '/CN=int' \
          -config example.cnf \
          -extensions ca_exts \
          -keyout int.key -out int.req
      
    4. CSR に署名して X.509 中間証明書(int.cert)を作成します。CSR はルート証明書を使用して署名されます。

      openssl x509 -req \
          -CAkey root.key -CA root.cert \
          -set_serial 1 \
          -days 3650 \
          -extfile example.cnf \
          -extensions ca_exts \
          -in int.req -out int.cert
      

    証明書をフォーマットする

    新規または既存の証明書をトラストストアに含めるには、証明書を 1 行にフォーマットし、環境変数に格納して、信頼構成 YAML ファイルで参照できるようにします。

    export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
    
    export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
    

    信頼構成リソースを作成する

    信頼構成は、Certificate Manager の公開鍵基盤(PKI)構成を表すリソースです。

    信頼構成リソースを作成するには、次の手順を行います。

    コンソール

    1. Google Cloud コンソールで、[Certificate Manager] ページに移動します。

      Certificate Manager に移動

    2. [信頼構成] タブで、[信頼構成を追加] をクリックします。

    3. 構成の名前を入力します。

    4. [ロケーション] で [グローバル] を選択します。ロケーションは、信頼構成リソースが保存される場所を示します。グローバル外部アプリケーション ロードバランサの場合は、グローバル信頼構成リソースを作成する必要があります。

    5. [トラストストア] セクションで、[トラスト アンカーを追加] をクリックし、PEM エンコードの証明書ファイルをアップロードするか、証明書の内容をコピーします。

    6. [追加] をクリックします。

    7. [トラストストア] セクションで、[中間 CA の追加] をクリックし、PEM エンコードの証明書ファイルをアップロードするか、証明書の内容をコピーします。この手順により、ルート証明書とサーバー証明書の間に別の信頼レベルを追加できます。

    8. [追加] をクリックして、中間 CA を追加します。

    9. 許可リストに追加した証明書を追加するには、[追加] をクリックします。

    10. [作成] をクリックします。

    新しい信頼構成リソースが構成のリストに表示されていることを確認します。

    gcloud

    1. 信頼構成パラメータを指定する信頼構成 YAML ファイル(trust_config.yaml)を作成します。この信頼構成リソースの例には、トラスト アンカーと中間証明書を含むトラストストアが含まれています。この信頼構成リソースの例では、前の証明書をフォーマットするの手順で作成した環境変数から証明書の内容を読み取ります。

      cat << EOF > trust_config.yaml
      trustStores:
      - trustAnchors:
        - pemCertificate: "${ROOT_CERT}"
        intermediateCas:
        - pemCertificate: "${INTERMEDIATE_CERT}"
      EOF
      

      追加のトラスト アンカーまたは中間証明書を使用してトラストストアを作成するには、適切なセクションに pemCertificate 行を追加します。

    2. 信頼構成 YAML ファイルをインポートするには、gcloud certificate-manager trust-configs import コマンドを使用します。

      グローバル外部アプリケーション ロードバランサの場合は、信頼構成リソースの保存場所として global を指定します。

      gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
          --source=trust_config.yaml \
          --location=global
      

      次のように置き換えます。

      • TRUST_CONFIG_NAME: 信頼構成リソースの名前

    バックエンド認証構成リソースを作成する

    バックエンド認証構成(BackendAuthenticationConfig)リソースを作成するには、次の操作を行います。

    コンソール

    1. Google Cloud コンソールで、[認証構成] ページに移動します。

      [認証構成] に移動

    2. [バックエンド認証] タブで [作成] をクリックします。
    3. バックエンド認証構成リソースの名前を入力します。
    4. 省略可: 公開ルート証明書を選択します。
    5. 前に作成した信頼構成リソースを選択します。
    6. [作成] をクリックします。

    Backend Authentication Config リソースが表示されていることを確認します。

    gcloud

    1. Backend Authentication Config リソースのさまざまな属性を宣言的に指定する YAML ファイルを作成します。

      cat << EOF > BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml
      name: projects/PROJECT_ID/locations/global/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME
      trustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      wellKnownRoots: PUBLIC_ROOTS
      EOF
      

      次のように置き換えます。

      • BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME : Backend Authentication Config リソースが定義されている YAML ファイルの名前。
      • PROJECT_ID: Google Cloud プロジェクトの ID
      • BACKEND_AUTH_CONFIG_NAME: バックエンド認証構成リソースの名前
      • TRUST_CONFIG_NAME: 前に作成した信頼構成リソースの名前。
    2. Backend Authentication Config リソースをインポートするには、gcloud beta network-security backend-authentication-configs import コマンドを使用します。

      gcloud beta network-security backend-authentication-configs import BACKEND_AUTH_CONFIG_NAME \
         --source=BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME.yaml \
         --location=global
      

      次のように置き換えます。

      • BACKEND_AUTH_CONFIG_NAME: Backend Authentication Config リソースの名前

      • BACKEND_AUTHENTICATION_CONFIG_RESOURCE_FILENAME: Backend Authentication Config リソースが定義されている YAML ファイルの名前。

    バックエンド認証構成リソースをロードバランサのバックエンド サービスに接続する

    バックエンド認証構成(BackendAuthenticationConfig)リソースをロードバランサのバックエンド サービスに接続するには、次の操作を行います。

    コンソール

    1. Google Cloud コンソールで、[ロード バランシング] ページに移動します。

      [ロード バランシング] に移動

    2. [バックエンド] タブで、バックエンド認証 TLS とバックエンド mTLS を有効にするバックエンド サービスを選択します。

    3. [編集] をクリックします。

    4. [高度な構成] セクションを開きます。

    5. [バックエンド認証] セクションで、[有効にする] チェックボックスをオンにします。

    6. 省略可: SNI ホスト名と承認された SAN を指定して、バックエンド証明書を検証します。

    7. Backend Authentication Config リソースをバックエンド サービスに接続するには、[Backend Authentication Config] リストで Backend Authentication Config リソースを選択します。

    8. [続行] をクリックします。

    9. バックエンド サービスの設定を更新するには、[更新] をクリックします。

    gcloud

    1. プロジェクト内のすべてのバックエンド サービス リソースを一覧表示するには、gcloud compute backend-services list コマンドを使用します。

      gcloud compute backend-services list
      

      BackendAuthenticationConfig リソースを接続するバックエンド サービスの名前をメモします。以降のステップでは、この名前を BACKEND_SERVICE_NAME として表しています。

    2. バックエンド サービスの構成をファイルにエクスポートするには、gcloud beta compute backend-services export コマンドを使用します。

      gcloud beta compute backend-services export BACKEND_SERVICE_NAME \
          --destination=BACKEND_SERVICE_FILENAME.yaml \
          --global
      

      次のように置き換えます。

      • BACKEND_SERVICE_NAME: バックエンド サービスの名前
      • BACKEND_SERVICE_FILENAME: バックエンド サービス構成がエクスポートされる YAML ファイルの名前とパス
    3. バックエンド サービスの tlsSettings 属性を更新して、バックエンド認証構成リソースを参照するようにします。また、バックエンド サービスで SNI ホスト名と承認された SAN を構成して、バックエンド証明書を検証することもできます。

        cat << EOF >> BACKEND_SERVICE_FILENAME.yaml
        tlsSettings:
          authenticationConfig: //networksecurity.googleapis.com/projects/PROJECT_ID/locations/global/backendAuthenticationConfigs/BACKEND_AUTH_CONFIG_NAME
          sni: examplepetstore.com
          subjectAltNames:
          - dnsName: examplepetstore.com
          - dnsName: api.examplepetstore.com
        EOF
        

      上記の YAML 宣言の SNI 値と SAN 値は例にすぎません。これらの値は、設定に関連する実際の値に置き換えることができます。

      次のように置き換えます。

      • BACKEND_SERVICE_FILENAME: バックエンド サービス構成がエクスポートされる YAML ファイルの名前

      • PROJECT_ID: Google Cloud プロジェクトの ID

      • BACKEND_AUTH_CONFIG_NAME: Backend Authentication Config リソースの名前

    4. 更新されたバックエンド サービス構成をファイルからインポートするには、gcloud beta compute backend-services import コマンドを使用します。

      gcloud beta compute backend-services import BACKEND_SERVICE_NAME \
          --source=BACKEND_SERVICE_FILENAME.yaml \
          --global
      

      次のように置き換えます。

      • BACKEND_SERVICE_NAME: バックエンド サービスの名前
      • BACKEND_SERVICE_FILENAME: バックエンド サービス構成 YAML ファイルの名前

    バックエンド サーバー証明書を作成する

    このセクションでは、信頼構成の一部である中間証明書によって署名されたサーバー(リーフ)証明書を作成する追加の構成オプションについて説明します。これにより、サーバー証明書からトラスト アンカーまでの信頼チェーンを確立できます。

    中間証明書を含む信頼構成リソースをすでに作成している場合は、次の操作を行います。

    1. 構成ファイルを作成して、サーバー証明書の CSR を生成します。

      次の構成ファイル(server.config)には、CSR に含める X.509 拡張機能を指定する [extension_requirements] セクションが含まれています。サーバー証明書の要件の詳細については、証明書の要件をご覧ください。

      cat > server.config << EOF
      [req]
      default_bits              = 2048
      req_extensions            = extension_requirements
      distinguished_name        = dn_requirements
      prompt                    = no
      
      [extension_requirements]
      basicConstraints          = critical, CA:FALSE
      keyUsage                  = critical, nonRepudiation, digitalSignature, keyEncipherment
      extendedKeyUsage          = serverAuth
      subjectAltName            = @alt_names
      
      [alt_names]
      DNS.1 = examplepetstore.com
      DNS.2 = api.examplepetstore.com
      
      [dn_requirements]
      countryName               = US
      stateOrProvinceName       = California
      localityName              = San Francisco
      0.organizationName        = example
      organizationalUnitName    = test
      commonName                = examplepetstore.com
      emailAddress              = test@examplepetstore.com
      
      EOF
      
    2. サーバー証明書の CSR(server.csr)を作成します。

      openssl req -new \
          -sha256 -newkey rsa:2048 -nodes \
          -config server.config \
          -keyout server.key -out server.csr
      
    3. CSR に署名して X.509 サーバー証明書(server.cert)を発行します。CSR は中間証明書によって署名されます。

      openssl x509 -req \
          -CAkey int.key -CA int.cert \
          -days 365 \
          -extfile server.config \
          -extensions extension_requirements \
          -in server.csr -out server.cert
      

      ロードバランサがバックエンド サーバーに接続すると、バックエンド サーバーは証明書(server.cert)を提示してロードバランサに対して自己認証を行い、バックエンド認証プロセスを完了します。

    Apache ウェブサーバーの追加の SSL 構成オプション

    このセクションでは、前のセクションで作成したサーバー証明書に基づいて、Apache サーバーの SSL 構成オプションを更新する手順について説明します。

    1. サーバー秘密鍵(server.key)とサーバー証明書(server.cert)を Apache ウェブサーバーにコピーします。

          cat > server.key << EOF
          -----BEGIN PRIVATE KEY-----
          [...]
          -----END PRIVATE KEY-----
          EOF
      
          sudo cp ./server.key /etc/ssl/private/server.key
          

      [...] は、前に作成した PEM でエンコードされたサーバー秘密鍵に置き換えます。

          cat > server.cert << EOF
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----
          EOF
      
          sudo cp ./server.cert /etc/ssl/certs/server.cert
          

      [...] は、前に作成した PEM エンコードされたサーバー証明書に置き換えます。

    2. Apache ウェブサーバーの SSL 構成を更新します。

      指定した SSL 証明書と秘密鍵を使用して HTTPS トラフィックを有効にするように、Apache の SSL 構成を更新します。

          sudo vi /etc/apache2/sites-available/default-ssl.conf
      
          ----
          SSLCertificateFile      /etc/ssl/certs/server.cert
          SSLCertificateKeyFile /etc/ssl/private/server.key
          ----
          
    3. CA 証明書を再ハッシュします。

          sudo c_rehash /etc/ssl/certs/
          
    4. Apache ウェブサーバーを再起動して変更を適用します。

          sudo systemctl restart apache2.service
          

    次のステップ