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

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

G-genの杉村です。Google Cloud(旧称 GCP)の Cloud Identity-Aware Proxy(以下、Cloud IAP)についてご紹介します。

IAP とは

IAPの概念

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

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

また、IAP は Cloud Run サービス等でデプロイされた、Web アプリケーションに、簡単に認証機構を実装するためにも利用できます。

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

Google Cloud の IAP には様々な機能がありますが、当記事でご紹介するのは Compute Engine のインスタンス(VM)へ、SSH/RDP ログインのための機能です。

料金

IAP の料金は、原則無料です。

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

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

セキュリティ上、Compute Engine VM には、できるだけ外部 IP アドレス(External IP address)を付与せずにおきたいものです。外部 IP アドレスがないインスタンスにログインするためには、踏み台サーバを用意する必要があると思われるかもしれません。

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

VMログインのためのIAP

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

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

これで、利用者は IAP 経由で外部 IP アドレスを持たない VM にログインすることができます。また、外部 IP アドレスを持っている VM へのログインにも、IAP を利用できます。

設定方法

設定方法は簡単です。以下の2つを実施すれば、IAP が利用できます。

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

対象インスタンスの存在する VPC ネットワークのファイアウォールの上り(Ingress)ルールで、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

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

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

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

blog.g-gen.co.jp

アクセス方法

SSH の場合

Google Cloud コンソールから

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

コンソールのSSHボタン

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

gcloud コマンドから

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

gcloud compute ssh ${INSTANCE_NAME}

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

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

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

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 できます。

Chromebook で IAP Tunnel を作成する方法

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

blog.g-gen.co.jp

杉村 勇馬 (記事一覧)

執行役員 CTO

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