Idnetity-Aware Proxyを活用しVPNフリーなメンテナンスをしよう！

# Idnetity-Aware Proxyを活用しVPNフリーなメンテナンスをしよう！

こんにちは、京セラコミュニケーションシステム櫻木 (@kccs_nobuaki-sakuragi)です。

今回は、製造業関連の伴走型Dx支援やLift&Sheft案件（クラウド移行案件）をしている際によく質問される「Google Cloudでもオンプレのデータベースで利用していたツールを利用して接続できないの？」に答える為、この記事を記載しました。

一般的にクラウド環境をメンテナンスする場合、メンテナンス用VPNや踏み台サーバを経由し、OSメンテナンスやDBを参照している方が多いと思います。Google Cloudでは、Cloud Identity-Aware Proxyという機能がありセキュアにメンテナンスをする事ができます。
なお、標準設定では、プロジェクトオーナー権限ユーザが利用可能です。

今回はプロジェクトオーナー権限以外のユーザ（user@hogehoge.jp）に付与する方法をまとめました。


# 本記事の対象者
  
  Google Cloud上のCompute Engine(以下、GCEと略します。)へのリモートデスクトップ（以降、RDPと略します。）接続/SSH接続/MySQLなどへアクセスしたい方向け、https通信経由でRDP/SSH/MySQLへ通信する方法を説明します。

:::note info
  今回はCLIで設定する方法をメインで説明します。
  GUIでも設定可能ですがが、今回は対象外とします。
  MySQLとしておりますが、TCP転送で通信可能なアプリケーションは同じ手法で通信可能です。
  別アプリケーションを利用する場合は利用アプリケーションのポート番号を指定し試してください。
:::


# Identity-Aware Proxyってなに？

詳しいセキュリテイや技術などは、ドキュメントをご確認ください。

https://cloud.google.com/iap/docs/concepts-overview?hl=ja


### Identity-Aware Proxyとは
機能を簡単に説明するとID認証管理機能が入っているフルマネージドリバースProxyサーバです。類似しているゲートウェイシステムとしてはSSL-VPNの様なゲートウェイシステムが該当します。

このゲートウェイシステムがGoogleCloud内にあり、メンテナンス用の踏み台サーバやVPN環境を必要とせず、セキュアにVPC内へ通信する事が可能になります。

※SSL-VPNクライアントアプリケーションとしCloudSDK（gcloud CLI）を利用するイメージです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773468/12328356-d544-1647-a382-eff692d84d6b.png)


このCloud Identity-Aware Proxy(Cloud IAP)を利用すると、Identity Access Manageement(IAM)で許可されたユーザはIAP経由でアプリケーションもしくは、リソースへセキュアにアクセスができるようになります。

メンテナンス用のゲートウェイサーバやグローバルIPがなくても、GCEへ接続できるようになる為、非常にメンテナンス性が向上します。


接続ができるリソースは、App Engine、Cloud Run、Compute Engine、GKE、オンプレミスになります。
オンプレミスには別途IAPConnectorというコンポーネントをGoogleCloud内に配置し、Interconnect利用すると利用できます。
Cloud IAPはBeyondCorp Enterpriseの機能の一部ですが、今回利用する機能は、Google Cloudのリソース利用料以外は不要です。

認証IDは既存のGoogle WorkspaceやCloud IdentityのIDを活用できる為、短時間で利用可能になるのが最大のメリットです。メンテナンス用のID管理を別途しなくていいのは開発環境を管理している方にとっては非常にうれしいのではないでしょうか？

また、Identity-Aware ProxyはHTTPS通信をしている為、幅広い利用シーンで活用しやすいと考えています。


##### 注意事項

セキュリティの対象範囲について

:::note warn

リソースまでの接続許可と通信はCloud IAPが保護してくれますが、リソース内のセキュリテイ、プロジェクト内の別の VM など、プロジェクト内のアクティビティを防御しません。その為、各リース内、各種リソース間通信のセキュリティ設計が必要となりますので注意してください。

詳細はドキュメントの「お客様の責任項目」を確認し各プロジェクト・リソース内のセキュリティ設計を実施してください。
https://cloud.google.com/iap/docs/concepts-overview?hl=ja#your_responsibilities

:::




## 事前準備
  今回は、Cloud SDKを利用します。インストールされていない場合は、事前にインストールしてください。
  -  Cloud SDK（gcloud CLI）のインストール
      
      [gcloudコマンドのインストール](https://cloud.google.com/sdk/docs/install?hl=ja)
  - すでにVPCがあり、次の2つのGCEが、use-central1-aにある事※1
    ※1：自身の環境に置き換え実施してください。

### gcloudコマンド用の環境変数
試したい環境で再現性をあげる為、gcloud CLIコマンドを入力する際のオプションを引数にします。


| 設定 | 環境変数名 | 設定例 |
| ---- | ---- |---- |
| リージョン | REGION| speedy-code-xxxxxx |
| プロジェクトID | PROJECT_ID | us-central|
| ゾーン設定 | ZONE | us-central1-a |
| インスタンスLINUX | COMPUTE_LINUX | linux|
| インスタンスWINDOWS | COMPUTE_WIN | windows |
| 登録ユーザID|EMAIL|user@hogehoge.jp|



gcloud CLIがインストールされた環境で自分の環境にあった環境変数をセットしてください。
本環境では、インスタンスLINUXにはMySQLがインストール済みである事を前提とします。

:::note warn
各環境変数は、必ず自身の利用環境に合わせて変更してください。
:::

  ### 環境変数設定例
  ```
  PROJECT_ID=speedy-code-xxxxx
  REGION=us-central
  ZONE=us-central1-a
  COMPUTE_LINUX=linux
  COMPUTE_WIN=windows
  EMAIL=user@hogehoge.jp
  ```
  上記の環境を、gcloud CLI利用可能なターミナルへ入力してください。
  ただしく環境変数が入った事を確認する為、echoコマンドを利用して環境変数が設定されている事を確認します。

  ```
  echo $REGION
  echo $PROJECT_ID
  echo $ZONE
  echo $COMPUTE_LINUX
  echo $COMPUTE_WIN
  ```


### gcloudコマンド環境設定
gcloud CLIコマンドを実施する為、明示的にプロジェクトID、ゾーン設定などを設定しておきます。

:::note info
下記のコマンドを実行すると既にプロジェクトやゾーンを設定していた場合は変更されます。
今までの設定を確認して、利用していたプロジェクトやリージョン、ゾーンは次のコマンドで確認し記録しておいてください。
#確認コマンド：gcloud config list
:::

- gcloud CLIにProjectを設定
```
gcloud config set project $PROJECT_ID
```
- gcloud CLIにzoneプロパティを設定
```
gcloud config set compute/zone $ZONE
```

gcloudコマンド環境が指定のゾーン、アカウント、プロジェクトになっている事を確認してください。


    User:~ $ gcloud config list
    [compute]
    zone = us-central1-a
    [core]
    account = user@hogehoge.jp
    disable_usage_reporting = False
    project = speedy-code-xxxxxx

    Your active configuration is: [default]
    User:~ $



## Cloud IAP利用設定

Cloud IAPはGCEへグローバルIPを付与しなくても、接続可能です。
図の様にIAM認証し、アクセス許可したGCEリソースへアクセスが可能になります。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773468/12328356-d544-1647-a382-eff692d84d6b.png)

ユーザは、インターネットからHTTPSを利用しCloud IAPへ接続後、GCEへ接続します。
なお、グローバルIPアドレスを付与しない場合は、gcloudコマンドでSSHやRDP接続ができなくなります。
また、ConsoleのSSHボタンもCloudIAP経由で接続されます。その為、GCEへグローバルIPアドレスを付与しない場合は、VPC内のFirewallルールに「項番2」の設定を許可する必要があります、Firewallルールを設定するとプライベートIPアドレスのみでも接続する事ができます。

実際のプロジェクトへIAPを利用する為の設定方法を記載します。


#### 1.APIの有効化設定
Cloud IAPを利用する為には「IAP」と「oslogin」APIを有効にする必要があります。

次のコマンドでIAPとoslogin APIを有効にします。
```
gcloud services enable iap.googleapis.com oslogin.googleapis.com
```
  出力結果例

    Operation "operations/acat.p2-526296883653-a6d15a2f-e9df-4ff7-XXXXXXXXXXXXXXX" finished successfully.

  successullyと表示された事を確認できたら、APIの設定状況を確認します。

  IAPとosloginのAPIが有効化された事を確認します。
```
gcloud services list --enabled |grep -e oslogin -e iap
```

  出力結果例
    
    NAME: iap.googleapis.com
    NAME: oslogin.googleapis.com
    

#### 2．Firewallの設定
APIの有効化ができましたら、VPC全体にCloud IAPからの接続を許可します。

これから実施する方法は次のドキュメントを参考にしています。
[TCP 転送での IAP の使用  |  Identity-Aware Proxy  |  Google Cloud](https://cloud.google.com/iap/docs/using-tcp-forwarding?hl=ja#preparing_your_project_for_tcp_forwarding)

不明な点があればドキュメントを参考にしてください。

```
gcloud compute firewall-rules create allow-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:3306,tcp:22,tcp:3339 \
  --source-ranges=35.235.240.0/20 --description="IAP用の許可設定"--project=$PROJECT_ID
```
上記のコマンドでは、次の3つのポートをCloud IAPで通信可能なポートとして追加しています。

※MySQLのポート番号　3306

※RDP のポート 3389

※SSH のポート 22 

※Source-rangesで指定しているIPアドレス「[35.235.240.0/20](https://cloud.google.com/iap/docs/using-tcp-forwarding#create-firewall-rule)」は、Cloud IAPで利用されるIPアドレスレンジになります。

#### 3．IAPを利用するユーザに権限を付与する
  標準設定では、プロジェクトオーナー権限以外のユーザはCloud IAPを利用して接続ができません。
  プロジェクトオーナー以外のユーザにもOSへの接続権限を付与するには2つの権限を該当ユーザに付与しましょう。
  
  次のコマンドを実行すると、環境変数で設定したEMAILのユーザに付与されます。


```
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member=user:'$EMAIL' \
    --role=roles/compute.instanceAdmin.v1

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member=user:'$EMAIL' \
    --role=roles/iap.tunnelResourceAccessor
```
今回の例ではOS管理者を想定し、EMAILユーザにCompute インスタンスの管理者権限を付与しています。

SSHでアクセスだけさせ、Logを参照するユーザなどの場合は、[OSlogin設定](https://cloud.google.com/compute/docs/oslogin/set-up-oslogin?hl=ja#before-you-begin)をする事によりCompute インスタンス管理者権限は不要です。利用環境のセキュリティ基準に応じ権限は付与してください。

#### 権限付与するロールの説明
- roles/compute.instanceAdmin.v1
  
  Compute インスタンス管理者（v1）（roles/compute.instanceAdmin.v1）

  [Compute Engine IAM のロールと権限  |  Compute Engine ドキュメント  |  Google Cloud](https://cloud.google.com/compute/docs/access/iam#compute.instanceAdmin.v1)


- iap.tunnelResourceAccessor
  IAP で保護されたトンネル ユーザー（roles/iap.tunnelResourceAccessor）

  ID  認識プロキシを使用するトンネル リソースのアクセス権

  [ロールについて  |  IAM のドキュメント  |  Google Cloud](https://cloud.google.com/iam/docs/understanding-roles?hl=ja&_ga=2.217325008.-791950709.1662447463#cloud-iap-roles)


#### Cloud Identity-Awareのロールの確認方法
iap.tunnelResourceAccessorが付与されると、三メニューの「セキュリティ」ー「Identity-Aware Proxy」の画面に設定したユーザが追加されます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773468/25c4d747-b677-e47e-58c6-0911199c6606.png)


SSHとTCPのリソース項目を選択し、該当リソースを選択後、ロール／プリンシパルのIAP-securedTunnelUserに該当ユーザが追加されている事を確認してください



これで設定は完了です。

次から実際にGCEへ接続してみます。


## GCEへ接続してみよう


### ConsoleのSSHボタンでSSH接続

該当ユーザでGoogle Cloud Consoleへアクセス後
三「Compute Engine」 ー 「VMインスタンス」からインスタンス項目の接続「SSH」ボタンからSSH接続してみましょう。

SSHに外部IPがない場合でも、ブラウザからのSSH接続が可能です。

Last login:　項目で以前アクセスしたIPアドレスが確認できます、Firewallルールに追加したIAP接続用のIPセグメント内のIPになっている事がわかります。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773468/5a08cff6-2ac4-1ed9-4443-5f3d044acad8.png)




### gcloud CLIを利用したSSH接続

次のコマンドを実行するとIAP経由で環境変数に登録したLinuxサーバへSSH接続が可能です。

```
gcloud compute ssh $COMPUTE_LINUX --tunnel-through-iap
```

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773468/16937b53-6479-1b81-a50c-f4e8c106ad6b.png)


:::note info
インスタンスに外部 IP アドレスがない場合、接続では IAP TCP トンネリングが自動的に使用されます。
インスタンスに外部 IP アドレスがある場合、接続に IAP TCP トンネリングではなく、外部 IP アドレスが使用されます。
IPA経由で確実に接続したい場合は、--tunnel-through-iap オプションを付けましょう。

:::
### Windowsサーバへgcloud CLIを利用してRDP接続してみる。

次のコマンドを実行するとIAP経由で環境変数に登録したWindowsサーバへのSSHトンネルが接続されます。

```
gcloud compute start-iap-tunnel $COMPUTE_WIN 3389 --local-host-port=localhost:3389 --zone=$ZONE --project=$PROJECT_ID
```

:::note info
上記コマンドは。転送ポートはローカルホスト側もRDP標準の3389を利用しています。
すでにローカルホスト側でRDPサーバを起動している場合は、「--local-host-port=localhost:XXXXX」のxxxx部分を別のポート番号へ変更してください。
:::

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773468/f0929794-38a5-5762-da0f-c755d86036da.png)

Listeing on port [3389]となった状態になれば、転送ポートの設定ができています。


GCEのWindowsへアクセスするには、RDPクライアントの接続先IPアドレスもしくは、サーバ名をローカルホストへ変更する必要があります。
転送用ポートを変更した場合は、[3389]を設定したPort番号へ変更してください。


設定IP：127.0.0.1:3389

もしくは、

設定サーバ名：localhost:3389


### gcloud CLIを利用してMySQLへ接続してみる。

次のコマンドを実行するとIAP経由で環境変数に登録したLINUXサーバへMySQLポート転送ができます。

```
gcloud compute start-iap-tunnel $COMPUTE_LINUX 3306 --local-host-port=localhost:3306 --zone=$ZONE --project=$PROJECT_ID
```

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773468/5dc70073-fed3-6b9c-69ac-083594fe9303.png)


Listeing on port [3306]となった状態になれば、転送ポートの設定ができています。


mysqlコマンドを利用し、次のようにアクセスしてみてください。

```
mysql -u [mysqlユーザID] -p　-h 127.0.0.1
```
接続例ではMySQLのユーザは[test]ユーザになります。接続hostは、Cloud IAPの接続元IPアドレスを指定しています。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773468/6c6289a1-b64c-9452-4968-1031c434c0b3.png)

:::note info

転送ポートはローカルホスト側もMySQLで利用している3306を利用しています。
接続予定のMySQLユーザは、IAPネットワーク（35.235.240.0/255.255.240.0）から許可設定をしてください。

:::



#### 最後に

設定方法が分かれば、SSHやRDP以外も簡単にCloud IAP環境を利用できます。
今回はGCEへの接続にVPNフリーで接続可能なCloud IAPを利用しました。Cloud IAPはApp EngineやCloudRunへの接続も可能です。
ちょっとアクセス制御したいときなどにも簡単に利用できますので、興味のある方は自身の環境でぜひCloud IAPを活用してみてください！


#### 参考　
MySQLの接続可能なテスト用のユーザ作成方法

MySQLへrootでログイン後次のユーザを作成してください。
1）IAPのネットワークから接続許可されたユーザを作成
2）必要な権限をユーザへ付与する。
```
mysql> create user 'test'@'35.235.240.0/255.255.240.0' identified by 'password';
mysql> FLUSH PRIVILEGES;
mysql> grant all on *.* to 'test'@'35.235.240.0/255.255.240.0';
mysql> FLUSH PRIVILEGES;
```
※上記権限は非常に高い為、本番環境で利用する場合は権限を適切に変更してください。

参考にさせていただいたURL：
https://qiita.com/hypermkt/items/fd4c34a1916ef9006ef6


::: note info 
本記事は2022年9月に作成しております。よって、引用している文章やオペレーション方法などはこの時点での最新となります。ご了承ください。
:::