🐙

IAP を使って外部 IP を持たない Compute Engine(WindowsVM)にリモートデスクトップ接続する方法

2022/10/18に公開

クラウドエースの小坂です。
データウェアハウス構築、最近は特に Looker を活用した分析環境構築プロジェクトのプロジェクトマネージャーをよくやっています。

今回は Identity-Aware Proxy(IAP)を使って外部 IP を持たない Compute Engine(WindowsVM)にリモートデスクトップ(RDP)接続する方法 を説明しようと思います。

Identity-Aware Proxy(IAP)とは?

Google Cloud が提供する ID を用いて、アプリケーションや VM へのアクセスを制御(認証・認可)を行うサービスとなります。
例えば Google App Engine(GAE)上にデプロイしたアプリケーションに簡単な設定で認証を追加する事が可能です。

https://cloud.google.com/iap

また TCP 転送 という機能を利用すると、Google Cloud 上でホストされる VM への SSH/RDP アクセスを保護することも可能です。
(その際に VM は外部 IP をもつ必要もありません)

https://cloud.google.com/iap/docs/tcp-forwarding-overview

今回はそんな IAP の TCP 転送 機能を用いて RDP アクセスを保護してセキュリティ向上を図ってみようと思います。

前提条件

今回のゴール

今回は、Compute Engine(GCE)を使って作成した外部 IP アドレスを持たない Windows Server の VM に対し、IAP を使って Google アカウント/IAM による認証・認可をかけつつ RDP 接続する、ことをゴールとします。

以下のような要件がある場合にこのやり方が有効かと思います。

  1. RDP 先の VM 及び VM の 3389ポート(RDP に利用するポート)をインターネットに公開したくない(セキュリティリスクを抑えたい)
  2. 1 の要件は満たしたいが、 リモート デスクトップ ゲートウェイを自前で用意したくない(運用コスト・構築コストを抑えたい)

私のスキルレベル

  • ネットワーク:よくわからない
  • IAP:初めて使う
  • Windows Server:初めて使う
  • GCP:そこそこ使っている(4年ぐらい)
    • 主に利用しているプロダクトは BigQuery ぐらいで、GCE 等はほとんど普段は触りません

こんなレベルでスタートしましたが、なんとか設定完了することができました。

本稿で解説しないこと

以下については本稿では解説しませんので、適宜 Google Cloud の公式ドキュメント等をご参照ください。

  1. IAP の技術の詳細(解説できないため)

https://cloud.google.com/iap

  1. VM 作成方法の詳細(解説できないため)

https://cloud.google.com/compute?hl=ja

  1. Cloud SDK のインストール方法(インストール済みであることを前提に説明します)

https://cloud.google.com/sdk/

手順

概要

今回、手順の説明上、VM の作成・IAP の設定等を行う管理者とその設定された環境で RDP を行う利用者を登場させます。
ざっくりと言うと管理者・利用者がそれぞれ行う手順は以下の通りです。

  1. (管理者) VM を作成する
  2. (管理者) IAP から VM に通信するための ファイアウォールルール の設定を行う
  3. (管理者) RDP するユーザーに対して IAM 及び IAP で必要な権限の付与を行う
  4. (利用者) gcloud コマンドを利用して、RDP トラフィックを IAP 経由でトンネリングする
  5. (利用者) RDP クライアントを用いて RDP 接続を行う

詳細

1. (管理者) VM を作成する

まずはじめに RDP 先の VM インスタンスの作成を行います。
この手順は管理者に相当するアカウント(プロジェクトに対してオーナーの役割をもっているアカウント)で行ってください。

① GCE の API の有効化

既に API の有効化が完了している場合にはこの手順はスキップしてください。

まずはじめに Cloud Console にアクセスし、以下の画像の数字順にクリックをします。

1

API が有効化されていない場合、以下の画面が表示されるため、ENABLE をクリックして API を有効化します。
(API の有効化が既にされている場合にはこの画面は表示されません)

2

API 有効化が完了すると VM instances の画面に遷移します。

3

これで API の有効化は完了です。

② VM を作成

続いて RDP 接続を行う先となる Windows Server の VM を作成します。

API 有効化後に遷移した画面で CREATE INSTANCE をクリックします。

4

遷移した先の画面で以下の設定で VM の作成を行います。

項目 値(例) 備考
Name iap-rdp-test
Region us-central1(Iowa) asia-northeast1 等でも OK
Zone us-central1-a asia-northeast1-a 等でも OK
Machine family GENERAL-PURPOSE
Series N1 好きなシリーズを使って OK
Machine type f1-micro 好きなタイプを使って OK
Boot disk - Operating System Windows Server
Boot disk - Version Windows Server 2022 Datacenter
Network interfaces - default - External IPv4 adress None 外部 IP アドレスを付与しないための設定

その他は標準の設定で問題ありません。
上記はあくまで一例ですので、Machine Type などは好きなものを設定いただいても構いません。

設定が完了したらページ最下部の CREATE をクリックすると VM の作成が開始されます。

Status が ✔ に変わったら作成完了です。

5

③ Windows ユーザー及びパスワードの発行

作成が完了したら利用者が RDP 時に利用するユーザー及びパスワードの発行を行います。

インスタンスの詳細ページに移動し SET WINDOWS PASSWORD をクリックします。

18

ユーザー名を入力し、SET をクリックするとユーザーが作成され、パスワードが表示されるためそれらを利用者に共有するためにメモしておきます。

19

こちらでアカウントの払い出しも完了です。

2. (管理者) IAP から VM に通信するための ファイアウォールルール の設定を行う

続いて IAP から VM に通信をするための ファイアウォールルール の設定を行います。

① デフォルトのファイアウォールルールの削除

まずはじめにデフォルトで作成されているファイアウォールルールの削除を行います。
プロジェクトを作成すると自動的に作成されるものになるのですが、かなりゆるいルールになっているため、念の為削除しておきます。

まずはじめに Cloud Console のサイドメニューから VPC network > Firewall を選択します。

6

遷移先の画面を下方にスクロールすると以下の通り、設定されている ファイアウォールルール が表示されるため、以下の手順でそれらを削除します。

7

これでデフォルトのファイアウォールルールの削除は完了です。

② IAP -> VM へのアクセスを許可する ファイアウォールルール を作成

続いて IAP -> VM へアクセスするための ファイアウォールルール の作成を行います。

CREATE FIREWALL RULE をクリックします。

8

するとファイアウォールルールの作成画面が開くため、以下の通り設定を行います。

項目 値(例) 備考
Name allow-ingress-from-iap-to-vm
Direction of traffic Ingress 上り(内向き)の通信を許可する
Action on match Allow 条件に一致したときに許可する
Targets All instances in the network ネットワーク上の全てのインスタンスをこのルールの対象とする
*特定のインスタンス・タグにしたい場合は適切に設定してください
Source IPv4 ranges 35.235.240.0/20 IAP のアクセス元の IP アドレス
Protocols and ports Specified protocols and ports 特定のプロトコル・ポートを指定する
Protocols and ports - TCP 3389 RDP のみを許可する

設定が完了したら CREATE ボタンをクリックしてファイアウォールルールの作成を行います。
画面が遷移したら作成完了です。

これで IAP から作成した VM に対して通信ができるようになりました。

3. (管理者) RDP するユーザーに対して IAM 及び IAP で必要な権限の付与を行う

続いて RDP するユーザーに対して IAM 及び IAP の設定を行います。

① RDP するユーザーに対して roles/compute.instanceAdmin.v1 のロールを付与

IAM の設定ページを開きます。

9

GRANT ACCESS をクリックします。

10

RDP するユーザー(利用者)の Google アカウントに対して権限の設定を行います。

11

SAVE をクリックしたら IAM での権限設定は完了です。

※上記手順はプロジェクトレベルで roles/compute.instanceAdmin.v1 というロールを付与するため、かなり強い権限をユーザーに付与する形になります。プロジェクトレベルでユーザーに強い権限を付与したくない場合には、以下の手順で VM に限定してロールを付与することも可能です。

Compute EngineVM instances のページを開きます。

開いたら以下の手順でロールの設定画面を開きます。

12

プロジェクトレベルでロールの設定を行った手順と同様に権限の設定を行い、SAVE ボタンをクリックします。

これで特定インスタンスに限定してユーザーに権限の付与を行うことができました。

② IAP TCP 転送の使用権限の付与

続いてユーザーに IAP TCP 転送を使用して IAP 経由で VM に RDP するための権限を付与します。

Cloud Console のサイドメニューから IAM & Admin -> Idntity-Aware Proxy を選択します。

13

ENABLE API をクリックして API の有効化を行います。

14

有効化が完了すると GO TO IDENTITY-AWARE-PROXY というボタンが表示されるのでクリックします。

遷移した先のページで SSH AND TCP RESOURCES をクリックします。

15

画面表示が切り替わったら以下の通り操作をします。
※ Warning が表示されていますが、IAP -> VM へのアクセスが許可されていない通信がある、という旨の Warning であり、今回やろうとしていることには充分な設定がされているため、無視して構いません。

16

以下の通り権限の設定を行います。

17

これで IAP 側の権限設定も完了です。

4. (利用者) gcloud コマンドを利用して、RDP トラフィックを IAP 経由でトンネリングする

ここまでで管理者側の設定は完了で、あとは利用者側で RDP をするのみとなります。

IAP 経由での通信を行うため、まずは IAP 経由で RDP するために RDP 接続のトンネリングを行います。

以下のコマンドを実行して今回アクセスする VM を作成したプロジェクトを設定します。

$ gcloud config set project {プロジェクト名}

続いて以下のコマンドを実行して RDP 接続のトンネリングを行います。

$ gcloud compute start-iap-tunnel {インスタンス名} 3389 \
    --local-host-port=localhost:3389 \
    --zone={ゾーン名}

コマンドを実行すると以下の通り表示がされます。

Testing if tunnel connection works.
Listening on port [3389].

このあとの手順を行う際にもこのコマンドは実行したままの状態にしておいてください。
(コマンドを停止すると RDP 接続のトンネリング も停止されてしまいます)

5. (利用者) RDP クライアントを用いて RDP 接続を行う

RDP 接続のトンネリングができたため、RDP クライアントを用いて RDP 接続を行います。

私の端末は macOS のため、以下の RDP クライアントを使用しています。

https://apps.apple.com/us/app/microsoft-remote-desktop/id1295203466

VM に接続する際の PC 名(ホスト名)localhost を指定する必要がある点にだけご注意ください。

ユーザー及びパスワードは管理者が 手順1-3 で作成したものを共有してもらい、利用します。

こちらで RDP 接続は完了です。

Windows ユーザーの場合には IAP 経由で RDP をする際に非常に便利なツールが提供されているので、こちらを使用することもご検討ください。

https://github.com/GoogleCloudPlatform/iap-desktop

まとめ

こちらの手順で、外部 IP アドレスを持たない Windows Server の VM に対して、IAP を使って Google アカウント/IAM による認証・認可をかけつつ RDP 接続することができました。

私自身、ネットワークや VM に関する知識は全然持ち合わせておりませんが、IAP を使用することによって比較的簡単にセキュリティリスクを抑えた RDP 接続環境を構築することができます。

RDP 接続を行う VM のセキュリティリスクを抑えたい、でも運用・構築コストは抑えたい、という場合にぜひお試しください。

Discussion