バックエンド mTLS を設定する

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

バックエンド mTLS を構成する手順は、バックエンド認証 TLS と似ていますが、さらにロードバランサの証明書も作成する必要があります。この証明書(クライアント証明書)は、バックエンド認証構成リソースに関連付けられています。ロードバランサは、このクライアント証明書を使用してバックエンドに対する認証を行います。

バックエンド mTLS を構成するには、次のセクションの手順を完了します。

  1. ルート証明書と中間証明書で構成される信頼構成リソースを作成します。
  2. クライアント証明書を作成し、Certificate Manager にアップロードします。
  3. 信頼構成とクライアント証明書の両方を参照するバックエンド認証構成リソースを作成します。
  4. バックエンド認証構成リソースをロードバランサのバックエンド サービスに接続します

始める前に

権限

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

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

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

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

    このセクションでは、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: 信頼構成リソースの名前

    クライアント証明書を作成する

    バックエンド mTLS では、ロードバランサがクライアントとして機能し、バックエンドがサーバーとして機能します。

    バックエンド mTLS を有効にするには、ロードバランサがバックエンドに ID を証明する必要があります。この認証は、ロードバランサがバックエンドに提示するクライアント証明書を使用して行われます。バックエンド サーバーは、独自の信頼チェーンを使用してクライアント証明書を検証する必要があります。

    バックエンド サーバーに接続すると、ロードバランサは Server Name Indication(SNI)を TLS 構成で指定されたホスト名に設定します。バックエンド サーバーは、この SNI 値に基づいて適切な SSL/TLS 証明書を選択します。ロードバランサは、SNI 値がバックエンド サーバーの証明書にリストされているサブジェクト代替名(SAN)と一致することを想定しています。

    クライアント証明書は、Certificate Authority Service を介したプライベート CA のマネージド証明書、またはセルフマネージド プライベート PKI 証明書にすることができます。この例では、クライアント証明書はセルフマネージド証明書を使用して発行されます。このセクションでは、OpenSSL ライブラリを使用して、ルート CA 証明書とクライアント証明書を作成します。

    クライアント証明書を作成するには、次の操作を行います。

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

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

        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=clientAuth
      
        EOF
      
    2. 自己署名 X.509 ルート CA 証明書(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 を生成します。

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

        cat > client.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          = clientAuth
      
        [dn_requirements]
        countryName               = US
        stateOrProvinceName       = California
        localityName              = San Francisco
        0.organizationName        = example
        organizationalUnitName    = test
        commonName                = test.example.com
        emailAddress              = test@example.com
      
        EOF
      
    4. クライアント証明書の CSR(client.csr)を作成します。

        openssl req -new \
            -config client.config \
            -keyout client.key -out client.csr
      
    5. CSR からクライアント証明書(client.cert)を作成します。CSR は、X.509 クライアント証明書を発行するためにルート CA 証明書によって署名されます。

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

    クライアント証明書を Certificate Manager にアップロードする

    クライアント証明書を Certificate Manager にアップロードする手順は次のとおりです。

    コンソール

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

      [Certificate Manager] に移動

    2. [証明書] タブで、[証明書を追加] をクリックします。

    3. 証明書の名前を入力します。

      この名前は、プロジェクト内で一意にする必要があります。

    4. 省略可: 証明書の説明を入力します。説明は、後で特定の証明書を識別する際に役立ちます。

    5. [ロケーション] で [グローバル] を選択します。

    6. [スコープ] で [クライアント認証] を選択します。

    7. [証明書の種類] で [セルフマネージド証明書を作成する] を選択します。

    8. [証明書] フィールドに、PEM でエンコードされた証明書ファイルをアップロードするか、PEM でエンコードされた証明書の内容をコピーして貼り付けます。

    9. [秘密鍵証明書] フィールドに、パスフレーズで保護されていない PEM でエンコードされた秘密鍵をアップロードするか、PEM でエンコードされた秘密鍵の内容をコピーして貼り付けます。

    10. 証明書に関連付けるラベルを指定します。必要に応じて、複数のラベルを追加できます。ラベルを追加するには、[ ラベルを追加] ボタンをクリックして、ラベルの keyvalue を指定します。

    11. [作成] をクリックします。証明書のリストに新しい証明書が表示されていることを確認します。

    gcloud

    1. クライアント証明書を Certificate Manager にアップロードするには、gcloud certificate-manager certificates create コマンドを使用します。この証明書のスコープは client-auth です。これは、この証明書がバックエンド mTLS でクライアント証明書として使用されることを示します。

      gcloud certificate-manager certificates create CLIENT_ CERTIFICATE_NAME \
          --certificate-file=client.cert \
          --private-key-file=client.key \
          --scope=client-auth \
          --global
      

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

      • CLIENT_CERTIFICATE_NAME: クライアント証明書リソースの名前。スコープ client-auth のこのクライアント証明書は、バックエンド認証構成リソースで使用されます。

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

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

    コンソール

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

      [認証構成] に移動

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

    バックエンド認証構成リソースが表示されていることを確認します。

    gcloud

    1. バックエンド認証構成リソースのさまざまな属性を宣言的に指定する YAML ファイルを作成します。

      バックエンド mTLS を有効にするには、クライアント証明書をバックエンド認証構成リソースに接続します。

      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
      clientCertificate: projects/PROJECT_ID/locations/global/certificates/CLIENT_ CERTIFICATE_NAME
      wellKnownRoots: PUBLIC_ROOTS
      EOF
      

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

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

      gcloud 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_RESOURCE_FILENAME: バックエンド認証構成リソースが定義されている YAML ファイルの名前。

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

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

    コンソール

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

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

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

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

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

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

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

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

    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: バックエンド認証構成リソースの名前

    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. クライアント証明書を検証するために、クライアント証明書をサーバーの信頼構成にアップロードします。

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

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

    3. 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
          ----
          

      Apache の SSL 構成を更新してクライアント証明書認証を必須とし、検証用の CA 証明書を指定します。

          sudo vi /etc/apache2/sites-available/default-ssl.conf
      
          ----
          SSLVerifyClient require
          SSLVerifyDepth 5
          SSLCACertificateFile /etc/ssl/certs/client.cert
          ----
          
    4. CA 証明書を再ハッシュします。

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

          sudo systemctl restart apache2.service
          

    次のステップ