GCPのProjectCreatorの権限を剥奪したら、サポート機能が使えなくなった

GCPのガバナンス強化のために、全社員からProjectCreator権限を剥奪し、一部の管理者のみがプロジェクトを作成するという運用に切り替えました。
その結果、一部のメンバーからサポートケースの閲覧や起票ができなくなったという報告を受けました。
本記事では、その調査方法や権限修正について報告します。

# 発生していた現象
メンバーがサポートケース起票画面を開いたところ、以下の画面が表示されました。
サポートに関する権限を持っていないというエラーが表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/a165d7d5-d2d9-0a9e-175c-717b146521c8.png)

このメンバーにはロールベースサポートのProductionの権限を与えていたため、この現象は不可解でした。
https://cloud.google.com/support/docs/role-based-support#support_user_roles

また、この時点では関連があるかどうかは不明でしたが、本体ならOrganizationに紐付けられているはずのプロジェクトがNo organizationとして表示されていました。
![貼り付けた画像_2020_12_13_17_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/bb015743-4d17-b8a7-278c-e77f4b6562d5.png)

# 調査
サポートケースを閲覧できないメンバーと閲覧できるメンバーがいたため、それらのメンバー間で権限が異なることを原因として疑いました。
そのため、Cloud Audit LogsでそれらのメンバーのAPI呼び出しを確認しました。
こんなこともあろうかと（？）監査ログを有効にしておくとトラブルシューティングに便利です。
https://cloud.google.com/logging/docs/audit

サポート機能はOrganizationに紐付いているため、Organizationの監査ログを確認します。
なお、Organizationの監査ログはOrganizationAdministratorAdmin権限だけでは閲覧不能で、SecurityAdmin権限が追加で必要です。

ログを確認した結果、サポートの利用にあたって、GetOrganizationとFindOrCreateOrganizationの2つのAPIが呼び出されていたことが分かりました。
閲覧できないメンバーはこれたのAPI呼び出しが失敗していたため、サポートの利用が不能になっていたようです。

↓サポートケースを閲覧できたメンバー

![貼り付けた画像_2020_12_13_17_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/cae71254-f48e-f64c-c35b-ad6e766aa0fd.png)

↓サポートケースを閲覧できなかったメンバー
![貼り付けた画像_2020_12_13_17_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/379c7511-15d6-60d2-5255-635362574612.png)

Cloud Loggingで更に詳細なログエントリを確認してみました。
FindOrCreateOrganizationのAPI呼び出しをするためには、Organizationリソースに対して、resourcemanager.organizations.getの権限が必要でした。
※ ログの一部を省略・マスク化してます

```json
{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {},
    "authenticationInfo": {
      "principalEmail": "XXXX@example.com"
    },
    "serviceName": "cloudresourcemanager.googleapis.com",
    "methodName": "FindOrCreateOrganization",
    "authorizationInfo": [
      {
        "resource": "organizations/12345678",
        "permission": "resourcemanager.organizations.get",
        "granted": true,
        "resourceAttributes": {}
      }
    ],
    "resourceName": "organizations/12345678",
    "request": {
      "@type": "type.googleapis.com/google.cloudresourcemanager.v1.FindOrCreateOrganizationRequest"
    }
  },
  "timestamp": "2020-12-10T02:54:25.701Z",
  "severity": "INFO",
  "logName": "organizations/485752873670/logs/cloudaudit.googleapis.com%2Fdata_access",
  "receiveTimestamp": "2020-12-10T02:54:26.565738216Z"
}
```

GetOrganizationの呼び出しについても同様に確認したところ、こちらもresourcemanager.organizations.getの権限が必要でした。

実はこの問題が報告される少し前に、ProjectCreator権限を一部のメンバーだけしか付与しないという権限変更を行っていました。
ProjectCreatorによって付与されるpermissionにはresourcemanager.organizations.getが含まれており、これが剥奪されていたことがサポートを利用できない原因でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/c435e1f7-ecc2-18ba-54c6-a558c860b6ef.png)

# 修正
さて、原因が分かったので、後は不足していた権限を付与すればOKです。
とはいえ、再度ProjectCreator権限を付与することはできないので、resourcemanager.organizations.getだけをピンポイントで付与できるロールはないものかと思い、ドキュメントを漁っていたら見つけました。
roles/
resourcemanager.organizationViewerです。

https://cloud.google.com/resource-manager/docs/access-control-org#using_predefined_roles

サポートを利用するメンバー1人1人に対してこの権限を付与して回るのは煩雑であるため、実際はG Suiteで管理されているドメイン全体に対してこの権限を付与しました。

# まとめ
ProjectCreator権限を剥奪するときには、代わりにOrganizationViewer権限を付与しておかないとサポート機能が使えなくなります。