目的
PublicIPの利用を禁止するため、組織ポリシーを用いてアクセス制御の動作を確認する
どの組織ポリシーを制御すればよいかは、下記のURLから検索することで対象を絞ることができる
組織のポリシーの制約
事前確認
PublicIPの利用制限を実施していない状態を確認する。
確認サービス
・Public静的IPアドレス(VPCネットワーク)
・Compute Engine仮想マシン
・Kubernetes Engine
・App Engine
・Cloud Functions
・Cloud Run
・VPN
・Cloud Load Balancer
・Cloud SQL
・Cloud Storage
・Marketplace
・Datastream
・VertexAI
Public静的IPアドレス(VPCネットワーク)
Compute Engine仮想マシン
仮想マシンインスタンスにPublicIPアドレスを割り当てることが可能
Kubernetes Engine
PodsとロードバランサにてPublicIPアドレスを割り当て公開クラスタが作成可能
サービス立ち上げ、PublicIPアドレスに対してアクセスが可能である
App Engine
サンプルアプリをデプロイし、インターネットからアクセスが可能
% gcloud app deploy
Services to deploy:
descriptor: [/Users/xxx/golang-samples/appengine/go11x/helloworld/app.yaml]
source: [/Users/xxx/golang-samples/appengine/go11x/helloworld]
target project: [manabu-pj-xxx]
target service: [default]
target version: [20230920t135658]
target url: [https://manabu-pj-xxx.uc.r.appspot.com]
target service account: [106160482915-compute@developer.gserviceaccount.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 6 files to Google Cloud Storage ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://manabu-pj-399602.uc.r.appspot.com]
You can stream logs from the command line by running:
$ gcloud app logs tail -s default
To view your application in the web browser run:
$ gcloud app browse
ブラウザからアクセスを確認
% gcloud app browse
WARNING: Python 3.5-3.7 will be deprecated on August 8th, 2023. Please use Python version 3.8 and up.
If you have a compatible Python interpreter installed, you can use it by setting
the CLOUDSDK_PYTHON environment variable to point to it.
Opening [https://manabu-pj-xxx.uc.r.appspot.com] in a new tab in your default browser.
IPアドレス確認
% dig manabu-pj-xxx.uc.r.appspot.com
; <<>> DiG 9.10.6 <<>> manabu-pj-xxx.uc.r.appspot.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45012
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;manabu-pj-xxx.uc.r.appspot.com. IN A
;; ANSWER SECTION:
manabu-pj-xxx.uc.r.appspot.com. 6 IN A 142.250.207.20
Cloud Functions
digにてPublicIPを確認
% dig us-central1-manabu-pj-xxx.cloudfunctions.net
; <<>> DiG 9.10.6 <<>> us-central1-manabu-pj-399602.cloudfunctions.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25043
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;us-central1-manabu-pj-xxx.cloudfunctions.net. IN A
;; ANSWER SECTION:
us-central1-manabu-pj-xxx.cloudfunctions.net. 300 IN A 216.239.36.54
Cloud Run
digにてPublicIPを確認
dig hello-wr7nl34dpq-uc.a.run.app
; <<>> DiG 9.10.6 <<>> hello-wr7nl34dpq-uc.a.run.app
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4467
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;hello-wr7nl34dpq-uc.a.run.app. IN A
;; ANSWER SECTION:
hello-wr7nl34dpq-uc.a.run.app. 21600 IN A 216.239.34.53
hello-wr7nl34dpq-uc.a.run.app. 21600 IN A 216.239.32.53
hello-wr7nl34dpq-uc.a.run.app. 21600 IN A 216.239.38.53
hello-wr7nl34dpq-uc.a.run.app. 21600 IN A 216.239.36.53
VPN
PublicIPを用いたVPN構成のオーダが可能
VPN接続作成時に、PublicIPアドレスが必要となるため作成する
Cloud Load Balancer
インターネットから内部サービス向けのロードバランサを作成可能
インターネット側のPublicIPはエフェメラルもしくは静的IPが利用可能
Cloud SQL
SQLインスタンスを作成し、PublicIPを利用した構成が可能
Cloud Storage
パブリック公開のバケットを作成し、インターネットからのアクセスが可能
バケット作成時に、「公開アクセス禁止を適用する」のチェックをはずすことが可能
適当な画像をアップロードし、インターネットからアクセスすることが可能
Marketplace
Marketplaceの画面を開き、プロダクトの確認とオーダが可能
Datastream
パブリックアドレスのDatastreamからSQLへのアクセス設定が可能
VertexAI Workbench
----アクセス制御と結果----
アクセス制御の実施
今回アクセス制御を実施する方法として、組織ポリシーでの制御を実施する
組織のポリシーを設定することで、組織内のすべてのプロジェクトでPublicIPアドレスの利用を禁止する
場合によっては特定のプロジェクトのみに適用なども可能
組織ポリシーの設定の事前準備
編集権限の付与
組織ポリシーの作成には権限が必要なため、付与する
組織のポリシーの作成と管理
組織ポリシーの編集
組織(xcloudyx.net) -> IAMと管理 -> 組織のポリシーを選択
Public静的IPアドレス(VPCネットワーク)
組織ポリシーでの制御はできない
ComputeEngineの制御方法
constraints/compute.vmExternalIpAccessの組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーにてconstraints/compute.vmExternalIpAccesでフィルタをかけ、Define allowed external IPs for VM instancesを選択
ポリシーの値をすべて許可しないに変更し、ポリシーを設定を選択
上位組織で拒否のポリシーとしたため、下位のプロジェクトに設定内容が継承されている事を確認
ComputeEngineの制御結果
組織ポリシーにより、エフェメラルのPublicIPも既に作成済みの静的IPの割り当て(選択)ができない
Kubernetes Engineの制御方法
ComputeEngineおよびロードバランサと同様の設定、一般公開クラスタ(Public向け)の作成は失敗する
constraints/compute.vmExternalIpAccess
constraints/compute.restrictLoadBalancerCreationForTypes
Kubernetes Engineの制御結果
App Engineの制御方法
組織ポリシーでの制御はできない
AppEngineのFirewallで制御する
Cloud Functionsの制御方法
インバウンド
constraints/cloudfunctions.allowedIngressSettings
アウトバウンド
constraints/cloudfunctions.allowedVpcConnectorEgressSettings
の組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーより、**Allowed ingress settings (Cloud Functions)**を選択
カスタム -> 許可 -> ALLOW_INTERNAL_ONLY -> 完了 -> ポリシーを設定を選択
Cloud Functionsの制御結果
Cloud Runの制御方法
run.allowedIngressの組織ポリシーを変更することで、アクセス制御が可能
許可される上り(内向き)設定の制限
組織ポリシーより、Allowed ingress settings (Cloud Run)を選択
カスタム -> 許可を選択
内部からの通信と、ロードバランサ経由の通信のみを許可する
internalとinternal-and-cloud-load-balancingを追加して、完了 -> ポリシーを設定を選択
Cloud Runの制御結果
上記により、CloudRunのサービス作成にて、すべてを選択することができなくなる
VPNの制御方法
constraints/compute.restrictVpnPeerIPs
の組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーより、Restrict VPN Peer IPsを選択
すべて許可しない -> 完了 -> ポリシーを設定を選択
VPN利用時はPublicIPが必須となるので、すべて許可しないとする
VPNの制御結果
上記により、VPN作成にて、最終的にエラーとなる
途中までオーダできそうな感じだったが、オーダ後、最終的にエラーとなりVPNサービスの作成は失敗した。
Cloud Load Balancerの制御方法
constraints/compute.restrictLoadBalancerCreationForTypes
の組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーより、Restrict Load Balancer Creation Based on Load Balancer Typesを選択
カスタム -> 拒否を選択し
ルールの中身に「in:EXTERNAL」を入れることで全てのPublicロードバランサタイプを拒否する
続けて、完了 -> ポリシーを設定を選択
in:EXTERNALによって、複数のポリシーが追加されたことがわかる
Cloud Load Balancerの制御結果
上記により、Externalタイプロードバランサの作成にて、最終的にエラーとなる
途中までオーダできそうな感じだったが、オーダ後、最終的にエラーとなりPublicタイプのLBサービスの作成は失敗した。
Cloud SQLの制御方法
constraints/sql.restrictPublicIp
の組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーより、Restrict Public IP access on Cloud SQL instancesを選択
Cloud SQLの制御結果
上記により、Cloud SQLのオーダ画面にてPublicIPの付与ができない状態となった
Cloud Storageの制御方法
constraints/storage.publicAccessPrevention
の組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーより、Enforce Public Access Preventionを選択
Cloud Storageの制御結果
上記により、バケット作成時にエラーはないが、AllUsersに読み取り許可の設定を実施するとエラーとなった
Marketplaceの制御方法
constraints/commerceorggovernance.disablePublicMarketplace
の組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーより、Disable Public Marketplaceを選択
Marketplaceの制御結果
Datastreamの制御方法
constraints/datastream.disablePublicConnectivity
の組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーより、Datastream - Block Public Connectivity Methodsを選択
Datastreamの制御結果
PublicIPを用いたDatastreamを作成しようとすると、最後にエラーとなる
VertexAI Workbenchの制御方法
constraints/ainotebooks.restrictPublicIp
の組織ポリシーを変更することで、アクセス制御が可能
組織ポリシーより、Restrict public IP access on new Vertex AI Workbench notebooks and instancesを選択