アプリコネクタを使用した Google Cloud 以外のアプリケーションの保護

このページでは、BeyondCorp Enterprise アプリコネクタを設定して使用し、Google Cloud 以外のアプリケーションを保護する方法について説明します。

概要

BeyondCorp Enterprise アプリコネクタを使用すると、Google Cloud 以外の環境で動作している HTTPS アプリケーションに ID とコンテキストアウェア アクセスを提供できます。BeyondCorp Enterprise アプリコネクタは、他のクラウドおよびオンプレミス環境で動作しているアプリケーションと、BeyondCorp Enterprise 適用プレーンとの間の安全な認証済みインターフェースです。

BeyondCorp Enterprise アプリコネクタを使用する利点は、ファイアウォールの解放や、サイト間の Cloud VPN 接続の設定の必要がないことです。

アーキテクチャ

以下は、BeyondCorp Enterprise アプリコネクタの主要なコンポーネントを表示するアーキテクチャの概要図です。

BeyondCorp Enterprise アプリコネクタのコンポーネント

BeyondCorp Enterprise アプリコネクタのコンポーネントは、3 つの主要な API リソース(アプリコネクタ、アプリ接続、アプリ ゲートウェイ)を使用して管理されます。

アプリコネクタ
コネクタ リソースは、一意のアプリコネクタのリモート エージェントを定義します。アプリコネクタのリモート エージェントは、リモート エンタープライズ環境(他のクラウド環境やオンプレミス環境など)にデプロイされます。リモート エージェントは、Google Cloud へのトンネル セッションを開始および維持し、Google Cloud からトラフィックを受信して、同じ環境のリモート アプリケーション エンドポイントにトラフィックをリレーします。
アプリ接続
接続リソースは、Google Cloud から IP address:Port または FQDN:Port を使用して識別される特定のアプリケーション エンドポイントへの論理接続を定義します。接続リソースは、所定のアプリケーション エンドポイントに割り当てられた一連のマネージド アプリコネクタ ゲートウェイをオーケストレートします。ゲートウェイは Google Cloud で管理され、リモート エージェントの不要になったトンネル セッションを終了させます。
アプリ ゲートウェイ

アプリ ゲートウェイは、Google が管理するサービスです。アプリコネクタのリモート エージェントは、1 つ以上のゲートウェイに接続して、アプリ接続とアプリコネクタがエンドユーザーからリモート エージェントにトラフィックをリレーできるようにします。同じアプリ ゲートウェイでホストされているアプリ接続のトラフィックは、共通の仮想インフラストラクチャ経由で転送されます。

アプリコネクタを使用してアプリケーションを接続すると、アプリ ゲートウェイが暗黙的に作成され、管理されます。アプリ接続リソースをグループにまとめる場合は、追加のアプリ ゲートウェイを作成することもできます。アプリ ゲートウェイでは、アプリ接続をグループ化または分離して、アプリの分離を柔軟に行うことができます。

各アプリ ゲートウェイは、最大 200,000 件の同時接続で、合計最大 1 Gbps のスループットをサポートできます。高パフォーマンスを必要とする重要なアプリケーション専用のゲートウェイを作成することをおすすめします。ゲートウェイごとに最大 10 個のアプリを割り当てられます。

最大 200,000 件の同時接続と、最大 1 Gbps の合計スループットをサポートするには、8 コアと 8 GB のメモリを備えた専用 VM を使用して、アプリコネクタのリモート エージェントを実行することをおすすめします。たとえば、それぞれ 8 コアと 8 GB のメモリを備えた HA クラスタに 2 つのアプリコネクタのリモート エージェントを割り当てると、専用のアプリ ゲートウェイ(app_gateway1)を使用して高パフォーマンス ウェブ アプリケーション(app1.examplecompany.com)をサポートできます。それぞれ 8 コア、8 GB のメモリを持つ 2 つの VM の別のクラスタを作成して、使用率の低い 10 個のアプリと別の専用アプリ ゲートウェイ(app_gateway2)の組み合わせをサポートします。

アプリコネクタ、アプリ接続、アプリ ゲートウェイのリソースはリージョン リソースです。これらは、リージョン コンテキストでのみ使用できます。たとえば、リージョン A のアプリコネクタをリージョン B で作成したアプリ接続またはアプリ ゲートウェイに割り当てることはできません。

準備

BeyondCorp Enterprise アプリコネクタは、HTTPS アプリケーションでのみ使用できます。また、HTTPS ロードバランサは、バックエンドへの接続に Server Name Indication(SNI)拡張機能を使用しません。詳細については、ロードバランサからバックエンドへの暗号化をご覧ください。

BeyondCorp Enterprise アプリコネクタを使用するには、次が必要です。

BeyondCorp Enterprise アプリコネクタ エージェントには、Docker を実行する Linux VM が必要です。次の Linux ディストリビューションをおすすめします。

  • Debian 10.7(buster)
  • Red Hat Enterprise Linux Server 7.8(Maipo)x86_64
  • Ubuntu 16.04 以降

Linux VM ハードウェアでは、2 GB 以上の RAM を搭載した 2 つ以上の CPU をおすすめします。

アプリコネクタを設定して有効にするには、gcloud と API を使用するか、Google Cloud コンソールを使用します。gcloud と API を使用するには、次の手順を行います。Google Cloud コンソールを使用するには、Google Cloud コンソールを使用してアプリコネクタを設定するをご覧ください。

Google Cloud プロジェクトを設定する

BeyondCorp Enterprise アプリコネクタを使用する Google Cloud プロジェクトを設定するには、BeyondCorp Enterprise API を有効にする必要があります。API は、次の手順で有効にします。

gcloud CLI

次の手順を実施する前に、gcloud CLI SDK がインストールされていることを確認してください。

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    PROJECT_ID=my-project
    

    my-project は、Google Cloud プロジェクト ID に置き換えます。

  2. 次のコマンドを実行して、API を有効にします。

    gcloud config set project $PROJECT_ID
    gcloud services enable beyondcorp.googleapis.com
    

API

  1. 次のコマンドを実行してアクセス トークンを取得し、必要な環境変数とエイリアスを設定します。

    PROJECT_NUMBER=my-project-number
    ACCESS_TOKEN=my-access-token
    

    my-project は、Google Cloud プロジェクト ID に置き換えます。

  2. アクセス トークンを使用するために、便利なエイリアスを設定します。

    alias gcurl="curl -H 'Authorization: Bearer ${ACCESS_TOKEN}' -H 'Content-Type: application/json'"
    

  3. 次のコマンドを実行して、API を有効にします。

    gcurl https://serviceusage.googleapis.com/v1/projects/${PROJECT_NUMBER}/services/beyondcorp.googleapis.com:enable -d "{}"
    

アプリコネクタのリモート エージェントをインストールする

BeyondCorp Enterprise で保護するアプリケーションをホストするネットワーク環境ごとに、アプリコネクタのリモート エージェント VM をデプロイする必要があります。作成するリモート エージェントごとに、専用の VM または Docker がインストールされた Bare Metal サーバーが必要です。

リモート エージェントを作成するには、次の手順を行います。

  1. アプリケーション環境に VM インスタンスを作成します。
    1. リモート エージェントの VM ネットワーク ファイアウォールで、ポート 443 で開始し、IAP-TCP IP 範囲 35.235.240.0/20 に向かうすべての送信トラフィックが許可されていることを確認します。リモート エージェント VM ファイアウォールが送信トラフィックの宛先として許可している他のドメインについては、ファイアウォール構成を確認するをご覧ください。
  2. リモート エージェントをインストールします。

    1. DNS が正しく構成され、curl を使用してアプリケーションにアクセスできることを確認します。
    2. Docker Engine をインストールします。
      1. 省略可: プロキシを使用している場合は、Docker デーモンが正しく構成されていることを確認します。
    3. 省略可: プロキシを使用している場合は、HTTP プロキシ環境変数と HTTPS プロキシ環境変数が設定され、http:// スキーマを使用していることを確認します。
    4. リモート エージェント VM で次のコマンドを実行して、リモート エージェントをインストールします。
      curl https://raw.githubusercontent.com/GoogleCloudPlatform/beyondcorp-applink/main/bash-scripts/install-beyondcorp-runtime -o ./install-beyondcorp-runtime && chmod +x ./install-beyondcorp-runtime && ./install-beyondcorp-runtime
      
    5. bce-connctl エイリアスをシェルに追加するには、次のコマンドを実行します。
       source ~/.bce_alias
       
    6. 次のコマンドを実行して、必要な環境変数を設定します。

      PROJECT_ID=my-project
      REGION=us-central1
      CONNECTOR_NAME=my-connector
      
      次のように置き換えます。

      • my-project: Google Cloud プロジェクト ID。
      • us-central1: 接続とゲートウェイをデプロイするリージョン。
      • my-connector: コネクタの名前。
    7. 次のいずれかの認証情報タイプを使用してコネクタを登録します。

    サービス アカウント

    1. bce-connctl CLI で次のコマンドを実行して、コネクタを登録します。

      bce-connctl init --project=$PROJECT_ID --region=$REGION --connector=$CONNECTOR_NAME
      

    2. 画面上の指示に沿って、Cloud Shell または gcloud CLI を使用して登録スクリプトをコピーして Google Cloud プロジェクトに貼り付けて、コネクタの登録を完了します。登録スクリプトを実行するには、プロジェクトに対する Owner 権限が必要です。

      登録スクリプトが完了すると、ランタイムによりコネクタ構成が自動的に同期されます。

    フェデレーション ID

    1. Workload Identity 連携ガイドに沿って、サービス アカウントの権限借用を使用して外部 ID に Google Cloud へのアクセスを許可します。
    2. クライアント ライブラリの構成をダウンロードし、リモート エージェント VM の /var/beyondcorp/credentials/credentials.json にファイルを配置します。
      1. AWS EC2 インスタンスをリモート エージェント VM として使用する場合は、次のいずれかを行います。
        1. EC2 インスタンスで IMDSv2 をオプションにします。
        2. クライアント ライブラリの構成ファイルの credential_source オブジェクトに次の行を追加します。
          "imdsv2_session_token_url": "http://169.254.169.254/latest/api/token"
          
    3. リモート エージェント VM で、bce-connctl CLI から次のコマンドを実行します。
      bce-connctl config set project $PROJECT_ID
      bce-connctl config set region $REGION
      bce-connctl config set connector $CONNECTOR_NAME
      
    4. 次のコマンドを実行してエージェントを再起動し、認証情報を取得します。
      sudo systemctl restart beyondcorp
      
    5. Cloud Shell または gcloud CLI エンドポイントで、次のコマンドを実行して、必要な環境変数を設定します。
      SERVICE_ACCOUNT=my-service-account
      
      次のように置き換えます。
      • my-service-account: 外部 ID に関連付けられた Google Cloud サービス アカウント。
    6. 次のコマンドを実行して、Google Cloud サービス アカウントに BeyondCorp Connection Agent ロールを付与します。

      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:$SERVICE_ACCOUNT" \
          --role="roles/beyondcorp.connectionAgent"
      
    7. 次のコマンドを実行して、Google Cloud アプリコネクタ リソースを作成します。

      gcloud alpha beyondcorp app connectors create $CONNECTOR_NAME \
          --project=$PROJECT_ID \
          --location=$REGION \
          --member="serviceAccount:$SERVICE_ACCOUNT" \
          --display-name=$CONNECTOR_NAME
      

      アプリコネクタ リソースが作成されると、リモート エージェント ランタイムによってコネクタ構成が自動的に同期されます。

  3. リモート エージェントのインストールを確認します。

    1. 次のコマンドを実行して、サービスが動作していることを確認します。
      sudo systemctl status beyondcorp
      
    2. リモート エージェントは、3 つの Docker コンテナ(bce-control-runtimebce-logagentbce-connector)で構成されます。次のコマンドを実行して、3 つのコンテナがすべて動作していることを確認します。
      docker ps --filter name=bce
      
    3. (省略可)次のコマンドを実行して、Docker コンテナのログファイルを確認できます。
      docker logs -f CONTAINER_NAME
      
      CONTAINER_NAME は、Docker コンテナ名に置き換えます。

リモート アプリケーションを VPC に接続する

gcloud CLI

次の手順を実施する前に、gcloud CLI SDK がインストールされ、beyondcorp.admin ロールを持つアカウントでログインしていることを確認します。

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    PROJECT_ID=my-project
    REGION=us-central1
    APP_ENDPOINT=APP_HOST:APP_PORT
    

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

    • my-connector: 前のステップで定義したコネクタの名前。
    • my-connection: 接続の一意の名前。
    • my-project: Google Cloud プロジェクト ID。
    • us-central1: 接続とゲートウェイをデプロイするリージョン。
    • APP_HOST: アプリケーションをホストするオンプレミスの IP アドレスまたは FQDN。
    • APP_PORT: アプリケーションに接続するポート番号。
  2. アプリケーションと VPC の間の接続を作成するために、次のコマンドを実行します。

    gcloud alpha beyondcorp app connections create $CONNECTION_NAME \
        --project=$PROJECT_ID \
        --location=$REGION \
        --application-endpoint=$APP_ENDPOINT \
        --type=tcp \
        --connectors=$CONNECTOR_NAME \
        --display-name=$CONNECTION_NAME
    

    この手順は、完了まで数分かかることがあります。

  3. 接続を作成したら、次のコマンドを実行してゲートウェイ URI を取得します。

    GATEWAY_URI="$(gcloud alpha beyondcorp app connections describe $CONNECTION_NAME --project=$PROJECT_ID --location=$REGION --format='get(gateway.uri)')"
    GATEWAY_URI_L7="${GATEWAY_URI/bce-psc/bce-ps7}"
    

    GATEWAY_URI_L7 は転送ルールの作成に使用されます。BeyondCorp Enterprise アプリコネクタは、Private Service Connect を使用して、コンシューマ プロジェクトを Google マネージド プロジェクトのマネージド リソースにリンクします。

API

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    PROJECT_ID=my-project
    REGION=us-central1
    APP_HOST=my-app-host
    APP_PORT=my-app-port
    

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

    • my-connector: 前のステップで定義したコネクタの名前。
    • my-connection: 接続の一意の名前。
    • my-project: Google Cloud プロジェクト ID。
    • us-central1: 接続とゲートウェイをデプロイするリージョン。
    • my-app-host: アプリケーションをホストするオンプレミスの IP アドレスまたは FQDN。
    • my-app-port: アプリケーションに接続するポート番号。
  2. アプリケーションと VPC の間の接続を作成するために、次のコマンドを実行します。

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_NUMBER}/locations/${REGION}/appConnections?app_connection_id=${CONNECTION_NAME} \
    -d "{ \
        'application_endpoint': \
        { \
            'host': '${APP_HOST}', \
            'port': '${APP_PORT}' \
        }, \
        'type': 'TCP_PROXY', \
        'display_name': '${CONNECTION_NAME}' \
    }"
    

    この手順は、完了まで数分かかることがあります。

  3. 接続を作成したら、次のコマンドを実行してゲートウェイ URI を取得します。

    GATEWAY_URI=$(gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_NUMBER}/locations/${REGION}/appConnections/${CONNECTION_NAME} | jq -r '.gateway.uri')
    GATEWAY_URI_L7="${GATEWAY_URI/bce-psc/'bce-ps7'}"
    

    GATEWAY_URI_L7 は転送ルールの作成に使用されます。BeyondCorp Enterprise アプリコネクタは、Private Service Connect を使用して、コンシューマ プロジェクトを Google マネージド プロジェクトのマネージド リソースにリンクします。

外部アプリケーション ロードバランサを構成する

外部アプリケーション ロードバランサに接続できるのは HTTPS アプリケーションのみです。HTTP アプリケーションはサポートされていません。

gcloud CLI

次の手順を実施する前に、gcloud CLI SDK がインストールされ、beyondcorp.admin ロールを持つアカウントでログインしていることを確認します。

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    LB_PREFIX=web-app
    PROJECT_ID=my-project
    REGION=us-central1
    DOMAIN_NAME=app.example.com
    
    次のように置き換えます。

    • web-app: すべてのロードバランサ リソースの名前に付加される接頭辞。
    • my-project: Google Cloud プロジェクト ID。
    • us-central1: 接続とゲートウェイがデプロイされるリージョン。
    • app.example.com: アプリケーションのドメイン名。
  2. 次のコマンドを使用して、ネットワーク エンドポイント グループ(NEG)を作成します。

    gcloud beta compute network-endpoint-groups create $LB_PREFIX-neg \
        --region=$REGION \
        --network-endpoint-type=private-service-connect \
        --psc-target-service=$GATEWAY_URI_L7
    

    オプションのフラグ:

    • --network フラグを設定して、NEG 内のネットワーク エンドポイントのネットワーク名を指定します。指定しない場合は、デフォルトのプロジェクト ネットワークが使用されます。
    • --subnet フラグを設定して、NEG 内のネットワーク エンドポイントのサブネットワーク名を指定します。指定しない場合、ネットワーク エンドポイントは、ネットワーク エンドポイント グループが作成されたリージョン内の任意のサブネットワークに属することができます。
  3. 次のコマンドを実行して、NEG ベースのバックエンド サービスを作成し、Private Service Connect サービス アタッチメントに接続します。

    gcloud beta compute backend-services create $LB_PREFIX-backend-service \
        --global \
        --protocol=HTTPS \
        --load-balancing-scheme=EXTERNAL_MANAGED
    
    gcloud beta compute backend-services add-backend $LB_PREFIX-backend-service \
        --global \
        --network-endpoint-group=$LB_PREFIX-neg \
        --network-endpoint-group-region=$REGION
    
  4. 次のコマンドを実行して、ドメインの Google マネージド証明書を作成します。

    gcloud compute addresses create $LB_PREFIX-static-ip \
        --ip-version=IPV4 \
        --global
    gcloud compute ssl-certificates create $LB_PREFIX-ssl-cert \
        --domains=$DOMAIN_NAME \
        --global
    
    LB_IP="$(gcloud compute addresses describe $LB_PREFIX-static-ip --global --format='value(address)')"
    
  5. 次のコマンドを実行して、前の手順のバックエンドに基づいて外部アプリケーション ロードバランサを作成します。

    gcloud compute url-maps create $LB_PREFIX-map-https \
        --default-service=$LB_PREFIX-backend-service
    
    gcloud compute target-https-proxies create $LB_PREFIX-https-lb-proxy \
        --url-map=$LB_PREFIX-map-https \
        --ssl-certificates=$LB_PREFIX-ssl-cert
    
    gcloud beta compute forwarding-rules create "$LB_PREFIX-https-lb-forwarding-rule" \
        --global \
        --target-https-proxy=$LB_PREFIX-https-lb-proxy \
        --address=$LB_IP \
        --ports=443 \
        --load-balancing-scheme=EXTERNAL_MANAGED
    

    外部アプリケーション ロードバランサを作成すると、その IP アドレスを使用して、インターネット経由でアプリケーションにアクセスできるようになります。

  6. 外部アプリケーション ロードバランサを作成したら、Google Cloud が SSL 証明書をプロビジョニングできるように、その IP アドレスをドメイン名に関連付ける必要があります。IP アドレスを DNS 名に関連付ける方法については、DNS プロバイダの手順をご覧ください。次のコマンドを実行してプロビジョニングのステータスを確認します。

    1. DNS プロバイダで設定する IP アドレスを表示します。
      echo "Load Balancer ip address - $LB_IP"
      
    2. DNS を設定したら、次のコマンドを実行して、ドメイン名が IP アドレスに解決されるかどうかを確認します。
      dig $DOMAIN_NAME
      
    3. 次のコマンドを実行して、プロビジョニングのステータスを取得します。
    gcloud compute ssl-certificates describe $LB_PREFIX-ssl-cert \
        --global \
        --format="get(name,managed.status, managed.domainStatus)"
    

    SSL 証明書がプロビジョニングされると、DNS 名を使用してアプリケーションにアクセスできるようになります。

API

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    LB_PREFIX=web-app
    PROJECT_ID=my-project
    REGION=us-central1
    DOMAIN_NAME=app.example.com
    
    次のように置き換えます。

    • web-app: すべてのロードバランサ リソースの名前に付加される接頭辞。
    • my-project: Google Cloud プロジェクト ID。
    • us-central1: 接続とゲートウェイがデプロイされるリージョン。
    • app.example.com: アプリケーションのドメイン名。
  2. 次のコマンドを使用して、ネットワーク エンドポイント グループ(NEG)を作成します。

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/regions/${REGION}/networkEndpointGroups \
    -d "{ \
        'name': '${LB_PREFIX}-neg', \
        'network_endpoint_type': 'private-service-connect', \
        'psc_target_service': '${GATEWAY_URI_L7}' \
    }"
    

    省略可能フィールド:

    • network フィールドを設定して、NEG 内のネットワーク エンドポイントのネットワークの URL を指定します。指定しない場合は、デフォルトのプロジェクト ネットワークが使用されます。
    • subnetwork フィールドを設定して、NEG 内のネットワーク エンドポイントのサブネットワークの URL を指定します。指定しない場合、ネットワーク エンドポイントは、ネットワーク エンドポイント グループが作成されたリージョン内の任意のサブネットワークに属することができます。
  3. 次のコマンドを実行して、NEG ベースのバックエンド サービスを作成し、Private Service Connect サービス アタッチメントに接続します。

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices \
    -d "{ \
        'name': '${LB_PREFIX}-backend-service', \
        'service_protocol': 'HTTPS', \
        'port_name': 'https', \
        'load_balancing_scheme': 'EXTERNAL_MANAGED' \
    }"
    
    gcurl -X PATCH https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices/${LB_PREFIX}-backend-service \
    -d "{ \
        'backends': \
        [{ \
            'group': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/regions/${REGION}/networkEndpointGroups/${LB_PREFIX}-neg' \
        }] \
    }"
    
  4. 次のコマンドを実行して、ドメインの Google マネージド証明書を作成します。

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/addresses \
    -d "{ \
        'name': '${LB_PREFIX}-static-ip', \
        'ip_version': 'IPV4' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates \
    -d "{ \
        'name': '${LB_PREFIX}-ssl-cert', \
        'managed': \
        { \
            'domains': '${DOMAIN_NAME}' \
        }, \
        'type': 'MANAGED' \
    }"
    
    LB_IP=$(gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/addresses/${LB_PREFIX}-static-ip | jq -r '.address')
    
  5. 次のコマンドを実行して、前の手順のバックエンドに基づいて外部アプリケーション ロードバランサを作成します。

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/urlMaps \
    -d "{ \
        'name': '${LB_PREFIX}-map-https', \
        'default_service': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices/${LB_PREFIX}-backend-service' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/targetHttpsProxies \
    -d "{ \
        'name': '${LB_PREFIX}-https-lb-proxy', \
        'url_map': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/urlMaps/${LB_PREFIX}-map-https', \
        'ssl_certificate': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates/${LB_PREFIX}-ssl-cert' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/forwardingRules \
    -d "{ \
        'name': '${LB_PREFIX}-https-lb-forwarding-rule', \
        target: 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/targetHttpsProxies/${LB_PREFIX}-https-lb-proxy', \
        'ip_address': '${LB_IP}', \
        'port_range': '443-443', \
        'load_balancing_scheme': 'EXTERNAL_MANAGED' \
    }"
    

    外部アプリケーション ロードバランサを作成すると、その IP アドレスを使用して、インターネット経由でアプリケーションにアクセスできるようになります。

  6. 外部アプリケーション ロードバランサを作成したら、Google Cloud が SSL 証明書をプロビジョニングできるように、その IP アドレスをドメイン名に関連付ける必要があります。IP アドレスを DNS 名に関連付ける方法については、DNS プロバイダの手順をご覧ください。次のコマンドを実行してプロビジョニングのステータスを確認します。

    1. DNS プロバイダで設定する IP アドレスを表示します。
      echo "Load Balancer ip address - $LB_IP"
      
    2. DNS を設定したら、次のコマンドを実行して、ドメイン名が IP アドレスに解決されるかどうかを確認します。
      dig $DOMAIN_NAME
      
    3. 次のコマンドを実行して、プロビジョニングのステータスを取得します。
    echo $(gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates/${LB_PREFIX}-ssl-cert \
    | jq -r '.name + " " + .managed.status + " " + (.managed.domainStatus | keys[]) + "=" + .managed.domainStatus[]')
    

    SSL 証明書がプロビジョニングされると、DNS 名を使用してアプリケーションにアクセスできるようになります。

Identity-Aware Proxy の有効化

Identity-Aware Proxy(IAP)の設定については、Identity-Aware Proxy のドキュメントをご覧ください。IAP の設定後、次の手順でバックエンド サービスの IAP を有効にします。

  1. IAP ページに移動します。
    IAP

  2. [HTTPS リソース] で、$LB_PREFIX-backend-service を見つけます。このリソースで IAP を有効にするには、[IAP] 列で切り替えボタンをクリックします。表示された [IAP の有効化] ウィンドウでチェックボックスをオンにして、このリソースの構成要件を確認し、[有効にする] をクリックして、IAP でリソースを保護することを確認します。

  3. ユーザーがアプリケーションを使用できるようにするには、次の手順を実行して、プロジェクトの IAP で保護されたウェブアプリ ユーザーのロールをユーザーに付与する必要があります。

    1. $LB_PREFIX-backend-service チェックボックスをオンにします。
    2. 情報パネルで [プリンシパルを追加] を選択し、アプリケーションへのアクセスを許可するグループまたは個人のメールアドレスを入力します。
    3. [ロールを選択] プルダウン リストで、[Cloud IAP] > [IAP で保護されたウェブアプリ ユーザー] を選択し、[保存] をクリックします。

これで、オンプレミス アプリケーションがインターネットに公開され、BeyondCorp Enterprise によって保護されます。

Google Cloud コンソールを使用してアプリコネクタを設定する

Google Cloud コンソールを使用して BeyondCorp Enterprise アプリコネクタをデプロイするには、このセクションの手順を完了します。

アプリケーションの詳細を入力する

次の手順を行い、アプリケーションの詳細を追加します。

  1. Google Cloud コンソールの [IAP] ページに移動します。
    IAP に移動

  2. [CONNECT NEW APPLICATION] ボタンをクリックし、[アプリコネクタ経由で接続する] を選択します。

  3. [アプリケーション名] に、保護するアプリケーションの名前を入力します。

  4. [外部向けアプリケーション URL] に、ユーザーがアプリケーションにアクセスするための一般公開 URL を入力します。

  5. [Next] をクリックします。

Google Cloud への接続を設定する

Google Cloud と Google Cloud 以外の環境間の接続を確立するには、次の手順を行います。

  1. [アプリコネクタを作成] ボタンをクリックし、次の情報を入力します。

    • アプリコネクタ名: コネクタの名前。
    • リージョン: 接続ゲートウェイとコネクタをデプロイするリージョン。
  2. [CREATE] ボタンをクリックします。

  3. [仮想マシンのプロビジョニング] ペインの手順に沿って、VM にリモート エージェントをデプロイします。

  4. [TEST CONNECTION STATUS] ボタンをクリックして、接続をテストします。

  5. [Google Cloud でアプリケーションを探す場所] に次の情報を入力して、前のステップで作成したコネクタを構成します。

    • 内部ホスト名: アプリケーションをホストするオンプレミスの IP アドレスまたは FQDN。
    • ポート: アプリケーションに接続するポート番号。

アプリケーションへのアクセス権を付与します(任意)

  1. [新しいプリンシパル] に、次のうち 1 つ以上を入力します。

    • Google アカウントのメールアドレス: user@gmail.com
    • Google グループ: admins@googlegroups.com
    • サービス アカウント: server@example.gserviceaccount.com
    • Google Workspace ドメイン: example.com
    • 全員: 「allUsers」と入力して、すべてのユーザーにアクセス権を付与します。
    • すべての Google アカウント: allAuthenticatedUsers(Google アカウントにログインしたユーザーにアクセス権を付与)
  2. 1 つ以上のアクセスレベルを選択し、[次へ] をクリックします。

アプリケーションを発行

  1. アプリケーションを公開するには、[SECURELY PUBLISH APPLICATION] ボタンをクリックします。

  2. アプリケーションを公開し、安全に公開されたアプリケーションの確認を受け取ったら、外部に公開されているアプリケーションの URL がプロキシの IP アドレスを指すように DNS レコードを作成する必要があります。手順は次のとおりです。

    • [Step 2 - Update DNS] セクションで、[IP address] フィールドから IP アドレスをコピーします。IP アドレスを DNS 名と関連付ける方法に関する DNS プロバイダの手順に沿って、アドレスを使用して DNS レコードを作成します。
  3. DNS レコードを作成したら、[TEST] ボタンをクリックしてテストします。DNS テストに合格したことの確認メッセージが届きます。

  4. [完了] をクリックします。

IAP を有効にする

  1. IAP ページに移動します。
    IAP に移動

  2. リソースのリストからアプリケーションを見つけて、[IAP] 列でボタンを選択します。

  3. 表示される [IAP の有効化] ダイアログで、[構成要件を読み、ドキュメントに従ってバックエンド サービスを構成しました] チェックボックスをオンにし、次に [TURN ON] をクリックします。

これで、オンプレミス アプリケーションがインターネットに公開され、BeyondCorp Enterprise によって保護されます。

アプリ ゲートウェイを作成する(省略可)

アプリコネクタを使用してアプリケーションを接続する際には、アプリ ゲートウェイが暗黙的に作成、管理されます。独自のアプリ ゲートウェイを作成して、アプリの接続リソースをグループにまとめることもできます。異なるアプリ ゲートウェイでホストされているアプリ接続のトラフィックは、別の仮想インフラストラクチャ経由で転送されます。

アプリ ゲートウェイを作成して指定するには、次の手順を行います。

gcloud CLI

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    CONNECTOR_NAME=CONNECTOR_NAME
    CONNECTION_NAME=CONNECTION_NAME
    GATEWAY_NAME=GATEWAY_NAME
    PROJECT_ID=PROJECT_ID
    REGION=REGION
    APP_ENDPOINT=APP_HOST:APP_PORT
    

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

    • CONNECTOR_NAME: 前のステップで定義したコネクタの名前。
    • CONNECTION_NAME: 接続の一意の名前。
    • GATEWAY_NAME: アプリ ゲートウェイの名前。
    • PROJECT_ID: Google Cloud プロジェクト ID。
    • REGION: アプリ ゲートウェイをデプロイするリージョン(us-central1 など)。
    • APP_HOST: アプリケーションをホストするオンプレミスの IP アドレスまたは FQDN。
    • APP_PORT: アプリケーションに接続するポート番号。
  2. 次のコマンドを実行して、アプリ ゲートウェイを作成します。

    gcloud beta beyondcorp app gateways create $GATEWAY_NAME \
    --project=$PROJECT_ID --location=$REGION --display-name=$GATEWAY_NAME
    
  3. 次のコマンドを実行して、接続の作成呼び出しでアプリ ゲートウェイを指定します。

    gcloud beta beyondcorp app connections create $CONNECTION_NAME \
    --project=$PROJECT_ID \
    --location=$REGION \
    --application-endpoint=$APP_ENDPOINT \
    --type=tcp \
    --connectors=$CONNECTOR_NAME \
    --display-name=$CONNECTION_NAME \
    --app-gateway=$GATEWAY_NAME
    

API

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    CONNECTOR_NAME=CONNECTOR_NAME
    CONNECTION_NAME=CONNECTION_NAME
    GATEWAY_NAME=GATEWAY_NAME
    PROJECT_ID=PROJECT_ID
    REGION=REGION
    APP_ENDPOINT=APP_HOST:APP_PORT
    

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

    • CONNECTOR_NAME: 前のステップで定義したコネクタの名前。
    • CONNECTION_NAME: 接続の一意の名前。
    • GATEWAY_NAME: アプリ ゲートウェイの名前。
    • PROJECT_ID: Google Cloud プロジェクト ID。
    • REGION: アプリ ゲートウェイをデプロイするリージョン(us-central1 など)。
    • APP_HOST: アプリケーションをホストするオンプレミスの IP アドレスまたは FQDN。
    • APP_PORT: アプリケーションに接続するポート番号。
  2. 次のコマンドを実行して、アプリ ゲートウェイを作成します。

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appGateways?app_gateway_id=${GATEWAY_NAME} \
    -d "{ \
    'type': 'TCP_PROXY', \
    'display_name': '${CONNECTION_NAME}' \
    }"
    
  3. 次のコマンドを実行して、接続の作成呼び出しでアプリ ゲートウェイを指定します。

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections?app_connection_id=${CONNECTION_NAME} \
    -d "{ \
    'application_endpoint': \
    { \
    'host': '${APP_HOST}', \
    'port': '${APP_PORT}' \
    }, \
    'gateway': { 'app_gateway' : 'projects/${PROJECT_ID}/locations/${REGION}/appGateways/${GATEWAY_NAME}'}, \
    'connectors':['projects/${PROJECT_ID}/locations/${REGION}/appConnectors/${CONNECTOR_NAME}'], \
    'type': 'TCP_PROXY', \
    'display_name': '${CONNECTION_NAME}' \
    

次のステップ

トラブルシューティング

以前に作成したリソースが見つからない

gcloud CLI バージョン 392.0.0 以降を使用する場合は、新しいアプリコネクタのデフォルト リソース AppConnectorAppConnection を使用します。たとえば、gcloud alpha beyondcorp app connectorsgcloud alpha beyondcorp app connections は両方とも新しいリソースを参照します。

バージョン 392.0.0 より前の gcloud CLI を使用して作成された以前のリソースにアクセスするには、キーワード legacy を使用します。たとえば、gcloud alpha beyondcorp app legacy connectorsgcloud alpha beyondcorp app legacy connections は両方とも以前のリソースを参照します。

以前のリソースを使用した構成は、現時点では引き続き機能しますが、将来的にはサポートを終了する予定です。

  • このガイドの手順に沿って、新しいリソースを構成します。
  • 構成で以前のリソースを使用している場合は、キーワード legacy を使用して、それらのリソースを見つけて削除します。このドキュメントの手順に沿ってリソースを再作成してください。
  • 以前のリソースを使用する不完全な構成がある場合は、キーワード legacy を使用してこれらのリソースを見つけて削除します。このドキュメントの手順に沿ってリソースを再作成してください。

TLS / SSL エラー

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

ブラウザにエラー ERR_SSL_VERSION_OR_CIPHER_MISMATCH または同様の TLS / SSL エラーが表示され、ログインページにリダイレクトされません。

  • Google Cloud ロードバランサの詳細ページで証明書のステータスを確認します。

    注: Google マネージド証明書のプロビジョニングには最長で 60 分かかります。

TLS error

ブラウザは、ログインページにリダイレクトした後に upstream connect error or disconnect/reset before headers. retried and the latest reset reason: connection failure, transport failure reason: TLS error または同様の TLS / SSL エラーを表示します。

  • Connection で使用されているアプリケーション エンドポイントが HTTPS であることを確認します。
  • curl を使用して、リモート エージェント VM からアプリのエンドポイントにアクセスできることを確認します。

    curl https://$APP_ENDPOINT
    

    アプリケーション証明書が自己署名されている場合は、-k フラグの使用が必要になる場合があります。

ファイアウォール構成を確認する

リモート エージェントとインターネット間のファイアウォールで、次のドメインへの送信接続が許可されていることを確認します。

接続タイプ ドメイン ポート
TCP raw.githubusercontent.com 443
TCP gcr.io 443
TCP *.googleapis.com 443
TCP tunnel.cloudproxy.app 443
TCP *.tunnel.cloudproxy.app 443
TCP accounts.google.com 443
TCP oauth2.googleapis.com 443

接続に関連付けられているコネクタを変更する

gcloud

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    REGION=us-central1
    PROJECT_ID=my-project
    

    以下を置き換えます。

    • my-connector: コネクタの名前。connector1,connector2 のようなカンマ区切りリストにすることもできます。
    • my-connection: 更新する接続の名前。
    • us-central1: 接続がデプロイされているリージョン。
    • my-project: Google Cloud プロジェクト ID。
  2. 接続に関連付けられたコネクタを変更するには、次のコマンドを実行します。

    gcloud alpha beyondcorp app connections update $CONNECTION_NAME \
        --project=$PROJECT_ID \
        --location=$REGION \
        --connectors=$CONNECTOR_NAME
    

API

  1. 次のコマンドを実行して、必要な環境変数を設定します。

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    REGION=us-central1
    PROJECT_ID=my-project
    

    以下を置き換えます。

    • my-connector: コネクタの名前。
    • my-connection: 更新する接続の名前。
    • us-central1: 接続がデプロイされているリージョン。
    • my-project: Google Cloud プロジェクト ID。
  2. 接続に関連付けられたコネクタを変更するには、次のコマンドを実行します。

    gcurl -X PATCH \
    https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections/${CONNECTION_NAME}?update_mask=connectors \
    -d "{ \
        'connectors': ['projects/${PROJECT_ID}/locations/${REGION}/appConnectors/${CONNECTOR_NAME}'], \
    }"
    

    次のコマンドを実行し、出力の connectors フィールドを確認して、更新を確認できます。

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections/${CONNECTION_NAME}
    

プロキシ

プロキシのサポートは 2024 年初頭に導入され、BeyondCorp systemd ファイルを変更する必要があります。これより前にリモート エージェントをインストールし、プロキシを使用する場合は、リモート エージェントを再インストールします。

  • Docker デーモンがプロキシで動作するように正しく構成されていることを確認します。

  • HTTP プロキシ環境変数と HTTPS プロキシ環境変数の両方が設定され、両方が http:// スキーマを使用していることを確認します。https:// スキーマと他のスキーマはサポートされていません。

  • env コマンドを実行して、プロキシ環境変数がサブプロセスにエクスポートされていることを確認します。

  • HTTP_PROXYHTTPS_PROXYNO_PROXY と、それらに同等の小文字のみがサポートされています。

  • インストール後にプロキシ設定を更新する必要がある場合、デフォルトの beyondcorp ユーザーを使用している場合は、/var/beyondcorp/env/PROXY の環境変数を更新します。カスタム ユーザーを使用する場合は、Docker クライアントの構成手順に沿って /home/$USER/.docker/config.json を更新します。プロキシの変更を適用するには、次のコマンドを使用してリモート エージェントを再起動します。

    sudo systemctl restart beyondcorp
    

診断ツール

run-post-install-checks

run-post-install-checks は、/var/beyondcorp/scripts/ にインストールされたスクリプトで、リモート エージェントが正しくインストールされ、登録され、正常であるかを確認します。app connection の作成と、リモート エージェント(コネクタ)への割り当てに成功したら、リモート エージェント VM に移動して次のコマンドで run-post-install-checks を実行します。

sudo /var/beyondcorp/scripts/run-post-install-checks

すべてが正常な状態であれば、スクリプトは成功メッセージを出力します。

run-diagnostics

run-diagnostics は、/var/beyondcorp/scripts/ にインストールされるスクリプトで、リモート エージェント VM の一般的な問題を診断し、BeyondCorp Enterprise サポートチームと共有できるレポートを出力します。この診断スクリプトを実行するには、次のコマンドを実行します。

sudo /var/beyondcorp/scripts/run-diagnostics

診断レポートは、コンソールと ./diagnostics-report.txt に書き込まれます。

リモート エージェント CLI

bce-connctl は、リモート エージェントとローカルで対話するためのリモート エージェント管理のコマンドライン インターフェース(CLI)です。この CLI は、リモート エージェントの登録、ステータスの確認、構成値の設定など、さまざまなコマンドをサポートしています。

Init コマンド

Init コマンドを使用すると、リモート エージェントを初期化し、エージェントを登録するスクリプトを生成できます。

例:

bce-connctl init --project=$PROJECT_ID --region=$REGION --connector=$CONNECTOR_NAME

Status コマンド

Status コマンドを使用して、リモート エージェントのステータスを管理できます。

  • List: このコマンドは、リモート エージェントの全体的なステータスと、このエージェントでサポートされている接続のステータスを一覧表示するために使用します。例: bce-connctl status list

Config コマンド

Config コマンドを使用すると、リモート エージェントの構成値を管理できます。

  • List: このコマンドは、リモート エージェントの構成値を一覧表示するために使用します。例: bce-connctl config list
  • Set: このコマンドは、リモート エージェントの構成値の設定に使用します。例: bce-connctl config set <key> <value>

Enrollment コマンド

Enrollment コマンドを使用すると、リモート エージェントの登録を管理できます。

  • Describe: このコマンドは、リモート エージェントの登録ステータス取得に使用します。例: bce-connctl enrollment describe

    bce-connctl init の登録スクリプトが正常に完了し、公開鍵が正常にアップロードされると、ステータスは ENROLLED になります。

ヘルプ

任意の bce-connctl コマンドに -h または --help フラグを追加して、使用状況に関する情報を出力できます。

bce-connctl init -h