ログシンク作成時に「適切な権限を付与できませんでした」

記事タイトルとURLをコピーする

G-gen の杉村です。組織の集約ログシンクを作成する際に「適切な権限を付与できませんでした」というメッセージが出力されました。原因と対処法を紹介します。

はじめに・前提知識

Cloud Logging の ログシンク の仕組みを使うことで、組織内で監査ログやその他の重要なログを一つのプロジェクトに集約し、監査対応や発見的統制に役立てることができます。

ログシンクの仕組みについては以下の記事の ログルーティングとログの保存 の項をご参照ください。

blog.g-gen.co.jp

事象

ある組織において、組織レベル (またはフォルダレベル) で集約ログシンクを作成することを試みました。

作業は Web コンソール画面から行いました。ログシンクの作成自体は成功したものの、以下のメッセージが表示されました。

手動構成が必要

手動構成が必要

シンクは正常に作成されました。

しかしながら、宛先に適切な権限を付与できませんでした。シンクのサービス アカウント
(サービスアカウント名)
に、宛先 (ログバケット ID) へのログ書き込み権限を手動で付与して、オペレーションを完了してください。適切な権限がサービス アカウントに付与されるまで、この宛先にログは書き込まれません。

メッセージにあるように、権限不足により集約ログシンクは正常に稼働していません。

原因調査

調査

Cloud Audit Logs により、権限付与に失敗した際のエラーログが出ているはずだと考え、Cloud Logging のログエクスプローラからログを確認しました。

すると、以下のようなログが出力されていました。

ログエクスプローラでのログ検索

One or more users named in the policy do not belong to a permitted customer.

このエラーメッセージを Google Cloud 公式ドキュメント内で検索すると、以下のドキュメントに当たりました。このエラーメッセージは 組織のポリシードメイン制限の制約 (iam.allowedPolicyMemberDomains) という制約によって、IAM に追加しようとしたドメインが拒否された際に表示されるものでした。

組織のポリシーについては、以下の記事をご参照ください。

blog.g-gen.co.jp

判明した原因

今回の事象が発生した組織では、確かにドメイン制限の制約 (iam.allowedPolicyMemberDomains) を設定したばかりでした。

この制約は、事前にホワイトリストに登録した Google Workspace (Cloud Identity) 組織のアカウント以外は IAM 権限を持てないようにする制約です。

このときは、ホワイトリストとして Google Cloud 環境の構築を行う外部ベンダーのドメインしか登録していませんでした。つまり、自分自身の組織の登録をしていなかった のです (なお、制約は遡及的に効果を発揮しませんので、既に IAM 権限付与済みのアカウントには影響しません)。

自分自身の組織をホワイトリストとして登録していなかったため、自組織のサービスアカウントも拒否され、エラーとなったのでした。

詳細な原因

ログシンクが他プロジェクトのログバケットにログを書き込むためには、書き込み ID と呼ばれるサービスアカウントが、宛先ログバケットの所属するプロジェクトに対して ログバケット書き込み (roles/logging.bucketWriter) ロールを持つ必要があります。

この権限付与は、今回のようにコンソール画面からログシンク作成を行うと、通常は裏で Google 側が自動的に実施してくれます。

しかし今回は「ドメイン制限の制約」に自組織が登録されていなかったことで、裏で Google が権限付与をしようとした際に、自組織内のサービスアカウントであるにも関わらず権限付与が拒否されてしまい、今回の事象となったわけです。

対処法

概要

ドメイン制限の制約 (iam.allowedPolicyMemberDomains) のホワイトリストに対して、自組織の 顧客 ID (お客様 ID、customer ID) を追加します。

顧客 ID は以下いずれかの方法で確認できます。

  1. Google Workspace (Cloud Identity) の管理コンソールで確認
  2. gcloud コマンドで確認

1. 顧客 ID の確認

1-A. 管理コンソールで顧客 ID を確認

Google Workspace (Cloud Identity) の管理コンソールにログインし、アカウント > アカウント設定 > プロファイル から顧客 ID を確認することができます。

Google Workspace (Cloud Identity) 管理コンソールでの確認

この手順で顧客 ID を確認するには、管理コンソールにログインして情報を表示する権限が必要です。Google Workspace (Cloud Identity) の特権を持っていない場合は、次の gcloud コマンドの手順で ID を取得します。

1-B. gcloud コマンドで顧客 ID を確認

Google Workspace (Cloud Identity) の管理コンソールに入れない場合は、以下のコマンドで組織の顧客 ID を確認することができます。${DOMAIN_NAME} の部分は自環境のドメイン名 (example.com 等) に置き換えてください。

gcloud organizations list --filter="displayName=${DOMAIN_NAME}" --format=json

当該 Google Cloud 組織に対してコマンド実行アカウントが resourcemanager.organizations.get 権限を持っていればこのコマンドが成功します。この権限を得るためには、組織トップノードのレベルで 参照者 (roles/browser)組織の管理者 (roles/resourcemanager.organizationAdmin) が必要です。

なお組織のポリシーの制約を管理するのに必要な 組織ポリシー管理者 (roles/orgpolicy.policyAdmin) ロールには、組織情報を得るための resourcemanager.organizations.get 権限が 含まれていません ので、ご注意ください。

2. ホワイトリストへの追加

Web コンソールの IAM と管理 > 組織のポリシーDomain restricted sharing または constraints/iam.allowedPolicyMemberDomains で検索して当該の制約を編集します。

制約のホワイトリストへ顧客 ID を追加

+ 値を追加 を押して、顧客 ID を追加します。

なお、ドキュメント では顧客 ID の文字列の前に接頭辞 is: をつけることが指示されていますが、接頭辞がなくても挙動が変わらないことが検証できています。

3. 権限の再付与

3-A. 書き込み ID に IAM ロールを付与

シンクの書き込み ID に権限を与えるため、シンクの書き込み ID 名を確認します。

Cloud Logging > ログルーター でシンクの一覧を表示させ、当該のシンク名の右の三点リーダから シンクの詳細を表示する を選択します。

シンクの書き込み ID を確認

書き込み ID (サービスアカウント) 名をクリップボードにコピーします。なおサービスアカウント名の頭にある serviceAccount: は接頭辞であり、今回は不要です。

次に、ログルーティング先のログバケットのあるプロジェクトの IAM 画面へ遷移します。

IAM と管理 > IAM に遷移し、プロジェクトセレクタが 宛先バケットと同じプロジェクト になっていることを確認します。この画面で、先程のサービスアカウントをプリンシパルとして、ログバケット書き込み (roles/logging.bucketWriter) ロールを付与してください。

これにより、ログシンクによるログのルーティングができるようになります。

3-B. シンクの再作成

上記の手順では書き込み ID に手動で権限を付与したことで権限を解決しました。

代わりに、ログシンクを削除して再作成することでも Google が裏で自動で権限を付与してくれますので、問題を解決することができます。

杉村 勇馬 (記事一覧)

執行役員 CTO / クラウドソリューション部 部長

元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。