IAP による仮想マシンの保護

このページでは、Identity-Aware Proxy(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 です。

コンソール

ネットワーク内のすべての VM インスタンスへの RDP と SSH のアクセスを許可するには、以下を行います。

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

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

    残りの手順は Google Cloud コンソールに自動的に表示されます。

  2. Google Cloud プロジェクトを選択します。 表示
  3. [ファイアウォール ルール] ページで、[ファイアウォール ルールを作成] をクリックします。
  4. 以下の設定を構成します。
    • 名前: allow-ingress-from-iap
    • トラフィックの方向: 上り(内向き)
    • ターゲット: ネットワーク内のすべてのインスタンス
    • ソースフィルタ: IP 範囲
    • 送信元 IP 範囲: 35.235.240.0/20
    • プロトコルとポート: [TCP] を選択して 22,3389 を入力し、RDP と SSH の両方を許可します。
  5. [作成] をクリックします。

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)ロールを付与します。

次の表は、TCP 転送と関連タスクのために信頼できる管理者に付与する必要がある事前定義ロールを示しています。

タスク ロール 詳細
TCP 転送 IAP で保護されたトンネル ユーザー(roles/iap.tunnelResourceAccessor プロジェクト内のすべての VM インスタンスへのアクセスを許可するまたは特定の VM へのアクセスを許可するをご覧ください。
SSH アクセス Compute インスタンス管理者(v1)(roles/compute.instanceAdmin.v1
OS Login(推奨) 複数 ユーザー アカウントに OS Login のロールを構成するをご覧ください。
サービス アカウントを使用する サービス アカウント ユーザー(roles/iam.serviceAccountUser serviceAccountUser ロールをご覧ください。

このタスクに必要な特定の権限のみを含むカスタムロールを作成する場合は、権限の詳細をご覧ください。

必要なロールを付与する方法に応じて、ユーザーまたはグループにプロジェクト内のすべての VM インスタンスまたは特定の VM へのアクセス権を付与できます。

プロジェクト内のすべての VM インスタンスへのアクセスを許可する

ユーザーまたはグループにプロジェクト内のすべての VM インスタンスへのアクセス権を付与するには、必要な IAM ロールをプロジェクト レベルで付与します。

コンソール

  1. Google Cloud コンソールで [IAM と管理] ページを開きます。

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

    残りの手順は、Google Cloud コンソールに自動的に表示されます。

  2. [IAM と管理] ページで、[追加] をクリックして次の構成を行います。
    • 新しいプリンシパル: アクセスを許可するユーザーまたはグループを指定します。
    • [ロールを選択] で [Cloud IAP] > [IAP で保護されたトンネル ユーザー] を選択します。
  3. 必要に応じて、[条件を追加] をクリックして条件を構成します。
    • タイトル: 条件の名前を入力します。
    • : 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. [保存] をクリックします。

gcloud

次のコマンドを実行して、2 つのロールをユーザーに付与します。

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

以下を置き換えます。

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

特定の VM へのアクセスを許可する

特定の VM に対するアクセス権をユーザーやグループに付与するには、その VM に対する roles/iap.tunnelResourceAccessor 役割を付与します。他のロールはプロジェクトに付与する必要があります。

コンソール

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

    BeyondCorp Enterprise の管理ページを開く

    残りの手順は、Google Cloud コンソールに自動的に表示されます。

  2. IAP 管理ページの [SSH と TCP のリソース] タブで、構成する VM インスタンスを選択します。
  3. 情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。
  4. [プリンシパルを追加] をクリックして、以下を構成します。

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

    • タイトル: 条件の名前を入力します。
    • : 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 を使用してアクセス ポリシーを管理する方法の詳細については、BeyondCorp Enterprise で保護されたリソースへのアクセスの管理をご覧ください。

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

    export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

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

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

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

  4. 必要に応じて、IAM Conditionsアクセスレベルに基づいて、特定の条件を満たすプリンシパルにのみロールを付与します。

    次の例では、iap.tunnelResourceAccessor 役割を VM インスタンスの管理者グループを補助して、BeyondCorp Enterprise で保護されたトンネル リソースへのアクセス権を付与するように、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
    
  5. setIamPolicy メソッドを使用して、新しい policy.json ファイルを設定します。

    curl -i -H "Content-Type:application/json" \
              -H "Authorization: Bearer $(gcloud auth print-access-token)" \
              ${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

インスタンスに接続するには、Google Cloud コンソールで 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 Windows ターミナル エミュレータ アプリを設定できます。インスタンスのアクセス構成(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 セッションを開始します。

ssh

gcloud を使用する ProxyCommand オプションを指定し、ssh コマンドを直接使用してトンネルを起動できます。以下を使用して完全な ssh コマンドを生成します。

gcloud compute ssh INSTANCE_NAME --dry-run

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 TCP アップロード帯域幅を増やすには、gcloud CLI がインストールされているのと同じマシンに NumPy をインストールすることをご検討ください。

Linux

Unix プラットフォームで pip を使用して NumPy をインストールするには、新しいターミナル インスタンスで次のコマンドを実行します。

$(gcloud info --format="value(basic.python_location)") -m pip install numpy
詳細については、NumPy.org をご覧ください。

NumPy のインストール後にエラー メッセージが引き続き表示される場合は、次の手順を行ってください。 次のコマンドを実行して、gcloud に外部パッケージへのアクセスを許可します。

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Windows

Windows プラットフォームで pip を使用して NumPy をインストールするには、新しい PowerShell インスタンスで次のコマンドを実行します。

start (gcloud info --format="value(basic.python_location)") "-m pip install numpy"
詳細については、NumPy.org をご覧ください。

NumPy のインストール後もメッセージが引き続き表示される場合は、別の手順が必要です。 次のコマンドを実行して、gcloud が外部パッケージにアクセスできるようにします。

$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"

既知の制限事項

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

接続時間: IAP は、非アクティブ状態が 1 時間続くとセッションを自動的に切断します。現在、gcloud compute start-iap-tunnel はトンネルが切断された場合に再確立を試みます。

次のステップ