IAM ポリシーの検索

Cloud Asset API では、カスタムクエリ言語を使用して、プロジェクト、フォルダ、組織内の Identity and Access Management(IAM)ポリシーを検索できます。

始める前に

SearchAllIamPolicies を呼び出しています

gcloud

SearchAllIamPolicies は、gcloud asset search-all-iam-policiesコマンドを使用して呼び出せます。Cloud SDK バージョン 302.0.0 以降を実行する必要があります。バージョンは、gcloud version コマンドで確認できます。

gcloud asset search-all-iam-policies \
  --scope=SCOPE \
  --query=QUERY \
  --asset-types=ASSET_TYPES,… \
  --order-by=ORDER_BY \
  --page-size=PAGE_SIZE \

ここで

  • (省略可)SCOPE: スコープはプロジェクト、フォルダ、または組織のいずれかになります。検索は、このスコープ内の IAM ポリシーに限定されます。呼び出し元には、目的のスコープに対する cloudasset.assets.searchAllIamPolicies 権限を含むロールが付与されている必要があります。このオプションを指定しない場合は、構成されたプロジェクト プロパティが使用されます。構成されたプロジェクトを探すには、gcloud config get-value project を実行します。設定を変更するには、gcloud config set project PROJECT_ID を実行します。

    使用できる値は次のとおりです。

    • projects/PROJECT_ID(例: 「projects/foo-bar」)
    • projects/PROJECT_NUMBER(例: 「projects/12345678」)
    • folders/FOLDER_NUMBER(例: 「folders/1234567」)
    • organizations/ORGANIZATION_NUMBER(例: 「organizations/123456」)
  • (省略可)QUERY: クエリ ステートメント。詳細については、クエリの作成方法をご覧ください。指定しなかった場合、または空の場合は、指定された scope 内のすべての IAM ポリシーが検索されます。なお、クエリ文字列は、メンバー、ロール、IAM 条件を含む各 IAM ポリシー バインディングと比較されます。返される IAM ポリシーには、クエリに一致するバインディングのみが含まれます。IAM ポリシーの構造の詳細については、ポリシーについてをご覧ください。

    例:

    • policy:amy@gmail.com: ユーザー「amy@gmail.com」を指定する IAM ポリシー バインディングを検索します。
    • policy:roles/compute.admin: Compute Admin ロールを指定する IAM ポリシー バインディングを検索します。
    • policy:comp*: バインディングに接頭辞として「comp」が付いている単語を含む IAM ポリシー バインディングを検索します。
    • policy.role.permissions:storage.buckets.update:「storage.buckets.update」権限を含む IAM ポリシー バインディングを検索します。なお、目的のロールに対する iam.roles.get 権限を含むロールが呼び出し元に付与されていない場合、そのロールを指定するポリシー バインディングは検索結果から除外されます。
    • policy.role.permissions:upd*: バインディング内の単語の接頭辞に「upd」を含むロールを指定する IAM ポリシー バインディングを検索します。なお、目的のロールに対する iam.roles.get 権限を含むロールが呼び出し元に付与されていない場合、そのロールを指定するポリシー バインディングは検索結果から除外されます。
    • resource:organizations/123456:「organizations/123456」に設定されている IAM ポリシー バインディングを検索します。
    • resource=//cloudresourcemanager.googleapis.com/projects/myproject:「myproject」という名前のプロジェクトで設定されている IAM ポリシー バインディングを検索します。
    • Important: 検索可能フィールドに「Important」という単語を含む IAM ポリシー バインディングを検索します(含まれている権限を除く)。
    • resource:(instance1 OR instance2) policy:amy: ユーザー「amy」も指定して、リソース「instance1」または「instance2」に設定されている IAM ポリシー バインディングを検索します。
    • roles:roles/compute.admin: Compute Admin ロールを指定する IAM ポリシー バインディングを検索します。
    • memberTypes:user: 「user」メンバータイプを含む IAM ポリシー バインディングを検索します。
  • (省略可)ASSET_TYPES: Identity and Access Management ポリシーが関連付けられているアセットタイプのリスト。空の場合、すべての検索可能なアセットタイプに添付されている Identity and Access Management ポリシーを検索します。正規表現もサポートされています。次に例を示します。

    • "compute.googleapis.com.*" は、"compute.googleapis.com" で始まるアセットタイプに添付される IAM ポリシーのみに限定します。
    • ".*Instance" は、"Instance" で終わるアセットタイプに添付される IAM ポリシーのみに限定します。
    • ".*Instance.*" は、"Instance"を含むアセットタイプに添付される IAM ポリシーのみに限定します。

    サポートされているすべての正規表現の構文については、RE2 をご覧ください。正規表現が、サポートされているアセットタイプと一致しない場合は、INVALID_ARGUMENT エラーが返されます。

  • (省略可)ORDER_BY: 結果の並べ替え順序を指定するフィールドのカンマ区切りリスト。デフォルトの順序は昇順です。降順を適用するには、フィールド名の後に " DESC" を追加します。重複したスペース文字は無視されます(例: "assetType DESC, resource")。レスポンス内の単一のプリミティブ フィールドのみを並べ替えることができます。

    • resource
    • assetType
    • project

    繰り返しフィールドなどの他フィールド(例: folders)と非プリミティブ フィールド(例: policy)はサポートされていません。

  • (省略可)PAGE_SIZE: 検索結果ページを分割する際のページ数。最大値は 500 です。値が 0 に設定されている場合は、適切なデフォルト値が選択されます。

gcloud コマンドの例を以下に示します。

  • mycompany.com ドメインを含む organizations/123456 内の IAM ポリシー バインディングをすべて検索します。

    gcloud asset search-all-iam-policies \
      --scope='organizations/123456' \
      --query='policy:"domain:mycompany.com"'
    
  • myuser@mycompany.com にオーナー(roles/owner)基本ロールが付与されている organizations/123456 内の IAM ポリシー バインディングをすべて検索します。

    gcloud asset search-all-iam-policies \
      --scope='organizations/123456' \
      --query='policy:(roles/owner myuser@mycompany.com)'
    
  • projects/12345678 に設定されている organizations/123456 内の IAM ポリシー バインディングをすべて検索します。

    gcloud asset search-all-iam-policies \
      --scope='organizations/123456' \
      --query='resource:projects/12345678'
    

api

SearchAllIamPolicies は、プロジェクトで有効な OAuth トークンを使用して呼び出せます。Cloud Shell または gcloud コマンドを使用できるコンソールから SearchAllIamPolicies メソッドを呼び出すには、次のようにします。

  1. プロジェクトの OAuth 同意画面を構成していない場合は、構成する必要があります。OAuth 同意画面には、メールアドレスとプロダクト名が必要です。

    1. プロジェクトの OAuth 同意画面に移動します。
      同意画面を構成
    2. [アプリケーション名] に、アプリケーションの表示名を入力します。
    3. [サポートメール] で、一般公開される連絡先として表示するメールアドレスを選択します。これは、自分のメールアドレスまたは自分が所有する Google グループである必要があります。
    4. 任意の詳細を追加します。
    5. [保存] をクリックします。
  2. プロジェクトの OAuth トークンを作成します。詳しくは、OAuth 2.0 の設定をご覧ください。

    1. OAuth クライアント ID の作成ページに移動します。
      OAuth クライアントの作成
    2. [デスクトップ アプリ] を [アプリケーションの種類] として選択します。
    3. [作成] をクリックします。
  3. client_secret.json ファイルをダウンロードします。

    1. [認証情報] ページに移動します。
    2. 新しい [クライアント ID] の右側にある [JSON をダウンロード] をクリックします。
    3. ご使用のアプリだけがアクセスできる場所に、ファイルを安全に保存します。
  4. 次のコマンドを使用して、JSON ファイルを使用してログインします。

    gcloud auth application-default login --client-id-file=YOUR_JSON_FILE
    

    このコマンドを実行すると、リンクを開くよう求めるメッセージが表示されます。OAuth 同意画面で設定したアプリケーション名がページに表示されるかを確認します。

  5. 次のコマンドを使用して、アカウントの認証トークンを生成します。

    TOKEN=$(gcloud auth application-default print-access-token)
    
  6. curl コマンドを使用して IAM ポリシーを照会できるようになりました。

    PAGE_SIZE=PAGE_SIZE
    PAGE_TOKEN="PAGE_TOKEN"
    SCOPE="SCOPE"
    QUERY="QUERY"
    ASSET_TYPES="ASSET_TYPES,…"
    ORDER_BY="ORDER_BY"
    curl -s -G \
        -H "Authorization: Bearer $TOKEN" \
        -d "page_size=$PAGE_SIZE" \
        -d "page_token=$PAGE_TOKEN" \
        -d "scope=$SCOPE" \
        -d "asset_types=$ASSET_TYPES,…" \
        -d "order_by=$ORDER_BY" \
        --data-urlencode "query=$QUERY" \
        "https://cloudasset.googleapis.com/v1/$SCOPE:searchAllIamPolicies"
    
  • (省略可)SCOPE: スコープはプロジェクト、フォルダ、または組織のいずれかになります。検索は、このスコープ内の IAM ポリシーに限定されます。呼び出し元には、目的のスコープに対する cloudasset.assets.searchAllIamPolicies 権限を含むロールが付与されている必要があります。

    使用できる値は次のとおりです。

    • projects/PROJECT_ID(例: 「projects/foo-bar」)
    • projects/PROJECT_NUMBER(例: 「projects/12345678」)
    • folders/FOLDER_NUMBER(例: 「folders/1234567」)
    • organizations/ORGANIZATION_NUMBER(例:「organizations/123456」)
  • (省略可)QUERY: クエリ ステートメント。 詳細については、クエリの作成方法をご覧ください。指定しなかった場合、または空の場合は、指定された scope 内のすべての IAM ポリシーが検索されます。なお、クエリ文字列は、メンバー、ロール、IAM 条件を含む各 IAM ポリシー バインディングと比較されます。返される IAM ポリシーには、クエリに一致するバインディングのみが含まれます。IAM ポリシーの構造の詳細については、ポリシーについてをご覧ください。

    例:

    • policy:amy@gmail.com: ユーザー「amy@gmail.com」を指定する IAM ポリシー バインディングを検索します。
    • policy:roles/compute.admin: Compute Admin ロールを指定する IAM ポリシー バインディングを検索します。
    • policy:comp*: バインディングに接頭辞として「comp」が付いている単語を含む IAM ポリシー バインディングを検索します。
    • policy.role.permissions:storage.buckets.update:「storage.buckets.update」権限を含む IAM ポリシー バインディングを検索します。なお、目的のロールに対する iam.roles.get 権限を含むロールが呼び出し元に付与されていない場合、そのロールを指定するポリシー バインディングは検索結果から除外されます。
    • policy.role.permissions:upd*: バインディング内の任意の単語の接頭辞として、「upd」を含むロールの権限を指定する IAM ポリシー バインディングを検索します。なお、目的のロールに対する iam.roles.get 権限を含むロールが呼び出し元に付与されていない場合、そのロールを指定するポリシー バインディングは検索結果から除外されます。
    • resource:organizations/123456:「organizations/123456」に設定されている IAM ポリシー バインディングを検索します。
    • resource=//cloudresourcemanager.googleapis.com/projects/myproject:「myproject」という名前のプロジェクトで設定されている IAM ポリシー バインディングを検索します。
    • Important: 検索可能フィールドに「Important」という単語を含む IAM ポリシー バインディングを検索します(含まれている権限を除く)。
    • resource:(instance1 OR instance2) policy:amy: リソース「instance1」または「instance2」に設定されている IAM ポリシー バインディングを検索し、ユーザー「amy」も指定します。
    • roles:roles/compute.admin: Compute Admin ロールを指定する IAM ポリシー バインディングを検索します。
    • memberTypes:user: 「user」メンバータイプを含む IAM ポリシー バインディングを検索します。
  • (省略可)ASSET_TYPES: Identity and Access Management ポリシーが関連付けられているアセットタイプのリスト。空の場合、すべての検索可能なアセットタイプに添付されている Identity and Access Management ポリシーを検索します。正規表現もサポートされています。次に例を示します。

    • "compute.googleapis.com.*" は、"compute.googleapis.com" で始まるアセットタイプに添付される IAM ポリシーのみに限定します。
    • ".*Instance" は、"Instance" で終わるアセットタイプに添付される IAM ポリシーのみに限定します。
    • ".*Instance.*" は、"Instance"を含むアセットタイプに添付される IAM ポリシーのみに限定します。

    サポートされているすべての正規表現の構文については、RE2 をご覧ください。正規表現が、サポートされているアセットタイプと一致しない場合は、INVALID_ARGUMENT エラーが返されます。

  • (省略可)ORDER_BY: 結果の並べ替え順序を指定するフィールドのカンマ区切りリスト。デフォルトの順序は昇順です。降順を適用するには、フィールド名の後に " DESC" を追加します。重複したスペース文字は無視されます(例: "assetType DESC, resource")。レスポンス内の単一のプリミティブ フィールドのみを並べ替えることができます。

    • resource
    • assetType
    • project

    繰り返しフィールドなどの他フィールド(例: folders)と非プリミティブ フィールド(例: policy)はサポートされていません。

  • (省略可)PAGE_SIZE: 検索結果ページを分割する際のページ数。最大値は 2,000 です。値が 0 に設定されている場合は、適切なデフォルト値が選択されます。

  • (省略可)PAGE_TOKEN: このメソッドに対する前の呼び出し結果の次のバッチを表すトークン。page_token は、前の呼び出しのレスポンスの next_page_token の値と同じである必要があります。

クライアント ライブラリと API リファレンス

クエリの作成方法

クエリ言語に関する詳細は、クエリ構文をご覧ください。

さまざまな実用例でのサンプルクエリについては、IAM ポリシーの検索のサンプルをご覧ください。

バインディング情報により IAM ポリシーを照会する

IAM ポリシーを検索するには、以下のクエリ式を使用します。

policy:QUERY

次の形式のメンバータイプまたはロールのみを検索することもできます。

  • 完全一致
    • memberTypes=QUERY
    • roles=QUERY
  • 部分一致
    • memberTypes:QUERY
    • roles:QUERY

メンバー

IAM ポリシー バインディングでは、次の 5 種類のメンバーがサポートされています。

  1. Google アカウント(例: user:user@gmail.com
  2. Google グループ(例: group:devs@googlegroups.com
  3. Cloud Identity および G Suite ドメイン(例: domain:google.com
  4. サービス アカウント(例: serviceAccount:my-other-app@appspot.gserviceaccount.com
  5. 特殊識別子(例: allUsersallAuthenticatedUsers

次の構文を使用して、特定のユーザーに関連するポリシーにクエリを制限できます。

policy:"user:amy@mycompany.com"

なお、user:amy@mycompany.com には特殊文字 : が含まれているため、二重引用符で囲む必要があります。クエリ値が十分に一意である場合、またはメンバータイプに関係なくメールアドレスを検索したい場合は、クエリ文字列の接頭辞 user: または group: を省略できます。たとえば、次のクエリは 1 人のユーザーにのみ一致すると考えられます。

policy:amy@mycompany.com

また、次の構文を使用して、特定のロールに関連するポリシーにクエリを限定できます。

policy:user
memberTypes:user
memberTypes=user

policy:user は異なるメンバータイプと一致する場合があります。例: group:test-user@mycompany.commemberTypes を使用して、検索をメンバータイプに限定します。

例: メンバーによるクエリ
  • ユーザー Amy を指定する IAM ポリシー バインディングをすべて検索します。

    policy:amy
    
  • ドメイン mydomain.com を指定する IAM ポリシー バインディングをすべて検索します。

    policy:mydomain.com
    
  • ユーザー AmyJohn を指定する IAM ポリシー バインディングをすべて検索します。

    policy:(amy john)
    
  • ユーザー Amy または John を指定する IAM ポリシー バインディングをすべて検索します。

    policy:(amy OR john)
    
  • amy@mycompany.com を含む組織内のすべての IAM ポリシー バインディングを検索します。

    policy:amy@mycompany.com
    
  • mycompany.com ドメインを含む組織内の IAM ポリシー バインディングをすべて検索します。

    policy:"domain:mycompany.com"
    
  • mycompany.gserviceaccount.com サービス アカウントにロールを割り当てるすべての IAM ポリシー バインディングを検索します。

    policy:"serviceAccount:mycompany.gserviceaccount.com"
    
  • admins グループにロールを割り当てる IAM ポリシー バインディングをすべて検索します。

    policy:"group:admins"
    
  • すべてのユーザーにロールを割り当てるすべての IAM ポリシー バインディングを検索します。

    memberTypes:allUsers
    
  • すべての認証済みユーザーにロールを割り当てる IAM ポリシー バインディングをすべて検索します。

    memberTypes:allAuthenticatedUsers
    
  • amy@mycompany.com または mycompany.com ドメインにロールを割り当てるすべての IAM ポリシー バインディングを検索します。

    policy:(amy@mycompany.com OR "domain:mycompany.com")
    

ロール

IAM ポリシー バインディングでは、さまざまな種類のロールがサポートされます。すべての IAM ロール名は roles/ 接頭辞で始まります。

  1. 基本ロール: IAM 導入前に存在していた、オーナー(roles/owner)、編集者(roles/editor)、閲覧者(roles/viewer)の 3 つのロール。
  2. 事前定義ロール: IAM では、さまざまなリソースへのアクセス権をきめ細かく付与する、事前定義されたロールを使用できます。すべての事前定義ロールをご覧ください。
  3. カスタムロール: 選択された権限のリストを含むユーザー定義の IAM ロール。

次の構文を使用して、クエリを特定のロールに関連したポリシーに限定できます。

policy:roles/role-name
roles:roles/role-name
roles=roles/role-name

なお、クエリ値が十分に一意である場合は、クエリ文字列で roles/ 接頭辞を省略できます。たとえば、次のクエリはロール roles/cloudasset.owner にのみ一致すると考えられます。

policy:cloudasset.owner
roles:cloudasset.owner

policy:cloudasset.owner が別のロールと一致する可能性があります。たとえば、ロールにメンバー user:cloudasset.owner@mycompany.com が含まれている場合です。roles を使用して、検索をロールに限定します。

例: ロールによるクエリ
  • owner ロールを指定するすべての IAM ポリシー バインディングを検索します。

    policy:roles/owner
    roles:roles/owner
    roles=roles/owner
    
  • amy@mycompany.com にオーナーのロールを割り当てるすべての IAM ポリシー バインディングを検索します。

    policy:(roles/owner amy@mycompany.com)
    
  • メールアドレスに john という単語が含まれるメンバーに compute.admin ロールを割り当てるすべての IAM ポリシー バインディングを検索します。

    policy:(roles/compute.admin john)
    
  • 接頭辞として「swe」または「sde」を持つユーザーに viewer のロールを付与する IAM ポリシー バインディングをすべて検索します。

    policy:(roles/viewer (swe* OR sde*))
    

IAM の条件

IAM ポリシー バインディングに condition オブジェクトを含めると、Google Cloud リソースに対する条件付き、属性ベースのアクセス制御を定義して適用できます。詳しくは、IAM Conditions の概要をご覧ください。

次の構文を使用すると、特定の条件に関連するポリシーにクエリを制限できます。

policy:condition_information
例: 条件によるクエリ
  • 条件を指定するすべての IAM ポリシー バインディングを検索します。そのタイトルまたは説明には「myCondition」という単語が含まれています。

    policy:myCondition
    
  • 式に「request.time」という属性が含まれる条件を指定するすべての IAM ポリシー バインディングを検索します。

    policy:"request.time"
    

含まれる権限により IAM ポリシーを照会する

ポリシー内のロールには、権限のリストを含めることができます。詳細については、IAM 権限のリファレンスをご覧ください。クエリは、特定の権限を含むポリシーに制限できます。クエリ式の形式は次のとおりです。

  • 完全一致: policy.role.permissions=QUERY
  • 部分一致: policy.role.permissions:QUERY
例: 権限によるクエリ
  • compute.instances.create 権限を含む IAM ポリシー バインディングをすべて検索します。

    policy.role.permissions:compute.instances.create
    policy.role.permissions=compute.instances.create
    
  • compute.instances に関連する権限を含む IAM ポリシー バインディングをすべて検索します。

    policy.role.permissions:compute.instances
    
  • 権限 cloudasset.assets.export...cloudasset.assets.exportAssetscloudasset.assets.exportIamPolicyAnalysis など)を含む IAM ポリシー バインディングをすべて検索します。

    policy.role.permissions:cloudasset.assets.export*
    
  • IAM ポリシーを変更する権限を付与する IAM ポリシー バインディングをすべて検索します。

    policy.role.permissions:setIamPolicy
    
  • compute.instances.create 権限と compute.disks.create 権限の両方を含むロールを持つ IAM ポリシー バインディングをすべて検索します。

    policy.role.permissions:(compute.instances.create compute.disks.create)
    
  • compute.instances.create ユーザー amy を指定して、権限を含む IAM ポリシー バインディングをすべて検索します。

    policy.role.permissions:compute.instances.create policy:amy
    policy.role.permissions=compute.instances.create policy:amy
    

関連付けられたリソースにより IAM ポリシーを照会する

検索を実行するときに、リソースに直接設定されたポリシーのみを検索するために、完全なリソース名を指定できます。また、プロジェクト、フォルダ、または組織を指定して、指定したプロジェクト / フォルダ / 組織にあるリソースに設定されたポリシーのみを検索することもできます。クエリ式の形式は次のとおりです。

  • 完全一致
    • resource=QUERY
    • project=QUERY
    • folders=QUERY
    • organization=QUERY
  • 部分一致
    • resource:QUERY
    • project:QUERY
    • folders:QUERY
    • organization:QUERY

例: 関連付けられたリソースによるクエリ

  • 完全なリソース名//cloudresourcemanager.googleapis.com/projects/myproject と完全に一致するリソースで直接設定されている IAM ポリシー バインディングをすべて検索します。

    resource=//cloudresourcemanager.googleapis.com/projects/myproject
    
  • 完全なリソース名myproject という単語を含むリソースで直接設定される IAM ポリシー バインディングをすべて検索します。

    resource:myproject
    
  • 完全なリソース名が、指定した接頭辞 myproj を含むリソースに直接設定されている IAM ポリシー バインディングをすべて検索します。

    resource:myproj*
    
  • 任意のサービスタイプのリソースに直接設定されている IAM ポリシー バインディングをすべて検索します。

    resource:cloudresourcemanager
    
  • myproject または myfolder に設定されている IAM ポリシー バインディングをすべて検索します。

    resource:(myproject OR myfolder)
    
  • cloudresourcemanager リソースに設定されているすべての IAM ポリシー バインディングを検索し、オーナーのロールを gmail.com ユーザーに割り当てます。

    resource:cloudresourcemanager policy:(roles/owner gmail.com)
    
  • 番号が 123project のリソースに設定されている IAM ポリシー バインディングをすべて検索します。

    project:123
    
  • 番号が 123folder に含まれるリソースに設定されているすべての IAM ポリシー バインディングを検索します。

    folders:123
    
  • 番号が 123organization のリソースに設定されている IAM ポリシー バインディングをすべて検索します。

    organization:123
    

フリーテキストにより IAM ポリシーを照会する

フィールドを指定せずに、フリーテキスト クエリだけを使用することもできます。クエリに一致する検索可能なフィールド(ポリシー バインディング フィールドやリソース フィールドなど)が存在する限り、レスポンスはポリシーを返します。

例: フリーテキストによるクエリ

  • メタデータ フィールド(ポリシー バインディングやリソース フィールドなど)に Important という単語が含まれる、scope 内の IAM ポリシー バインディングをすべて検索します。

    Important
    
  • メタデータ フィールド(ポリシー バインディングやリソース フィールドなど)に import という接頭辞がついた単語が含まれる、scope 内の IAM ポリシー バインディングをすべて検索します。

    import*