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

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

G-genの杉村です。

Google Cloud の Identity-Aware Proxy (以下、IAP) って、聞いたことがあるでしょうか。

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

この仕組み、意外と簡単に使えるんです。
手順と合わせて見ていきましょう。

f:id:ggen-sugimura:20211005163429p:plain
Identity-Aware Proxy (IAP)

IAP って何ができるの?

f:id:ggen-sugimura:20211005160319p:plain
IAPの概念

IAP は簡単に言うと フルマネージドのリバースプロキシ です。
フルマネージドですので、利用者は IAP を構築したり運用・保守する必要はありません。
少し設定をして、あとは利用すればいいだけです。

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

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

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

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

f:id:ggen-sugimura:20211005162652p:plain
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 Role を付与します。
IAP で保護された トンネル ユーザー (roles/iap.tunnelResourceAccessor) を、プロジェクトのレベルもしくは VM 単位でアタッチします。

また以下のドキュメントを参照して、利用できるポート番号を制限したり、 Access Context Manager で定義したアクセスレベルを満たしていることを条件として追加することもできます。

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

先程書いた プロジェクトのレベルもしくは VM 単位でアタッチします の意味がピンと来ない場合は、当社ブログ これで分かった!Google CloudのIAMの仕組みやAWSとの違い をぜひご参照ください。

blog.g-gen.co.jp

アクセス方法

SSH の場合

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

f:id:ggen-sugimura:20211005170204p:plain
コンソールの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 接続のトンネリング

杉村 勇馬 (記事一覧)

クラウドソリューション部 部長

クラウド管理運用やネットワークに知見あり。AWSの全資格をコンプリートしたので、次はGoogle Cloudの認定資格を狙っている。

2021年10月現在、ハマっているものはマーベル (遅い)