Identity-Aware Proxy の TCP 転送とは?
Identity-Aware Proxy とは?
Identity-Aware Proxy(IAP) とは、HTTPS によってアクセスするアプリケーションに対し、IAM(Identity & Access Management) によるアクセス制御を提供できるサービスです。
ユーザがインターネット経由で Cloud Run や Compute Engine にホストされるアプリケーションに対しアクセスする際、IAP 経由でアクセスすることで、IAM での認証と認可を経たユーザのみが対象のアプリケーションにアクセスすることができます。
Identity-Aware Proxy 概要
詳細は以下をご参照ください。
IAP TCP 転送とは?
IAP には TCP 転送という機能があります。IAP TCP 転送は IAP の仕組みを利用し、Compute Engine VM インスタンスに対する SSH や RDP などの TCP 接続を IAP 経由で行うことができる機能です。これにより、IAM による認証と認可を経たユーザのみが対象の VM インスタンスに TCP 接続することを可能にします。
Identity-Aware Proxy TCP 転送 概要
また、ユーザからの TCP 接続は HTTPS でラップされます。IAP は IAM でユーザ認証し、対象の VM インスタンスに対するアクセス許可の権限を持つユーザのみアクセスを許可し、TCP 接続を転送します。
そのため、外部 IP アドレスを持たない VM インスタンスに対しても IAP 経由で IAM 認証/認可を経た TCP 接続を可能とします。
詳細は以下をご参照ください。
IAP TCP 転送を設定してみる
以下のドキュメントに従い IAP TCP転送を設定していきます。
検証は以下の手順で行います。
- VPC ファイアウォールルールの穴あけ
- Compute Engine VM インスタンスの起動
- SSH ログインユーザへの権限付与
- SSH ログイン
1~3 は、オーナー権限を持つユーザで実施し、4 は別のユーザでログインを試みてみます。
1. VPC ファイアウォールルールの穴あけ
まず、IAP から VM インスタンスに SSH アクセスができるよう、VPC ファイアウォールルールで穴あけを行います。
IAP が TCP 転送に利用する IP アドレス範囲は 35.235.240.0/20
です。この IP 範囲からの SSH(TCP:22) の上り(内向き)トラフィックを許可する VPC ファイアウォールルールを設定します。
Cloud Console より、[ネットワーク セキュリティ] -> [ファイアウォール ルールを作成] をクリックします。
以下を入力し、[作成] をクリックします。以下に指定のないものはデフォルトの設定で構いません。
- 名前: allow-ingress-from-iap
- ネットワーク: default ※本検証では default VPC を利用します
- 優先度: 100 ※優先度の高い他ルールによって拒否されないよう調整してください
- トラフィックの方向: 上り(内向き)
- 一致したときのアクション: 許可
- ターゲット: ネットワーク上のすべてのインスタンス
- ソースフィルタ: IPv4 範囲
- 送信元 IPv4 範囲: 35.235.240.0/20
- プロトコルとポート: 指定したプロトコルとポート
- TCP: 22
2. Compute Engine VM インスタンスの起動
IAP TCP 転送で SSH 接続する Compute Engine VM インスタンスを作成します。外部 IP アドレスを持たない VM インスタンスにも SSH 接続できることを確認するため、内部 IP アドレスのみを持つ VM インスタンスを作成します。
Cloud Shell を起動し、以下コマンドを実行します。
gcloud compute instances create internal-vm-iap-test \
--zone=asia-northeast1-a \
--machine-type=e2-micro \
--subnet=default \
--no-address \
--image=projects/debian-cloud/global/images/debian-12-bookworm-v20250113
内部 IP アドレスを持たない VM インスタンスが作成されます。Cloud Console より、[Compute Engine] -> [VM インスタンス] で作成した VM インスタンスが確認できます。
3. SSH ログインユーザへの権限付与
まずは、VM インスタンス自体に SSH ログインできるようにするため、Compute インスタンス管理者(v1)(roles/compute.instanceAdmin.v1
)と サービス アカウント ユーザー (roles/iam.serviceAccountUser
) が必要となるため権限を付与します。
Cloud Console より、[IAM と管理] -> [許可] -> [アクセスを許可] をクリックします。
[新しいプリンシパル] に SSH ログインするユーザのアカウントを入力、[ロール] で Compute インスタンス管理者(v1) と サービス アカウント ユーザー を選択し、[保存] をクリックします。
さらに、IAP 経由でのアクセスを許可するために、ユーザに対して IAP-secured Tunnel User (roles/iap.tunnelResourceAccessor
) という IAM ロールを付与します。この IAM ロールはプロジェクト単位でなく VM インスタンス単位でユーザに付与 することができます。
[セキュリティ] -> [Identity-Aware Proxy] を選択し、[SSH と TCP のリソース] タブをクリックします。
[すべてのトンネル リソース] 内の対象のゾーンにある、先ほど作成した VM インスタンス を選択します。
右側に表示されたペイン上の [+プリンシパルを追加] をクリックします。
[新しいプリンシパル] に SSH ログインするユーザのアカウントを入力、[ロール] で IAP-secured Tunnel User を選択し、[保存] をクリックします。
対象のユーザに IAP-secured Tunnel User が付与されたことが確認できます。
4. SSH ログイン
先ほど IAP-secured Tunnel User を付与したユーザで、IAP TCP 転送 による SSH ログインを試してみます。今回はブラウザからの SSH 接続で確認します。
対象ユーザで Cloud Console にアクセスし、[Compute Engine] -> [VM インスタンス] を選択します。対象 VM インスタンスの [SSH] のボタンが濃い黒字となっていることがわかります。[SSH] をクリックします。
ポップアップ上で [Authorize] をクリックすると、IAM による認証/認可が行われます。
SSH ログインが成功しました。
なお、以下のように tcpdump をとってみると、IAP の IP アドレス範囲である 35.235.240.0/20
内の IP アドレスと VM インスタンスの内部 IP アドレス間で TCP 22 による通信が行われていることがわかります。
$ sudo tcpdump -i any -n 'tcp port 22'
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
09:21:14.368746 ens4 Out IP 10.146.0.37.22 > 35.235.242.49.44673: Flags [P.], seq 25488318:25488418, ack 2891134583, win 501, options [nop,nop,TS val 3134370480 ecr 1764529222], length 100
09:21:14.369306 ens4 In IP 35.235.242.49.44673 > 10.146.0.37.22: Flags [.], ack 100, win 1037, options [nop,nop,TS val 1764529330 ecr 3134370480], length 0
09:21:14.369458 ens4 Out IP 10.146.0.37.22 > 35.235.242.49.44673: Flags [P.], seq 100:328, ack 1, win 501, options [nop,nop,TS val 3134370481 ecr 1764529330], length 228
09:21:14.370041 ens4 In IP 35.235.242.49.44673 > 10.146.0.37.22: Flags [.], ack 328, win 1037, options [nop,nop,TS val 1764529331 ecr 3134370481], length 0
09:21:14.458463 ens4 Out IP 10.146.0.37.22 > 35.235.242.49.44673: Flags [P.], seq 328:572, ack 1, win 501, options [nop,nop,TS val 3134370570 ecr 1764529331], length 244
09:21:14.458548 ens4 Out IP 10.146.0.37.22 > 35.235.242.49.44673: Flags [P.], seq 572:1120, ack 1, win 501, options [nop,nop,TS val 3134370570 ecr 1764529331], length 548
また、VM インスタンスに対して IAP-secured Tunnel User の IAM ロールを付与していない場合、以下のように [SSH] がグレーアウトされ、アクセスができないことが示されます。
さいごに
VM インスタンスへ SSH 接続するユーザに対し、IAP によって IAM と連携したユーザ認証が提供できること、IAP 経由での TCP 転送により外部 IP アドレスを持たない VM インスタンスへのアクセスを提供できることが確認できました。
ブラウザからの SSH 接続は普段何気なく利用している方も多いと思いますが、IAP TCP 転送という仕組みによって実現できていることがわかったかと思います。
なお、Compute Engine は作成したばかりの VM インスタンス(Linux) に対して、 SSH 公開鍵認証を提供します。ユーザが公開鍵認証の設定を意識することなく SSH 接続できるのです。仕組みについては以下ブログで詳細を解説していますので、よろしければご覧になってください。