はじめに

2023年のBlack Hat@ラスベガスでGoogleさんのミニセッションで紹介されていたのがGCP Scannerです。
Googleのリポジトリにあるものの、非公式のGoogleプロジェクトとなります。

このツールを利用することで、プリンシパル(ユーザーやサービスアカウントなど)がどのようなアクセス権を持っているかをスキャンできます。それによって、クレデンシャル漏洩の疑いが発生した場合などに速やかに影響範囲を確認することができます。
よく似た機能にPolicy Analyzerというものもあります。特定のプロジェクトに対するスキャンであればこちらでも問題ないかもですが、Policy Analyzerの利用にはプロジェクトごとにCloud Assets APIの有効化を行う必要があります。
不特定多数の解析には、GCP Scannerの方が向いていると思います。

ミニセッションも枠内でループされるくらいのシンプルな機能のため、そこまで深掘りした内容ではないですが、関連記事がほとんど見当たらなかったのもありこの場で紹介したいと思います。

実行してみる

インストールはpipで行いました。

出力結果を吐き出すディレクトリ(result)を作成して以下のコマンドを叩きます。
GCLOUD_PROFILE_PATHは、デフォルトでは以下のようになっていると思いますが、変更されている方は合わせて書き換えてください。

$ python3 -m gcp_scanner -g ~/.config/gcloud/ -o ./result

当該プロファイルでアクセスできるプロジェクト群のスキャン結果がresultディレクトリに出力されていきます。
各ファイルの中身は以下のような感じです。

{
  "projects": {
    "myproject-#####": {
      "project_info": {
        "projectNumber": "123456789012",
        "projectId": "myproject-#####",
        "lifecycleState": "ACTIVE",
        "name": "MyProject",
        "labels": {
          "hoge": "enabled"
        },
        "createTime": "2020-06-16T00:22:53.949Z",
        "parent": {
          "type": "organization",
          "id": "098765432109"
        }
      },
      "app_services": {},
      "bigtable_instances": [],
      "bq": {},
      "cloud_functions": [],
      "compute_disks": [],
      "compute_images": [],
      "compute_instances": [],
      "compute_snapshots": [],
      "datastore_kinds": {},
      "dns_policies": [],
      "endpoints": [],
      "firestore_collections": {},
      "filestore_instances": [],
      "firewall_rules": [],
      "iam_policy": [
        {
          "role": "roles/cloudfunctions.serviceAgent",
          "members": [
...

Jsonで結果が返るため、gronと相性がよくこんな感じで欲しい情報を検索することが可能です。

$ find . -type f -exec gron {}  \; | grep projectNumber
json.projects["hoge"].project_info.projectNumber = "123456789012";
json.projects["fuga"].project_info.projectNumber = "123456789012";
json.projects["sys-##########################"].project_info.projectNumber = "123456789012";
json.projects["sys-##########################"].project_info.projectNumber = "123456789012";
json.projects["sys-##########################"].project_info.projectNumber = "123456789012";
...

まとめ

影響範囲の洗い出しにプロジェクトごとのAPI有効化することなく洗い出せるのはすごく強力なツールと思いました。
使うシーンが発生しないことが望ましいですが、何かあったときにスピード感をもって影響範囲を洗い出せることは、被害の最小化にも重要です。
オープンソースでGoogleサポートの元成長させていくツールのようですので、自分も時間がとれればコントリビュートしたいと思います!