G-gen の藤岡です。当記事では Google Cloud(旧称 GCP)で「ドメイン別の ID の制限」の組織ポリシー適用下で Cloud Run サービスを一般公開する方法を紹介します。
前提知識
「ドメイン別の ID の制限」の組織ポリシー
Google Cloud には、組織やフォルダ、プロジェクトに対して統制を効かせるための 組織ポリシー 機能があります。
組織ポリシーの制約の1つにドメイン別の ID の制限(constraints/iam.allowedPolicyMemberDomains
)があり、これは誤ってまたは悪意を持って自組織以外の Google アカウントが IAM 権限を持たないようにする制約です。(「ドメインで制限された共有」と表記される場合も有り)
以下のように、許可する Google Workspace お客様 ID または Google Cloud の組織リソース ID を指定します。
リソースに特定のタグが付与されている場合は組織ポリシーの制約を適用しない、という条件を含めた設定もできます。当記事では条件が設定された組織ポリシーを条件付き組織ポリシーと表記します。
タグについては以下の記事をご参照ください。 blog.g-gen.co.jp
Cloud Run
2つのアクセス制御レイヤー
Cloud Run には2つのアクセス制御レイヤーがあります。 Cloud Run サービスに到達するには、Ingress と IAM の両方で許可されている必要があります。
レイヤー名 | 仕様 |
---|---|
Ingress | ・通信元に基づいてリクエストをフィルタリング (ネットワーク的な制御) ・通信元が設定された、内部もしくはすべての場合に許可される ・組織ポリシー「許可される上り」( constraints/run.allowedIngress )で制御可能 |
IAM | ・送信者に基づいてリクエストをフィルタリング (認証・認可的な制御) ・送信者に Cloud Run 起動元ロール( roles/run.invoker )が付与されていると許可される・組織ポリシー「ドメイン別の ID の制限」で制御可能 |
Cloud Run でサービスを一般公開する場合、Cloud Run 起動元ロール(roles/run.invoker
)を allUsers
に割り当てる必要があります。
しかし、前述の「ドメイン別の ID の制限」の組織ポリシーの適用下では allUsers
に IAM ロールを付与できません。
- 参考:ドメインで制限された共有
サービスを一般公開する方法
「ドメイン別の ID の制限」の組織ポリシーの適用下で Cloud Run サービスを一般公開(つまり allUsers
に Cloud Run 起動元ロールを付与)する方法として、以下の2つがあります。
- 「ドメイン別の ID の制限」の組織ポリシーを一時的に削除する
- タグと条件付き組織ポリシーを使う
方法1の場合、以下のようなフローとなります。
- 一時的に「ドメイン別の ID の制限」の組織ポリシーを削除
- → Cloud Run を
未認証の呼び出しを許可
にしデプロイ(allUsers
に Cloud Run 起動元ロールが割当たる) - → 「ドメイン別の ID の制限」の組織ポリシーを適用
但し、組織ポリシーを削除することは一時的とは言えセキュリティリスクが高まるため2の方法が推奨されます。
当記事では、タグと条件付き組織ポリシーを使うことで「ドメイン別の ID の制限」の組織ポリシー適用下でも Cloud Run サービスを一般公開する方法を紹介します。
注意点
タグがサポートされているサービス
タグがサポートされているリソースはドキュメントに記載の通りです。 2023 年 10 月執筆時点では、Cloud Functions はサポートされていません。
但し、Cloud Functions 第2世代や Cloud Functions for Firebase 第2世代は Cloud Run 上で起動するため、当記事で紹介する方法でサービスを一般公開できます。
Config Controller は未対応
条件付き組織ポリシーを使うには、Organization Policy API V2 が必要です。 しかし 2023 年 10 月執筆時点では、Config Controller では Cloud Resource Manager API V1 のみの対応となっているため、条件付き組織ポリシーは使えません。
他の IaC ツールとしてよく使われる Terraform では google_org_policy_policy で条件付き組織ポリシーが使えます。
Cloud Run サービスの一般公開
アーキテクチャ
タグと条件付き組織ポリシーを適用した際のアーキテクチャは以下の通りです。
前提
Google Cloud を企業で利用する場合、「組織の管理者」と「各プロジェクトでリソースを管理するユーザー」は異なる場合が多く、また必要な権限も異なります。
後述の設定手順では実際に企業で使う場合を想定し、組織の管理者が行う作業とプロジェクトの管理者が行う作業を項目の箇所に記載しています。
権限
本構成で組織の管理者に必要な組織レベルのロールは以下の通りです。
- 組織ポリシーを設定:組織ポリシー管理者(
roles/orgpolicy.policyAdmin
) - タグの作成:タグ管理者(
roles/resourcemanager.tagAdmin
) - タグをリソースにバインディング:タグユーザー(
roles/resourcemanager.tagUser
)
設定手順
組織管理者:「ドメイン別の ID の制限」の条件付き組織ポリシーを適用
ここでは Cloud Shell で実行します。コンソールからでも設定可能です。
drs-policy.yaml
ファイルを作成します(ファイル名は任意)。ORGANIZATION_ID
と DIRECTORY_CUSTOMER_ID
は置き換えてください。
# drs-policy.yaml name: organizations/ORGANIZATION_ID/policies/iam.allowedPolicyMemberDomains spec: rules: - values: allowedValues: - DIRECTORY_CUSTOMER_ID - allowAll: true condition: expression: resource.matchTag("ORGANIZATION_ID/allUsersIngress", "True") title: allowAllUsersIngress
drs-policy.yaml
ファイルを保存し、適用します。
$ gcloud org-policies set-policy drs-policy.yaml
これによって、タグキー allUsersIngress
の値が True
のタグがバインディングされているリソースに対して「ドメイン別の ID の制限」で許可されているドメインに関わらず、IAM ロールを付与できるようになります。
適用後、以下のように allowedValues
で定義した Google Workspace お客様 ID とタグの条件式が設定されています。
組織管理者:タグキーとタグ値を作成
タグキー (allUsersIngress
) を作成します。
$ gcloud resource-manager tags keys create allUsersIngress \ --parent=organizations/ORGANIZATION_ID
以下のようにタグキーが作成されます。
作成したタグキーにタグ値(True
)を追加します。TAGKEY_ID は作成したタグキー ID (例: tagKeys/123456
) に置き換えてください。
$ gcloud resource-manager tags values create True \ --parent=TAGKEY_ID \ --description="Allow for allUsers for internal Cloud Run services"
以下のようにタグ値が追加されます。
- 参考:タグの作成と管理
プロジェクト管理者:Cloud Run の作成
ここではイメージにサンプルコンテナを使い、初回は 認証が必要
でデプロイします。
ここで、未認証の呼び出しを許可
でデプロイすると以下のエラーが表示されます。
サービスが作成されましたが、一般アクセスできない可能性があります。リソース「projects/xxxx/locations/asia-northeast1/services/hello」に対して IAM ポリシーを設定できませんでした。ロール「roles/run.invoker」を次のプリンシパルに割り当てることができませんでした: allUsers。詳細: One or more users named in the policy do not belong to a permitted customer, perhaps due to an organization policy.
組織管理者:Cloud Run にタグバインディング
作成した Cloud Run にタグをバインディングします。
TAGVALUE_ID は追加したタグ値(例: tagValues/1234567890
)に置き換えてください。
$ gcloud resource-manager tags bindings create \ --tag-value=TAGVALUE_ID \ --parent=//run.googleapis.com/projects/PROJECT_ID/locations/REGION/services/SERVICE_NAME \ --location=REGION
タグバインディングをすると、コンソールから以下のように表示されます。
プロジェクト管理者:Cloud Run に allUsers 許可
最後に、未認証の呼び出しを許可
とするため allUsers
に Cloud Run 起動元ロールを付与します。
$ gcloud run services add-iam-policy-binding SERVICE_NAME \ --region=REGION \ --member="allUsers" \ --role="roles/run.invoker"
コンソールから確認すると、以下のように未認証の呼び出しが許可されています。
サービス URL へ問題なくアクセスできます。
エラー例
「ドメイン別の ID の制限」の組織ポリシー適用下で、許可されていないドメインのユーザーへ IAM ロールを付与しようとすると以下のエラーとなります。
IAM ポリシーの更新に失敗しました ドメイン制限の組織ポリシーがあります。ポリシーでプリンシパルとして追加できるのは、許可されたドメインのプリンシパルのみです。プリンシパルのメールアドレスを修正して、もう一度お試しください。
藤岡 里美 (記事一覧)
クラウドソリューション部
数年前までチキン売ったりドレスショップで働いてました!2022年9月 G-gen にジョイン。ハイキューの映画を4回は見に行きたい。
Google Cloud All Certifications Engineer / Google Cloud Partner Top Engineer 2024
Follow @fujioka57621469