TCP 転送での IAP の使用

このページでは、IAP TCP 転送を使用して、パブリック IP アドレスを持たない、またはインターネット経由の直接アクセスを許可しない VM インスタンスへの管理者権限を有効にする方法について説明します。

IAP TCP 転送では、SSH、RDP、その他のトラフィックを VM インスタンスに転送できる暗号化トンネルを確立できます。IAP TCP 転送では、トンネルの確立を許可するユーザーと、ユーザーの接続を許可する VM インスタンスをきめ細かく制御することもできます。

IAP TCP 転送の仕組みについては、TCP 転送の概要をご覧ください。

IAP TCP 転送用のプロジェクトの準備

このセクションでは、Google Cloud プロジェクトで IAP TCP 転送を有効にするために必要な手順を説明します。

ファイアウォール ルールの作成

IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。

  • IAP を使用してアクセス可能にするすべての VM インスタンスに適用します。
  • IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可します。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。
  • IAP TCP 転送を使用してアクセス可能にするすべてのポートへの接続を許可します。たとえば、SSH のポート 22 と RDP のポート 3389 です。

Console

ネットワーク内のすべての VM インスタンスへの RDP と SSH のアクセスを許可するには、次のようにします。

  • [ファイアウォール ルール] ページを開き、[ファイアウォール ルールを作成] をクリックします

    [ファイアウォール ルール] ページを開く

  • 以下を構成します。

    • 名前: allow-ingress-from-iap
    • トラフィックの方向: 上り(内向き)
    • ターゲット: ネットワーク内のすべてのインスタンス
    • ソースフィルタ: IP 範囲
    • ソース IP の範囲: 35.235.240.0/20
    • プロトコルとポート: [TCP] を選択して 22,3389 を入力し、RDP と SSH の両方を許可します。
  • [作成] をクリック

gcloud

ネットワーク内のすべての VM インスタンスへの RDP アクセスを許可するには、次を実行します。

gcloud compute firewall-rules create allow-rdp-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:3389 \
  --source-ranges=35.235.240.0/20

SSH アクセスには、次を実行します。

gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

他のプロトコルには、次を実行します。

gcloud compute firewall-rules create allow-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:PORT \
  --source-ranges=35.235.240.0/20

ここで、PORT はプロトコルで使用されるポートです。

IAP を使用するための権限を付与する

IAP TCP 転送の使用が許可されるユーザーとグループと、ユーザーとグループが接続を許可される VM インスタンスを制御するには、Identity and Access Management(IAM)権限を構成します。

プロジェクト レベルで IAM 権限を構成することで、ユーザーまたはグループにプロジェクト内のすべての VM インスタンスへのアクセス権を付与できます。

Console

  1. Cloud Console で [IAM と管理] ページを開きます。

    [IAMと管理] ページを開く

  2. [追加] をクリックして、以下を構成します。

    • 新しいメンバー: アクセスを許可するユーザーまたはグループを指定します。
    • [ロールを選択する] で [Cloud IAP] > [IAP で保護されたトンネル ユーザー] を選択します。
  3. [保存] をクリックします。

gcloud

ユーザーに iap.tunnelResourceAccessor ロールを付与します。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/iap.tunnelResourceAccessor

以下を置き換えます。

  • PROJECT_ID: プロジェクトの ID
  • EMAIL: アクセスを許可するユーザーのメールアドレス(例: user@example.com)。

API

アプリケーションの policy.json ファイルを編集するには、以下の手順に従います。IAM API を使用してアクセス ポリシーを管理する方法については、IAP で保護されたリソースへのアクセスの管理をご覧ください。

  1. サービス アカウントの認証情報ファイルをダウンロードします。

    1. [サービス アカウント] ページに移動します。
      [サービス アカウント] ページに移動

    2. サービス アカウントのメールアドレスをクリックします。

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

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

    5. キーのタイプとして JSON を選択します。

    6. 新しいキーを作成します。[作成] をクリックして、表示された確認ウィンドウを閉じます。

    これで JSON 認証情報ファイルがダウンロードされました。

  2. 次の変数をエクスポートします。

    export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel
    # Replace with the path to your local service account's downloaded JSON file
    export JSON_CREDS=EXAMPLE.IAM.GSERVICEACCOUNT.COM.JSON
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  3. 次のコマンドを実行して、Oauth2l でサービス アカウント認証情報の JSON ファイルを OAuth アクセス トークンに変換します。

    oauth2l header --json ${JSON_CREDS} cloud-platform

  4. 上のコマンドを初めて実行した場合、プロンプトが表示されたら次の操作を行います。

    1. 表示されたリンクをクリックしてコードをコピーし、確認コードを取得します。
    2. アプリのプロンプトに確認コードを貼り付けます。
    3. 返された署名なしトークンをコピーします。
    4. 返された署名なしトークンの値に割り当てられた新しい変数をエクスポートします。
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. このコマンドを以前に実行している場合、次の変数をエクスポートします。

    export CLOUD_OAUTH_TOKEN="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"

  6. getIamPolicy メソッドを使用して、Compute Engine インスタンスの IAM ポリシーを取得します。最後にある空のデータビットを使用して、curl リクエストを GET ではなく POST に変えます。

    curl -i -H "${CLOUD_OAUTH_TOKEN}" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  7. IAM ポリシー JSON ファイルを変更して、メンバーに iap.tunnelResourceAccessor ロールを付与します。

  8. 必要に応じて、IAM Conditionsアクセスレベルに基づいてメンバーの制限を追加します。

    次の例では、iap.tunnelResourceAccessor 役割を VM インスタンスの管理者グループにバインドして、IAP で保護されたトンネル リソースへのアクセス権を付与するように、policy.json ファイルを編集しています。destination.ipdestination.port の IAM Conditions を使用して、ポート 22 にプライベート IP アドレス 10.0.0.1 を持つ VM インスタンス管理者グループのメンバーだけがリソースにアクセスできるようにするための IAM 条件が追加されます。また、ACCESS_LEVEL_NAME アクセス レベルの要件を満たす必要があります。

    メンバーにオーナーのロールがある場合、TCP 転送に IAP を使用する権限がメンバーに付与されています。


    policy.json ファイルの例

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["group:instance-admins@example.com"],
            "condition": {
              "expression": "\"accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME\" in request.auth.access_levels && destination.ip == \"10.0.0.1\" && destination.port == 22",
              "title": "CONDITION_NAME"
            }
          }
        ]
      }
    }

    ポリシー名を見つけるには、accessPolicies.list を呼び出します。

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  9. setIamPolicy メソッドを使用して、新しい policy.json ファイルを設定します。

    curl -i -H "Content-Type:application/json" \
              -H "$(oauth2l header --json ${JSON_CREDS} cloud-platform)" \
              ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:setIamPolicy \
              -d @${JSON_NEW_POLICY}
    

代わりに、VM ごとに IAM 権限を個別に構成することもできます。

Console

  1. [IAP 管理] ページを開き、[SSH と TCP のリソース] タブを選択します。

    IAP 管理のページを開く

  2. 構成する VM インスタンスを選択します。
  3. 情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。
  4. [メンバーの追加] をクリックして、以下を構成します。

    • 新しいメンバー: アクセスを許可するユーザーまたはグループを指定します。
    • [ロールを選択する] で [Cloud IAP] > [IAP で保護されたトンネル ユーザー] を選択します。
  5. 必要に応じて、[条件の追加] をクリックして、メンバー制限を構成します。

    • タイトル: 制限の名前を入力します。
    • : IAM TCP 転送の使用を許可される前に、ユーザーが満たす必要がある条件を入力します。

    たとえば、次の CEL 式ではポート 22 へのアクセスを制限します。

    destination.port == 22
    

    アクセスレベルでアクセスを制限することもできます。

    destination.port == 22 && "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels
    

    ここで、FULL_ACCESS_LEVEL_NAME は既存のアクセスレベルであり、形式 accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME を使用します。

  6. [保存] をクリックします。

SSH 接続のトンネリング

IAP を経由して SSH トラフィックをトンネリングすることにより、パブリック IP アドレスを持たない Linux インスタンスに接続できます。

コンソール

インスタンスに接続するには、Cloud Console で SSH ボタンを使用します。インスタンスのアクセス構成(IAM 権限で定義)で、IAP 経由の TCP トンネリングを許可する必要があります。

gcloud

インスタンスに接続するには、gcloud compute ssh コマンドを使用します。インスタンスのアクセス構成(IAM 権限で定義)で、IAP 経由の TCP トンネリングを許可する必要があります。

gcloud compute ssh INSTANCE_NAME

INSTANCE_NAME を、SSH で接続するインスタンスの名前に置き換えます。

インスタンスにパブリック IP アドレスがない場合、接続で IAP TCP トンネリングが自動的に使用されます。インスタンスにパブリック IP アドレスがある場合は、接続で IAP TCP トンネリングではなく、パブリック IP アドレスが使用されます。

--tunnel-through-iap フラグを使用すると、gcloud compute ssh が常に IAP TCP トンネリングを使用するようにできます。

--internal-ipフラグを使用して、gcloud compute ssh が IAP TCP トンネリングを使用せず、VM の内部 IP に直接接続するようにします。これは、クライアントがターゲット VM と同じ VPC ネットワークに接続している場合に役立ちます。

RDP 接続のトンネリング

IAP を経由して RDP トラフィックをトンネリングすることにより、パブリック IP アドレスを持たない Windows インスタンスに接続できます。

IAP Desktop

IAP デスクトップを使用すると、IAP TCP 転送を使用して 1 つ以上の VM インスタンスのリモート デスクトップに接続できます。

  1. アプリケーションで、[ファイル] > [Google Cloud プロジェクトを追加] を選択します。

  2. プロジェクトの ID または名前を入力して、[OK] をクリックします。

  3. [プロジェクト エクスプローラ] ウィンドウで、接続する VM インスタンスを右クリックし、[接続] を選択します。

IAP Desktop

IAP デスクトップについては、GitHub プロジェクト ページをご覧ください。

gcloud

VM インスタンスのリモート デスクトップに接続するには、まずトンネルを作成します。

  1. gcloud compute start-iap-tunnel コマンドを使用して、VM インスタンスの RDP ポートへの暗号化されたトンネルを作成します。

    gcloud compute start-iap-tunnel INSTANCE_NAME 3389 \
        --local-host-port=localhost:LOCAL_PORT \
        --zone=ZONE
    

    INSTANCE_NAME は、接続する VM インスタンスの名前に置き換えます。LOCAL_PORT は、プロキシをバインドするローカルポートに置き換えます。0 を使用すると、未使用のポートが自動的に選択されます。ZONE は、VM インスタンスが配置されているゾーンに置き換えます。

  2. gcloud はトンネルを開き、ポート番号を表示します。

    Listening on port [LOCAL_PORT].
    

    localhost: LOCAL_PORT に送信されたすべてのトラフィックは、VM インスタンスに転送されます。このポートには、ローカル コンピュータで実行しているアプリケーションだけがアクセスできます。

  3. gcloud を実行したままにして、Microsoft Windows リモート デスクトップ接続アプリを開きます。

  4. トンネル エンドポイントをコンピュータ名として入力します。

    localhost:LOCAL_PORT
    

    LOCAL_PORT は、トンネルが gcloud によって開かれたときに表示されたポート番号に置き換えます。

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

他の TCP 接続のトンネリング

gcloud compute start-iap-tunnel コマンドを使用してローカルポートを割り当てることにより、他の TCP ベースのプロトコルに IAP TCP 転送を使用できます。ローカルポートは、ローカルマシンからリモートマシンへのデータ トラフィックを HTTPS ストリームでトンネリングします。IAP はこのデータを受け取り、アクセス制御を適用して、ラップ解除されたデータをリモートデータに転送します。逆に、リモートポートからのデータはラップされてからローカルポートに送信され、ラップが解除されます。

gcloud

VM インスタンスのポートへの暗号化されたトンネルを作成します。

gcloud compute start-iap-tunnel INSTANCE_NAME INSTANCE_PORT \
    --local-host-port=localhost:LOCAL_PORT \
    --zone=ZONE

INSTANCE_NAMEINSTANCE_PORT は、接続する VM インスタンスの名前とポートに置き換えます。LOCAL_PORT は、プロキシをバインドする localhost のポートに置き換えます。ZONE は、VM インスタンスが配置されているゾーンに置き換えます。

gcloud はトンネルを開き、ポート番号を表示します。

Listening on port [LOCAL_PORT].

localhost: LOCAL_PORT に送信されたすべてのトラフィックは、VM インスタンスに転送されます。このポートには、ローカル コンピュータで実行しているアプリケーションだけがアクセスできます。

既知の制限事項

帯域幅: IAP の TCP 転送機能は、データの一括転送を対象としていません。IAP は、このサービスの悪用を防ぐため、ユーザーにレート制限を設定できる権限を有します。

接続時間: IAP は、非アクティブ状態が 1 時間続くとセッションを自動的に切断します。切断された場合にトンネルの再確立を処理するロジックをアプリケーションに入れておくことをおすすめします。

次のステップ