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 TCP 転送の使用権限を付与する

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

信頼できる管理者に次のすべてのロールを付与することをおすすめします。

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

Console

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

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

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

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

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

    たとえば、次の 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 を使用します。

  4. [別のロールを追加] をクリックして、次のように構成します。

    • ロールを選択: [Compute Engine] > [Compute インスタンス管理者(v1)] を選択します。
  5. [別のロールを追加] をクリックして、次のように構成します。

    • ロールを選択: [サービス アカウント] > [サービス アカウント ユーザー] をクリックします。
  6. [保存] をクリックします。

gcloud

ユーザーに 3 つのロールを付与します。

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

以下を置き換えます。

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

必要に応じて、VM ごとに iap.tunnelResourceAccessor ロールを構成することもできます(プロジェクトに他のロールが必要です)。

コンソール

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

    IAP 管理のページを開く

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

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

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

    たとえば、次の 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. [保存] をクリックします。

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}
    

権限の詳細

必要な権限は、ユーザーが IAP TCP 転送をどのように使用するかによって異なります。

シナリオ 必要な権限
すべて
  • iap.tunnelInstances.accessViaIAP
gcloud compute [start-iap-tunnel, ssh, scp] の使用
  • compute.instances.get
  • compute.instances.list
gcloud compute [ssh, scp] の使用
  • compute.projects.get
OS Login を使用する VM こちらの手順をご覧ください
OS Login を使用しない
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
サービス アカウントを使用して VM に SSH 接続
  • iam.serviceAccounts.actAs
ブラウザからの SSH こちらの手順をご覧ください

たとえば、ユーザーが gcloud compute ssh を使用して、OS Login は使用しないものの、サービス アカウントを使用する VM に接続する必要がある場合は、ユーザーに次の権限が必要です。

  • iap.tunnelInstances.accessViaIAP
  • compute.instances.get
  • compute.instances.list
  • compute.projects.get
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
  • iam.serviceAccounts.actAs

SSH 接続のトンネリング

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

IAP トンネリングを使用する場合、IAP プロキシは VM 上の nic0 のプライマリ内部 IPv4 アドレスに接続します。

Console

インスタンスに接続するには、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 ネットワークに接続している場合に役立ちます。

IAP Desktop

SSH と IAP の TCP 転送を使用すると、IAP デスクトップを使用して VM インスタンスに接続できます。

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

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

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

IAP Desktop

IAP Desktop の詳細については、GitHub プロジェクトのページをご覧ください。

PuTTY

IAP TCP 転送を使用して VM インスタンスに接続するように PuTTY を設定できます。インスタンスのアクセス構成(IAM 権限で定義)で、IAP 経由の TCP トンネリングを許可する必要があります。

PuTTY を構成する前に、gcloud compute ssh コマンドを 1 回使用して、ローカルのパソコンに秘密 SSH 認証鍵があることと、公開 SSH 認証鍵が Compute Engine に発行されていることを確認します。

  1. コマンド プロンプトを開き、次のコマンドを実行して VM インスタンスに接続します。

    gcloud compute ssh INSTANCE_NAME `
      --tunnel-through-iap `
      --project PROJECT_ID `
      --zone ZONE
    

    以下を置き換えます。

    • INSTANCE_NAME: 接続先のインスタンスの名前
    • PROJECT_ID: VM インスタンスが存在するプロジェクトのプロジェクト ID
    • ZONE: VM インスタンスが配置されているゾーン

    必要に応じて、Y を押して SSH 認証鍵が生成されることを確認します。

  2. VM で、次のコマンドを実行してユーザー名を決定します。

    whoami
    

    このユーザー名は後で必要になります。

これで IAP TCP 転送を使用する PuTTY が構成できるようになりました。

  1. PuTTY を開き、カテゴリ [Connection] > [Proxy] を選択します。
  2. 以下のプロキシ設定を構成します。

    • [プロキシの種類] で [ローカル] を選択します。
    • [Telnet command, or local proxy command] フィールドに、次のように入力します。

      gcloud.cmd compute start-iap-tunnel %host %port --listen-on-stdin --project PROJECT_ID --zone ZONE
      

      以下を置き換えます。

      • PROJECT_ID: VM インスタンスが存在するプロジェクトのプロジェクト ID
      • ZONE: VM インスタンスが配置されているゾーン
    • [Print proxy diagnostics in the terminal window] で [Only until session starts] を選択します。

  3. カテゴリ [Connection] > [SSH] > [Auth] を選択します。

  4. [Browse] をクリックして次のファイル名を貼り付け、[Open] をクリックします。

    %USERPROFILE%\.ssh\google_compute_engine.ppk
    
  5. [Session] カテゴリを選択します。

  6. 以下のプロキシ設定を構成します。

    • [Host name (or IP address)] フィールドに次のように入力します。

      USERNAME@INSTANCE_NAME
      

      以下を置き換えます。

      • USERNAME: 先ほど確認した Linux ユーザー名
      • INSTANCE_NAME: 接続先の VM インスタンスの名前
    • [Saved sessions]: セッションの名前を入力します。

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

  8. [開く] をクリックして、SSH セッションを開始します。

RDP 接続のトンネリング

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

IAP Desktop

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

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

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

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

IAP Desktop

IAP Desktop の詳細については、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 は、プロキシをバインドする localhost ポートに置き換えます。0 を使用すると、未使用のポートが自動的に選択されます。ZONE は、VM インスタンスが配置されているゾーンに置き換えます。

  2. gcloud は、VM インスタンスとの接続テストを実行し、トンネルを開き、ポート番号を表示します。

    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 は、VM インスタンスとの接続テストを実行し、トンネルを開き、ポート番号を表示します。

Listening on port [LOCAL_PORT].

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

既知の制限事項

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

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

次のステップ