踏み台サーバはもういらない。IAP(Identity-Aware Proxy)の便利な使い方

記事タイトルとURLをコピーする

G-genの杉村です。

Google Cloud (旧称 GCP) には Cloud Identity-Aware Proxy (以下、IAP) というサービスがあります。

一般的な用語で IAP といえば、 VPN レスを実現する大層な仕組み、というイメージかもしれません。 Google Cloud の IAP には色々な機能がありますが、今日取り上げるのは Google Compute Engine (以下、GCE) のインスタンス (VM) の SSH/RDP ログインのために使える便利な機能です。

Identity-Aware Proxy (IAP)

Cloud IAP とは

IAPの概念

Cloud IAP は簡単に言うと Google Cloud (旧称 GCP) が提供する フルマネージドのリバースプロキシ です。フルマネージドですので、利用者は IAP を構築したり運用・保守する必要はありません。

上図のように IAP を経由して VPC にある各種リソースへアクセスしたり、 IAP Connector というコンポーネントをデプロイすればオンプレミスのリソースへのアクセスも中継することができます。

なお Cloud IAP は BeyondCorp Enterprise の一つの要素にもなっています。当記事では BeyondCorp Enterprise には触れませんが、ご興味のある方は以下の記事をご参照ください。

blog.g-gen.co.jp

料金

無料です

ただし、デバイス制限をかけるなど、詳細なアクセス制御をかける場合は BeyondCorp Enterprise の機能となり、有償となります。
詳細は以下をご参照ください。

cloud.google.com

VM にアクセスするための踏み台として使う

External IP が不要なインスタンスにはセキュリティ上、 External IP を付与せずにおきたいものです。そうするとインスタンスにログインするためいは踏み台サーバを用意する必要があると思われるかもしれません。

IAP を使えば 踏み台サーバが不要 です。

VMログインのためのIAP

この図のように、利用者はまずインターネット経由 (HTTPS) で IAP へアクセスし、トンネルを貼ります。このとき、利用者は Google アカウントで認証します。また IAP を利用できるのは、 Cloud IAM で適切なロールを付与された人だけです。

VPC のファイアウォールルールで、 IAP の接続元 IP アドレスである 35.235.240.0/20 からの 22/TCP (SSH) もしくは 3389/TCP (RDP) 接続を許可します。

これで利用者は IAP 経由で External IP を持っていない VM にログインすることができます。 (もちろん External IP を持っている VM にも利用できます。)

設定方法

設定方法は思いの外簡単です。以下の2つを実施すれば、もう IAP が使えてしまいます。

VPC のファイアウォール設定

対象インスタンスの存在する VPC のファイアウォール上りルールで 35.235.240.0/20 からの 22/TCP (SSH) もしくは 3389/TCP (RDP) 接続を許可します。

IAM 権限の付与

IAP を利用させる Google アカウント / グループ に必要な IAM ロールを付与します。

以下の IAM ロールを、プロジェクトのレベルでアタッチしてください。

  • Compute 閲覧者 (roles/compute.viewer)Compute OS ログイン (roles/compute.osLogin) 等の compute.instances.get 権限を持つロール

また以下の IAM ロールを、プロジェクトのレベルまたは VM の IAP トンネルリソースごとにアタッチしてください。

  • IAP で保護された トンネル ユーザー (roles/iap.tunnelResourceAccessor)

手順は、以下のドキュメントを参考にしてください。

参考: IAP TCP 転送の使用権限を付与する

なお利用できるポート番号を制限したり、 Access Context Manager で定義したアクセスレベルを満たしていることを条件として追加することもできます。

また先述の プロジェクトのレベルでアタッチ の意味がピンと来ない場合は、以下の記事をぜひご参照ください。

blog.g-gen.co.jp

アクセス方法

SSH の場合

Google Cloud コンソールから

Google Cloud コンソール画面からの SSH であれば、 VM のコンソールで SSH ボタンを押すだけです。とても簡単!

コンソールのSSHボタン

Google Cloud コンソールでは Cloud IAP が利用可能な条件が満たされていれば、自動的に Cloud IAP 経由でアクセスしてくれます。

gcloud コマンドから

gcloud コマンドでアクセスする場合も簡単です。インスタンスに External IP が付与されていなければ、普通の利用時のように gcloud compute ssh コマンドを実行するだけで自動的に IAP 経由でアクセスしてくれます。

gcloud compute ssh ${INSTANCE_NAME}

※ ${INSTANCE_NAME} はインスタンス名に置き換えてください。

対象インスタンスに External IP が付与されている場合でも、明示的にオプションをつけることで IAP 経由でアクセスしてくれます。

gcloud compute ssh --tunnel-through-iap ${INSTANCE_NAME}

参考: SSH 接続のトンネリング

SSH ターミナルソフトウェアから

Tera Term / PuTTY 等の使い慣れた SSH ターミナルソフトウェアから IAP を利用することができます。

まず、以下のコマンドを実行して、localhost と VM の間に IAP 経由でトンネルを作成します。

gcloud compute start-iap-tunnel ${INSTANCE_NAME} 22 \
    --local-host-port=localhost:10022 \
    --zone=${ZONE}

※ ${INSTANCE_NAME} はインスタンス名に置き換え
※ ${ZONE}はインスタンスが配置されているゾーン名に置き換え 例: asia-northeast1-b
※ 例では 10022 ポートだが任意のポートで問題ない

この後、localhost:10022 に対して Tera Term / PuTTY 等 から SSH アクセスすることで VM へログインすることができます。ただし、事前に VM へ公開鍵の登録が必要です。

RDP の場合

RDP の場合は、いったんクライアントソフトを使って利用者の PC から IAP までトンネルを張ります。前述の「SSH ターミナルソフトウェアから」と同じ要領です。

gcloud compute start-iap-tunnel ${INSTANCE_NAME} 3389 \
    --local-host-port=localhost:13389 \
    --zone=${ZONE}

※ ${INSTANCE_NAME} はインスタンス名に置き換え
※ ${ZONE}はインスタンスが配置されているゾーン名に置き換え 例: asia-northeast1-b
※ 例では 10022 ポートだが任意のポートで問題ない

このコマンドを実行することで、ローカル PC と IAP の間でトンネルが張られます。 この状態でローカルの 13389 ポートへアクセスすると、 IAP へ通信がルートされるというわけです。

RDP ツールを開いて localhost:13389 へアクセスすれば、インスタンスへ RDP できます。

なお、トンネルを張るには gcloud コマンドを使うほか、 IAP Desktop アプリを使うこともできます (ただし Windows PC のみ対応) 。

参考: RDP 接続のトンネリング

Chromebook で IAP Tunnel を作成する方法

お使いの端末が Chromebook の場合、IAP を利用してトンネルを張る方法について以下の記事もご参照ください。

blog.g-gen.co.jp

杉村 勇馬 (記事一覧)

執行役員 CTO / クラウドソリューション部 部長

元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。