[Google Cloud]VPC Service Controlsによるサービスの利用制限

## 目的
前回の記事にて、組織ポリシーによりPublicIPアドレスを用いたサービスの払出しや利用を禁止した。
今回は、サービス自体の利用を禁止する手法として、「**VPC Service Controls**」を用いたアクセス制御を実施する。

## 構成
環境は下記の通り、組織配下のフォルダで組織ポリシーを付与し、PublicIPの利用を禁止しつつ
今回実施するVPC Service Controlsを**user pj**に適用して動作を確認する
**user pj**に境界を作成し、**user pj**からGoogle Cloudの各種サービスへのアクセスを禁止する

なお、VPC Service Controlsの利用には組織が必須となる。
![貼り付けた画像_2023_09_27_16_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/112eec4e-2c75-2683-7196-5d865de95d5e.png)

## 必要な権限
ポリシーの作成に必要な権限は以下の通り
作成権限: accesscontextmanager.policies.create
表示権限: accesscontextmanager.policies.list
[必要なロール](https://cloud.google.com/vpc-service-controls/docs/access-control?hl=ja#required_roles)

## 境界の作成
**メニュー** -> **セキュリティ** -> **VPC Service Controls**を選択
![スクリーンショット_2023-09-27_16_34_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/ce4c1e81-bc8d-1b96-10dd-dcc0ccf44cb0.png)

**組織(xcloudyx.net)を選択**し、**ポリシーを管理する**を選択
![貼り付けた画像_2023_09_27_16_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/91bb3403-aa45-0780-ad7b-5b63d79f81f7.png)

**作成**を選択
![貼り付けた画像_2023_09_27_16_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/8a5b8583-1d97-d581-d0c6-c09ac05b8056.png)

**ポリシーのタイトルを入力**し、ポリシーを適用するリソースを選択する
今回は適用予定のプロジェクト上位のフォルダを対象とし
境界ポリシーを適用しないプロジェクトに影響がないか確認する
(user pjのリソースを制限し、dev pjのリソースは制限されないこと）

ポリシーの管理者を追加する必要があるため、適当なユーザを追加しておく
最後に**アクセスポリシーを作成**を選択
![貼り付けた画像_2023_09_27_16_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/9b481d05-1f6c-f9d2-3755-40ff614363aa.png)

作成したアクセスポリシー名(xcloudyxAccessPolicy)を選択し、**新しい境界**を選択
![貼り付けた画像_2023_09_27_16_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/74759102-46ad-e82a-c0c2-97eae81387e4.png)

CloudRunの利用を制限するポリシーを例に実装する
境界のタイトルを適当に入力する、境界タイプはそのまま

境界ブリッジは、作成したサービス境界間のアクセスが必要な場合で利用する
[サービス境界ブリッジ](https://cloud.google.com/vpc-service-controls/docs/share-across-perimeters?hl=ja#service_perimeter_bridges)

![貼り付けた画像_2023_09_27_16_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c8e8b1fa-1e4f-1b52-af72-a2a4c20150f6.png)

②を選択後、**ADD RESOURCES**を選択
![貼り付けた画像_2023_09_27_16_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b4312799-c3e7-bed4-e401-c1a4a7930884.png)

アクセスポリシーで上位フォルダを選択しているため、下位にあるプロジェクトが全て表示される
今回は、**user pj**のCloudRunの利用を禁止するため、**user pj**を選択し、**ADD SELECTED RESOURCES**を選択
![貼り付けた画像_2023_09_27_16_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/08795e88-c5c2-32e5-a013-ffa64faf659b.png)

③を選択後、**サービスを追加**を選択
![貼り付けた画像_2023_09_27_16_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c0273cbc-2395-8032-625a-634093254f54.png)

Cloud RunへのAPI通信を禁止することで、サービスの利用を禁止するため
フォルタ等で検索し、**Cloud Run Admin API**を選択し、**CLOUD RUN ADMIN APIを追加**を選択
![貼り付けた画像_2023_09_27_16_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/48a3522f-bbf0-81b3-058c-c021be43384c.png)

プロジェクトからGoogleサービスへのアクセス制限をするだけの場合、以降の設定は不要
**境界を作成**を選択
![貼り付けた画像_2023_09_27_16_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a29d2996-6b93-b9da-a19e-f45d650e32c7.png)

これで境界が作成され、**user pj**からのみCloudRunの利用ができなくなる。
![貼り付けた画像_2023_09_27_16_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3bfe803e-360e-d360-c726-c9d157dabf59.png)

## VPC Service Controlsの動作確認（利用サービスの制限）
最初の境界を作成してポリシーが反映されるまで、<font color="red">**20分**</font>ほどかかった・・・
その後のポリシー変更をすると、即反映されていたので最初だけか？

### サービスの作成
**user pj**からCloud Runのコンソールを起動すると、エラーが大量に表示されている状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a8bf65fe-ecd4-efc2-b94d-7cd98c3f440c.png)

そのまま、サービスを作成しようとするとvpcServiceControlsのポリシーでエラーになったことがわかる
![貼り付けた画像_2023_09_27_17_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3edf575b-6ba6-d5a0-3450-924e246c1f4c.png)

### 別プロジェクトでのサービスの作成
**user pj**以外に影響がないか**dev pj**での動作を確認
![貼り付けた画像_2023_09_27_17_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/bb925864-9bbe-acea-d08d-a8c4805545d1.png)

**user pj**側の制限をうけおらず問題なく作成できた
![貼り付けた画像_2023_09_27_17_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/f8702672-609f-a29f-df59-ae84e6257ba7.png)

## 境界の削除と動作確認
CloudRunの制限を削除
![貼り付けた画像_2023_09_27_17_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e7051dc7-928b-740c-17e0-41c300dd32d3.png)

CloudRunが利用できることを確認（エラーでてるけど・・・）
![貼り付けた画像_2023_09_27_17_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b929d152-b455-8427-30be-0b50bd2318a1.png)

もう少し待ってみるとエラーは消えたので、一時的な表示上の問題だけで問題なしと判断
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/cbda8f48-8315-5984-42eb-673e959e5ef2.png)


## 学び
VPC Service Controlsを適用した結果の反映までに<font color="red">凄まじく時間がかかる場合があるので落ち着いて待つ</font>