【初心者】GCP Identity-Aware Proxy (IAP), Access Context Managerを使ってみる (WEBサーバへのアクセス制限)

# 目的
- Google の提唱する BeyondCorp って何かな？と思っていたが、BeyondCorpはいろんな技術の組み合わせであり、Identity-Aware Proxy (IAP)やAccess Context Managerがその中の主要な構成要素とのこと。それらがどんなものか簡単に確認する。

# GCP Identity-Aware Proxy (IAP) とは（自分の理解）
- 既存のWEBサービスに対して認証機能を挟むことができる仕組み。
- GCPのサービス(GCE, GAE, GKE)で作られているWEBサービスであれば、その前にIAPをそのまま追加できる。オンプレや他のクラウドで提供されているWEBサービスの場合、IAPコネクターというコンポーネントを追加することにより対応可能になる。

# GCP Access Context Manager とは（自分の理解）
- GCPリソースへのアクセスをエンドポイント(＝アクセス元のPCやスマホ)のIPアドレスやOS等を条件として指定し、アクセスを制御できる仕組み。

# やったこと
- 「PC - インターネット - LB - GCEインスタンス(nginx)」という構成を作り、インターネットから普通にGCPインスタンスにWEBアクセスができるようにする。（インターネット上からアクセス制限なしでWEBアクセスできる状態）
- LBの前にIAPを挟む設定を追加する。これにより、WEBサーバへのアクセス時に認証が行われるようにする。
- IAPにAccess Context Managerの設定を追加する。これにより認証の前にSRCIP制限がかかるようにする。

# 構成図

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/1a9568b5-4d8c-4c08-36b5-26c56de02df3.png)


# 手順
## 事前準備
### プロジェクトの作成
- プロジェクトを作成する。なお、Access Context Managerを使うには、組織に所属しているプロジェクトである必要がある。

![iap01c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/60215094-197d-b8b1-0d08-df387702f8ee.png)

### GCEインスタンスの作成
- CentOS8のインスタンス「mksamba-nginx」を作成し、nginxをインストールしておく。

![iap02b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/1c6af502-737a-6482-37a1-192282dabd57.png)


```
# yum install nginx
# systemctl enable nginx
# systemctl start nginx
```

### インスタンスグループの作成
- 「非マネージドインスタンスグループ」として「mksamba-instancegroup」を作成し、インスタンス「mksamba-nginx」を所属させる。

![iap03b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4faaa894-727a-ed3e-1463-a8288228dd5d.png)


### ロードバランサ(HTTPS負荷分散)の作成
- ロードバランサ(HTTPS負荷分散)を作成する。
    - backend: 「mksamba-backend」を作成し、インスタンスグループ「mksamba-instancegroup」を指定する。
    - frontend: 「mksamba-frontend」を作成する。
        - プロトコル: https
        - IPアドレス: 「IPアドレスを作成」で固定IPを取得
        - 証明書：「新しい証明書の作成」- 「Google管理の証明書を作成する」で証明書を取得 
- 今回はLBに紐づけるホスト名をmksambalb.xxx.com(仮名)とし、AWS Route53の設定にて、上記手順で取得した固定IPをそのmksambalb.xxx.comのAレコードとして登録しておいた。取得した固定IPとAレコードの登録内容が一致していれば証明書が発行される。

![iap04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ef004412-22a3-2196-c9ca-eae2871d6f44.png)

![iap06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a606208c-28f7-e51f-3e46-7618c97df8e6.png)


- ファイアウォールルールを追加する。(LB-GCEインスタンス間の通信を許可)
    - Src: 35.191.0.0/16, 130.211.0.0/22 (LoadBalancerのSRCIP)
    - Dst: インスタンス
    - Port: 80/tcp


![iap07b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d81d35e0-212b-b29d-bffc-4aa9ce3e6a17.png)


### IAP設定前の動作確認
- LBに紐づけたURLにアクセスして、普通にnginxの画面が表示されることを確認する。

![iap08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/9eaadc8d-075b-7c44-75eb-13651baf35ba.png)

## IAP設定の追加

- IAMと管理 -> Idendity-Aware Proxyを選択し、IAPの画面へ移動する。
- IAPを有効化する。

![iap09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/1526fc71-9d0b-aea9-d12f-e1d9d8477fad.png)


- IAPの画面にて、まずOAuth同意画面を作成する。
    - User Type: 外部 (Googleアカウントならどんなアカウントでも認証に使える設定)
    - アプリケーション名: mksamba-nginx


![iap10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/8a7427f0-c261-971b-0334-a5f548161b36.png)
![iap11a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/3d2ba2f5-9a68-6465-0ccc-76a1cb956db4.png)

- IAPの画面に戻り、バックエンドサービス「mksamba-backend」(先に作成したLB+GCEインスタンス)に対し、IAPのスイッチをONにして有効化する。

![iap12a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e99ce20d-eba3-7ecf-2df1-fb7cdf8b5a6d.png)

- mksamba-backend を選択し、「新しいメンバー」として適当なGoogleアカウント(例: xxxx＠gmail.com)、「ロール」として「Cloud IAP - IAP-secured Web App User」を追加する。

![iap14a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/dbd99039-39b0-db84-b087-efb760512b2a.png)


## IAPの動作確認
- IAPの設定後、再度LBのURLにアクセスすると、nginxの画面ではなく、googleの認証画面が表示される。

![iap15a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a4aab0bf-5553-2591-5c46-7967a6823198.png)


- 「IAP-secured Web App User」 として登録したgoogleアカウントのID/Passを入力し認証をパスすると、nginxの画面が表示される。

![iap08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/9eaadc8d-075b-7c44-75eb-13651baf35ba.png)


- 登録されてないgoogleアカウントのID/Passを入力すると、「You don't have Access」のエラー画面となる。

![iap16a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/93a98ca5-40a9-140b-020d-4be6ab18ef47.png)

## Access Context Managerの設定
- セキュリティ -> Access Context Manager の画面を選択する。（プロジェクトではなく組織を選択する必要がある）。

![iap18b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e993d792-039e-2226-a12b-150dbb65ddf9.png)


- AccessControlLevel(アクセスを制限するルールみたいなもの)を新規作成する。今回は一番シンプルなルールであるSRCIP制限を設定する。(特定のCIDRからのアクセスのみ許可する設定)


![iap19b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/fde651da-3f6a-2c4b-654f-aeb4df35b92a.png)


- IAPの設定画面で、認証時の条件を追加する。前ステップのIAPの検証では「IAP-secured Web App User」としてGoogleアカウントを設定するのみだったが、今回はそこに「アクセスレベル」の設定を加える。

![iap21a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d35df796-a901-7f1a-bbaa-e7b11dbc98f9.png)

## Access Context Managerの動作確認
- Access Context Managerの設定後、再度LBのURLにアクセスすると、設定したSRCIPからのアクセスの場合はGoogleの認証画面が表示される。また、設定したSRCIP以外からのアクセスの場合は接続エラー画面（認証失敗時と同じ）が表示される。

# 所感
- 初心者として以下の点につまづいた。
    - GCEがIAPに対応している、ということで、最初、単体のインスタンスをWEBサーバにしたが、IAP(https)の設定対象(リソース)として出てこなかった。LBとインスタンスグループが必要なことが後から分かった。
    - Access Context Manager を使用する場合、組織が必須ということに気づかなかった。組織なしのプロジェクトで作業していてその点で行き詰まり、組織配下のプロジェクトで作業をやり直した。
- まだあまりBeyondなかっこいい感じになってないので、他の構成要素についても勉強していきたい。