VPC Service Controlその1

#はじめに
VPC Service Controlは、VPC外のGCPサービスに対してアクセス制限を提供出来る機能です。
AWSでいうところの「特定の VPC エンドポイントへのアクセスの制限」です。具体的に言うとConditionで"aws:sourceVpceに任意のVPC IDを指定するイメージです。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html

ちなみにAWSのVPCエンドポイントにあたるGCPの機能としては、VPC Private Accessがあります。

VPC Service Controlは、設定めっちゃ簡単なので直感的ななので個人的にお気に入りのサービスです。

#前提
前提として組織の使用が必要です。VPC Service Controlの「境界」は組織レベルで作成するためです。組織レベルで作成し、「境界」に任意のプロジェクトを追加していきます。

#出来ることのイメージ
手順としては、以下の流れになります。
VPC Service Controlの「境界」を作ります。
「境界」に含めるGCPプロジェクトを選択します。
「境界」に含まれたGCPプロジェクトのVPCからのみアクセス可能にするGCPサービスを選択します。
サポートしているGCPサービスはこちらです。
https://cloud.google.com/vpc-service-controls/docs/supported-products

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/c9c96d6c-4828-8a40-f7a5-1f37dd248145.png)


上記の図の青色の線がVPC Service Controlの「境界」になります。こちらは例として2つのプロジェクトを追加しています。
また、VPC Service Controlでアクセス制御するサービスとしてGCSを指定しています。

この状態で2つのプロジェクトのVPCに作成されたGCEインスタンスからは、GCSにアクセスできます。経路①②

経路③は、Google Cloud Console(CloudShell含む)やLaptopのTerminalからgcloudコマンドを実行するようなイメージです。送信元がVPCではないのでエラーになります。

Google Cloud ConsoleでGCSのバケットを確認しようとすると以下のようなエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/60b764e9-eb23-66e3-cfb5-b7cf401f6fae.png)

また、Cloud Shellからgsutilコマンドでlsすると403エラーになります。

```
 atsum@cloudshell:~$ gcloud auth list
 Credentialed Accounts
ACTIVE  ACCOUNT
*       atsum@*******

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

atsum@cloudshell:~ (app-prod-256209)$ gsutil ls
AccessDeniedException: 403 Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: 91b257b1160d2996
```

例外として、VPC外からアクセスを許可したい場合もあると思います。
以下の図の経路④のイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/5d3ebe35-45af-0cbf-29d8-1c5bb46c74de.png)

上記の例外設定は、上りポリシー: アクセスレベル（オプション）設定で可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/4f825057-0cae-d3be-f042-1a219b270781.png)

アクセスレベル自体は、Access Context Managerで行います。Access Context Managerで作成すると、VPC Service Controlから選択可能になります。

Access Context Managerの指定方法は、以下の3つになります。
- 任意のネットワーク(ipSubnetworks)
- 任意のデバイス(devicePolicy)
- ユーザ、サービスアカウント(members)

https://cloud.google.com/access-context-manager/docs/create-access-level?hl=ja

ここでは、任意のユーザに対して例外設定します。ユーザ、サービスアカウントはGoogle Cloud Consoleで作成できないため、gcloudコマンドで作成します。

CONDITIONS.yamlにアクセス許可したいユーザを記載します。

```
$ cat CONDITIONS.yaml
- members:
    - user:atsum@***
```

policyが作成されていない場合は、以下を参考に作成します。
https://cloud.google.com/access-context-manager/docs/create-access-policy?hl=ja

アクセスレベルを作成します。

```
$ gcloud access-context-manager levels create vpc_service_control_user    --title vpc_service_control_user    --basic-level-spec CONDITIONS.yaml    --combine-function=OR    --policy=663588***
API [accesscontextmanager.googleapis.com] not enabled on project
[***]. Would you like to enable and retry (this will take a
few minutes)? (y/N)?  y

Enabling service [accesscontextmanager.googleapis.com] on project [***]...
Create request issued for: [vpc_service_control_user]
Waiting for operation [operations/accessPolicies/663588***/accessLevels/vpc_service_control_user/create/1582642710021853] to complete...done.
Created level [vpc_service_control_user].
```

この状態でアクセスするとgsutil lsが実行可能になっています。

```
$ gcloud auth list
 Credentialed Accounts
ACTIVE  ACCOUNT
*       atsum@***

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

$ gsutil ls
gs://test-dafakslefgajlke/
```

#境界ブリッジ
1 つのプロジェクトに設定できるサービス境界は 1 つだけですが、別の境界にあるプロジェクトとの通信が必要になる場合もあります。この場合、境界ブリッジを作成すると、境界を越えてサービスとの通信やデータの共有を行うことができます。

境界ブリッジについては、VPC Service Controlその２で書きました。
https://qiita.com/atsumjp/items/cf9e552c83428904bc1e