G-genの杉村です。
Google Cloud (GCP) の Cloud Identity-Aware Proxy (以下、IAP) って、聞いたことがあるでしょうか。
一般的な用語で IAP といえば、 VPN レスを実現する大層な仕組み、というイメージかもしれません。
Google Cloud の IAP には色々な機能がありますが、今日取り上げるのは Google Compute Engine (以下、GCE) のインスタンス (VM) の SSH/RDP ログインのために使える便利な機能です。
この仕組み、意外と簡単に使えるんです。
手順と合わせて見ていきましょう。

Cloud IAP とは

Cloud IAP は簡単に言うと Google Cloud (旧称 GCP) が提供する フルマネージドのリバースプロキシ です。
フルマネージドですので、利用者は IAP を構築したり運用・保守する必要はありません。
上図のように IAP を経由して VPC にある各種リソースへアクセスしたり、 IAP Connector というコンポーネントをデプロイすればオンプレミスのリソースへのアクセスも中継することができます。
なお Cloud IAP は BeyondCorp Enterprise の一つの要素にもなっています。
当記事では BeyondCorp Enterprise には触れませんが、ご興味のある方は以下の記事をご参照ください。
VM にアクセスするための踏み台として使ってみる
External IP が不要なインスタンスにはセキュリティ上、 External IP を付与せずにおきたいものです。
しかしそうなると、 External IP を付与した踏み台サーバを用意する必要があると思われるかもしれません。
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 Role を付与します。
以下の両方の IAM ロールを、プロジェクトのレベルもしくは対象の VM 単位でアタッチします。
IAP で保護された トンネル ユーザー (roles/iap.tunnelResourceAccessor)
Compute 閲覧者 (roles/compute.viewer)
やCompute OS ログイン (roles/compute.osLogin)
等の compute.instances.get 権限を持つロール
また以下のドキュメントを参照して、利用できるポート番号を制限したり、 Access Context Manager で定義したアクセスレベルを満たしていることを条件として追加することもできます。
先程書いた プロジェクトのレベルもしくは VM 単位でアタッチします
の意味がピンと来ない場合は、当社ブログ これで分かった!Google CloudのIAMの仕組みやAWSとの違い をぜひご参照ください。
アクセス方法
SSH の場合
Google Cloud コンソール画面からの SSH であれば、 VM のコンソールで SSH ボタンを押すだけです。
とっても簡単!

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 接続のトンネリング
RDP の場合
RDP の場合は、いったんクライアントソフトを使って利用者の PC から IAP までトンネルを張る必要があります。
ここでも gcloud コマンドの登場です。
gcloud compute start-iap-tunnel ${INSTANCE_NAME} 3389 \ --local-host-port=localhost:13389 \ --zone=${ZONE}
※ ${INSTANCE_NAME} はインスタンス名に置き換えてください。
※ ${ZONE}はインスタンスが配置されているゾーン名に置き換えてください。例: asia-northeast1-b
※ ここではローカルポートとして 13389 を指定しましたが使用されていない任意のポートで問題ありません。
このコマンドを実行することで、ローカル PC と IAP の間でトンネルが張られます。
この状態でローカルの 13389 ポートへアクセスすると、 IAP へ通信がルートされるというわけです。
RDP ツールを開いて localhost:13389 へアクセスすれば、インスタンスへ RDP できます。
なお、トンネルを張るには gcloud コマンドを使うほか、 IAP Desktop アプリを使うこともできます (ただし Windows PC のみ対応) 。
参考: RDP 接続のトンネリング
料金
無料です 。
ただし、デバイスレベルの制御をかけるなど、詳細なアクセス制御をかける場合は BeyondCorp Enterprise の機能となり、有償となります。
詳細は以下をご参照ください。
杉村 勇馬 (記事一覧) (Facebook)
クラウドソリューション部 部長
元・警察官という経歴を持つ現・エンジニア。クラウド管理運用やネットワークに知見。AWS 12冠、Google Cloud認定資格10冠。
2022年5月現在、ハマっているものはモンスターエナジーウルトラ。
Follow @y_sugi_it