このページでは、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 のアクセスを許可するには、以下を行います。
- [ファイアウォール ルール] ページを開く。
残りの手順は、Google Cloud コンソールに表示されます。
- Google Cloud プロジェクトを選択します。
表示 - [ファイアウォール ルール] ページで、[
ファイアウォール ルールを作成 ] をクリックします。 - 以下の設定を構成します。
- 名前:
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)ロールを付与します。
OS Login(推奨)を使用している場合は、ユーザー アカウントに OS Login のロールを構成するをご覧ください。
次の表は、TCP 転送と関連タスクのために信頼できる管理者に付与する必要がある事前定義ロールを示しています。
タスク | ロール | 詳細 |
---|---|---|
TCP 転送 |
IAP で保護されたトンネル ユーザー(roles/iap.tunnelResourceAccessor )
|
プロジェクト内のすべての VM インスタンスへのアクセスを許可するまたは特定の VM へのアクセスを許可するをご覧ください。 |
SSH アクセス |
Compute インスタンス管理者(v1)(roles/compute.instanceAdmin.v1 )
|
|
サービス アカウントを使用する | サービス アカウント ユーザー(roles/iam.serviceAccountUser ) |
serviceAccountUser ロールをご覧ください。 |
このタスクに必要な特定の権限のみを含むカスタムロールを作成する場合は、権限の詳細をご覧ください。
必要なロールを付与する方法に応じて、ユーザーまたはグループにプロジェクト内のすべての VM インスタンスまたは特定の VM へのアクセス権を付与できます。
タグはサポートされていません
現在、IAP TCP 転送のタグを使用した権限の付与はサポートされていません。
プロジェクト内のすべての VM インスタンスへのアクセスを許可する
ユーザーまたはグループにプロジェクト内のすべての VM インスタンスへのアクセス権を付与するには、必要な IAM ロールをプロジェクト レベルで付与します。
コンソール
- Google Cloud コンソールで [IAM と管理] ページを開きます。
残りの手順は、Google Cloud コンソールに表示されます。
- [IAM と管理] ページで、[追加] をクリックして次の構成を行います。
- 新しいプリンシパル: アクセスを許可するユーザーまたはグループを指定します。
- [ロールを選択] で [Cloud IAP] > [IAP で保護されたトンネル ユーザー] を選択します。
- 必要に応じて、[条件を追加] をクリックして条件を構成します。
- タイトル: 条件の名前を入力します。
- 式: 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
- [別のロールを追加] をクリックして、次のように構成します。
- ロールを選択: [Compute Engine] > [Compute インスタンス管理者(v1)] を選択します。
- [保存] をクリックします。
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
: プロジェクトの IDEMAIL
: アクセスを許可するユーザーのメールアドレス(例:user@example.com
)。
特定の VM へのアクセスを許可する
特定の VM に対するアクセス権をユーザーやグループに付与するには、その VM に対する roles/iap.tunnelResourceAccessor
役割を付与します。他のロールはプロジェクトに付与する必要があります。
コンソール
- [IAP 管理] ページを開き、[SSH と TCP のリソース] タブを選択します。
Chrome Enterprise Premium の管理ページを開く
残りの手順は、Google Cloud コンソールに表示されます。
- IAP 管理ページの [SSH と TCP のリソース] タブで、構成する VM インスタンスを選択します。
- 情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。
[プリンシパルを追加] をクリックして、以下を構成します。
- 新しいプリンシパル: アクセスを許可するユーザーまたはグループを指定します。
- [ロールを選択] で [Cloud IAP] > [IAP で保護されたトンネル ユーザー] を選択します。
必要に応じて、[条件を追加] をクリックして条件を構成します。
- タイトル: 条件の名前を入力します。
- 式: 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
を使用します。- [保存] をクリックします。
API
アプリケーションの policy.json
ファイルを編集するには、以下の手順に従います。IAM API を使用してアクセス ポリシーを管理する方法については、Chrome Enterprise Premium で保護されたリソースへのアクセスの管理をご覧ください。
次の変数をエクスポートします。
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
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 ''
IAM ポリシー JSON ファイルを変更して、プリンシパルに
iap.tunnelResourceAccessor
ロールを付与します。必要に応じて、IAM Conditions とアクセスレベルに基づいて、特定の条件を満たすプリンシパルにのみロールを付与します。
次の例では、
iap.tunnelResourceAccessor
ロールを VM インスタンスの管理者グループを補助して、Chrome Enterprise Premium で保護されたトンネル リソースへのアクセス権を付与するように、policy.json
ファイルを編集しています。destination.ip
とdestination.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
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 転送をどのように使用するかによって異なります。
Scenarios | 必要な権限 | |
---|---|---|
すべて |
|
|
gcloud compute [start-iap-tunnel, ssh, scp] の使用 |
|
|
gcloud compute [ssh, scp] の使用 |
|
|
OS Login を使用する VM | こちらの手順をご覧ください | |
OS Login を使用しない |
|
|
サービス アカウントを使用して VM に SSH 接続 |
|
|
ブラウザからの 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 アドレスに接続します。
コンソール
インスタンスに接続するには、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 インスタンスに接続できます。
アプリケーションで、[ファイル] > [Google Cloud プロジェクトを追加] を選択します。
プロジェクトの ID または名前を入力して、[OK] をクリックします。
[プロジェクト エクスプローラ] ウィンドウで、接続する VM インスタンスを右クリックし、[接続] を選択します。
IAP Desktop の詳細については、GitHub プロジェクトのページをご覧ください。
PuTTY アプリ
IAP TCP 転送を使用して VM インスタンスに接続するように、PuTTY Windows ターミナル エミュレータ アプリを設定できます。インスタンスのアクセス構成(IAM 権限で定義)で、IAP 経由の TCP トンネリングを許可する必要があります。
PuTTY アプリを構成する前に、gcloud compute ssh
コマンドを 1 回使用して、ローカルのパソコンに秘密 SSH 認証鍵があることと、公開 SSH 認証鍵が Compute Engine に公開されていることを確認します。
コマンド プロンプトを開き、次のコマンドを実行して VM インスタンスに接続します。
gcloud compute ssh INSTANCE_NAME ` --tunnel-through-iap ` --project PROJECT_ID ` --zone ZONE
以下を置き換えます。
- INSTANCE_NAME: 接続先のインスタンスの名前
- PROJECT_ID: VM インスタンスが存在するプロジェクトのプロジェクト ID
- ZONE: VM インスタンスが配置されているゾーン
必要に応じて、
Y
を押して SSH 認証鍵が生成されることを確認します。VM で、次のコマンドを実行してユーザー名を決定します。
whoami
このユーザー名は後で必要になります。
これで、IAP TCP 転送を使用するように PuTTY アプリを構成できます。
- PuTTY アプリを開きます。[Connection] > [Proxy] カテゴリを選択します。
以下のプロキシ設定を構成します。
- [プロキシの種類] で [ローカル] を選択します。
[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] を選択します。
カテゴリ [Connection] > [SSH] > [Auth] を選択します。
[Browse] をクリックして次のファイル名を貼り付け、[Open] をクリックします。
%USERPROFILE%\.ssh\google_compute_engine.ppk
[Session] カテゴリを選択します。
以下のプロキシ設定を構成します。
[Host name (or IP address)] フィールドに次のように入力します。
USERNAME@INSTANCE_NAME
以下を置き換えます。
- USERNAME: 先ほど確認した Linux ユーザー名
- INSTANCE_NAME: 接続先の VM インスタンスの名前
[Saved sessions]: セッションの名前を入力します。
[保存] をクリックします。
[開く] をクリックして、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 インスタンスのリモート デスクトップに接続できます。
アプリケーションで、[ファイル] > [Google Cloud プロジェクトを追加] を選択します。
プロジェクトの ID または名前を入力して、[OK] をクリックします。
[プロジェクト エクスプローラ] ウィンドウで、接続する VM インスタンスを右クリックし、[接続] を選択します。
IAP Desktop の詳細については、GitHub プロジェクトのページをご覧ください。
gcloud
VM インスタンスのリモート デスクトップに接続するには、まずトンネルを作成します。
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 インスタンスが配置されているゾーンに置き換えます。
gcloud
は、VM インスタンスとの接続テストを実行し、トンネルを開き、ポート番号を表示します。Listening on port [LOCAL_PORT].
localhost: LOCAL_PORT に送信されたすべてのトラフィックは、VM インスタンスに転送されます。このポートには、ローカル コンピュータで実行しているアプリケーションだけがアクセスできます。
gcloud
を実行したままにして、Microsoft Windows リモート デスクトップ接続アプリを開きます。トンネル エンドポイントをコンピュータ名として入力します。
localhost:LOCAL_PORT
LOCAL_PORT は、トンネルが
gcloud
によって開かれたときに表示されたポート番号に置き換えます。[接続] をクリックします。
他の 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_NAME と INSTANCE_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 のインストール後にエラー メッセージが引き続き表示される場合は、次の手順を行ってください。 次のコマンドを実行して、gcloud に外部パッケージへのアクセスを許可します。
export CLOUDSDK_PYTHON_SITEPACKAGES=1
Windows
Windows プラットフォームで pip を使用して NumPy をインストールするには、新しい PowerShell インスタンスで次のコマンドを実行します。
start (gcloud info --format="value(basic.python_location)") "-m pip install numpy"
NumPy のインストール後もメッセージが引き続き表示される場合は、別の手順が必要です。 次のコマンドを実行して、gcloud が外部パッケージにアクセスできるようにします。
$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"
既知の制限事項
帯域幅: IAP の TCP 転送機能は、データの一括転送を対象としていません。IAP は、このサービスの悪用を防ぐため、ユーザーにレート制限を設定できる権限を有します。
接続時間: IAP は、非アクティブ状態が 1 時間続くとセッションを自動的に切断します。現在、gcloud compute start-iap-tunnel
はトンネルが切断された場合に再確立を試みます。
次のステップ
- アクセスレベルを適用して、より詳細なコンテキスト ルールを設定する。
- Cloud Audit Logs を有効にするでアクセス リクエストを確認する。
- IAP の詳細について学習する。