Cloud Storage バケットのロールの推奨事項を確認して適用する

このページでは、Cloud Storage バケットで Cloud Storage のロール提案を表示、確認、適用する方法について説明します。ロールの推奨事項により、プリンシパルが実際に必要な権限のみを持つようにすることで、最小権限の原則を徹底できます。

始める前に

必要な IAM のロール

このセクションでは、バケットレベルのロールの推奨事項が機能するために必要な IAM のロールと権限について説明します。

推奨事項の表示

バケットレベルのロールの推奨事項を表示するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールの付与を管理者に依頼してください。

  • ロールの閲覧者(roles/iam.roleViewer
  • IAM 推奨事項の閲覧者(roles/recommender.iamViewer
  • Storage 管理者(roles/storage.admin

ロールの付与の詳細については、アクセスの管理をご覧ください。

これらの事前定義ロールには、バケットレベルのロールの推奨事項を表示するために必要な権限が含まれています。必要な権限を正確に確認するには、[必要な権限] セクションを開いてください。

必要な権限

  • iam.roles.get
  • iam.roles.list
  • recommender.iamPolicyRecommendations.get
  • recommender.iamPolicyRecommendations.list
  • recommender.iamPolicyInsights.get
  • recommender.iamPolicyInsights.list
  • storage.buckets.getIamPolicy

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

推奨事項の適用と拒否

バケットレベルのロールの推奨事項を表示、適用、拒否するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールの付与を管理者に依頼します。

  • ロールの閲覧者(roles/iam.roleViewer
  • IAM Recommender の管理者(roles/recommender.iamAdmin
  • Storage 管理者(roles/storage.admin

ロールの付与の詳細については、アクセスの管理をご覧ください。

これらの事前定義ロールには、バケットレベルのロールの推奨事項を表示、適用、拒否するために必要な権限が含まれています。必要な権限を正確に確認するには、[必要な権限] セクションを開いてください。

必要な権限

  • iam.roles.get
  • iam.roles.list
  • recommender.iamPolicyRecommendations.get
  • recommender.iamPolicyRecommendations.list
  • recommender.iamPolicyInsights.get
  • recommender.iamPolicyInsights.list
  • recommender.iamPolicyLateralMovementInsights.get
  • recommender.iamPolicyLateralMovementInsights.list
  • recommender.iamPolicyRecommendations.update
  • storage.buckets.getIamPolicy
  • storage.buckets.setIamPolicy

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

推奨事項の確認と適用

Google Cloud CLI と Recommender API を使用して、バケットレベルのロールの推奨事項を確認して適用できます。

gcloud

推奨事項を確認する:

バケットレベルの推奨事項を一覧表示するには、Cloud Storage バケット推奨事項のみをフィルタリングして、gcloud recommender recommendations list コマンドを実行します。

gcloud recommender recommendations list \
    --location=LOCATION \
    --recommender=google.iam.policy.Recommender \
    --project=PROJECT_ID \
    --format=FORMAT \
    --filter="recommenderSubtype:REMOVE_ROLE_STORAGE_BUCKET OR recommenderSubtype:REPLACE_ROLE_STORAGE_BUCKET"

次の値を置き換えます。

  • LOCATION: Cloud Storage バケットが配置されているリージョン(usus-central1 など)。
  • PROJECT_ID: Cloud Storage バケットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • FORMAT: レスポンスの形式。json または yaml を使用します。

レスポンスは次の例のようになります。この例では、すべての認証済みユーザー(allAuthenticatedUsers)に、バケット mybucket に対するストレージのレガシー オブジェクト読み取りのロール(roles/storage.legacyObjectReader)が付与されています。ただし、この役割は過去 90 日間使用されていません。そのため、ロールの推奨事項により、次のロールは取り消しが提案されます。

[
  {
    "associatedInsights": [
      {
        "insight": "projects/123456789012/locations/us/insightTypes/google.iam.policy.Insight/insights/7849add9-73c0-419e-b169-42b3671173fb"
      }
    ],
    "associatedResourceNames": [
      "//storage.googleapis.com/my-bucket"
    ],
    "content": {
      "operationGroups": [
        {
          "operations": [
            {
              "action": "remove",
              "path": "/iamPolicy/bindings/*/members/*",
              "pathFilters": {
                "/iamPolicy/bindings/*/condition/expression": "",
                "/iamPolicy/bindings/*/members/*": "allAuthenticatedUsers",
                "/iamPolicy/bindings/*/role": "roles/storage.legacyObjectReader"
              },
              "resource": "//storage.googleapis.com/my-bucket",
              "resourceType": "storage.googleapis.com/Bucket"
            }
          ]
        }
      ]
    },
    "description": "This role has not been used during the observation window.",
    "etag": "\"7caf4103d7669e12\"",
    "lastRefreshTime": "2022-05-24T07:00:00Z",
    "name": "projects/123456789012/locations/us/recommenders/google.iam.policy.Recommender/recommendations/fbc885b7-f0a8-47e6-90fe-6141aa2c4257",
    "primaryImpact": {
      "category": "SECURITY",
      "securityProjection": {
        "details": {
          "revokedIamPermissionsCount": 1
        }
      }
    },
    "priority": "P1",
    "recommenderSubtype": "REMOVE_ROLE_STORAGE_BUCKET",
    "stateInfo": {
      "state": "ACTIVE"
    }
  }
]

推奨事項を慎重に確認し、それによってプリンシパルの Google Cloud リソースへのアクセスがどのように変化するかを見極めてください。gcloud CLI から推奨事項を確認する方法については、このページの推奨事項を確認するをご覧ください。

推奨事項を適用するには:

  1. gcloud recommender recommendations mark-claimed コマンドを使用して、推奨事項の状態を CLAIMED, に変更します。これにより、推奨事項を適用している間は変更できなくなります。

    gcloud recommender recommendations mark-claimed \
        RECOMMENDATION_ID \
        --location=LOCATION \
        --recommender=google.iam.policy.Recommender \
        --project=PROJECT_ID \
        --format=FORMAT \
        --etag=ETAG \
        --state-metadata=STATE_METADATA
    

    次の値を置き換えてください。

    • RECOMMENDATION_ID: レコメンデーションの一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、推奨事項 ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • LOCATION: Cloud Storage バケットが配置されているリージョン(usus-central1 など)。
    • PROJECT_ID: Cloud Storage バケットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • FORMAT: レスポンスの形式。json または yaml を使用してください。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。この値には引用符を含めることができます。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータを含むカンマで区切られた Key-Value ペア。たとえば、--state-metadata=reviewedBy=alice,priority=high です。メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    コマンドが成功した場合、レスポンスは次の例のように CLAIMED ステータスにレコメンデーションを表示します。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "priority": "P1",
    "recommenderSubtype": "REMOVE_ROLE_STORAGE_BUCKET",
    "stateInfo": {
      "state": "CLAIMED"
    }
    ...
    
  2. バケットの許可ポリシーを取得して、推奨事項が反映されるように許可ポリシーを変更して設定します。

  3. レコメンデーションを適用できた場合はレコメンデーションのステータスを SUCCEEDED に更新し、レコメンデーションを適用できない場合は FAILED に更新します。

    gcloud recommender recommendations COMMAND \
        RECOMMENDATION_ID \
        --location=LOCATION \
        --recommender=google.iam.policy.Recommender \
        --project=PROJECT_ID \
        --format=FORMAT \
        --etag=ETAG \
        --state-metadata=STATE_METADATA
    

    次の値を置き換えてください。

    • COMMAND: レコメンデーションを適用できた場合は mark-succeeded を使用し、レコメンデーションを適用できなかった場合は mark-failed を使用します。
    • RECOMMENDATION_ID: レコメンデーションの一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、推奨事項 ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • LOCATION: Cloud Storage バケットが配置されているリージョン(usus-central1 など)。
    • PROJECT_ID: Cloud Storage バケットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • FORMAT: レスポンスの形式。json または yaml を使用してください。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。この値には引用符を含めることができます。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータを含むカンマで区切られた Key-Value ペア。たとえば、--state-metadata=reviewedBy=alice,priority=high です。メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    たとえば、レコメンデーションを「完了」に設定した場合、レスポンスにより SUCCEEDED ステータスにレコメンデーションが表示されます。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "priority": "P1",
    "recommenderSubtype": "REMOVE_ROLE_STORAGE_BUCKET",
    "stateInfo": {
      "state": "SUCCEEDED"
    }
    ...
    

REST

この手順は、ユーザーが認証済みで、GOOGLE_APPLICATION_CREDENTIALS 環境変数が設定されていることを前提としています。

推奨事項を確認する:

Cloud Storage バケットで利用可能なすべての推奨事項を一覧表示するには、Recommender API の recommendations.list メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Cloud Storage バケットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • LOCATION: Cloud Storage バケットが配置されているリージョン(usus-central1 など)。
  • PAGE_SIZE: 省略可。このリクエストから返される結果の最大数。指定しなかった場合、サーバーが結果数を決定します。推奨事項の数がページサイズより大きい場合、レスポンスにページ設定トークンが含まれます。このトークンを使用して、結果の次のページを取得できます。
  • PAGE_TOKEN: 省略可。以前のレスポンスでこのメソッドから返されたページ設定トークン。指定すると、前のリクエストが終了した時点から推奨事項のリストが開始します。

HTTP メソッドと URL:

GET https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/recommenders/google.iam.policy.Recommender/recommendations?filter=recommenderSubtype%20%3D%20REMOVE_ROLE_STORAGE_BUCKET%20OR%20recommenderSubtype%20%3D%20REPLACE_ROLE_STORAGE_BUCKET&pageSize=PAGE_SIZE&pageToken=PAGE_TOKEN

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスは次の例のようになります。この例では、すべての認証済みユーザー(allAuthenticatedUsers)が、バケット mybucket に対するストレージのレガシー オブジェクト読み取りのロール(roles/storage.legacyObjectReader)を持っています。ただし、この役割は過去 90 日間使用されていません。そのため、ロールの推奨事項により、次のロールは取り消しが提案されます。

{
  "recommendations": [
    "name": "projects/123456789012/locations/us/recommenders/google.iam.policy.Recommender/recommendations/fbc885b7-f0a8-47e6-90fe-6141aa2c4257",
    "description": "This role has not been used during the observation window.",
    "lastRefreshTime": "2022-05-24T07:00:00Z",
    "primaryImpact": {
      "category": "SECURITY",
      "securityProjection": {
        "details": {
          "revokedIamPermissionsCount": 1
        }
      }
    },
    "content": {
      "operationGroups": [
        {
          "operations": [
            {
              "action": "remove",
              "resourceType": "storage.googleapis.com/Bucket",
              "resource": "//storage.googleapis.com/my-bucket",
              "path": "/iamPolicy/bindings/*/members/*",
              "pathFilters": {
                "/iamPolicy/bindings/*/condition/expression": "",
                "/iamPolicy/bindings/*/members/*": "allAuthenticatedUsers",
                "/iamPolicy/bindings/*/role": "roles/storage.legacyObjectReader"
              }
            }
          ]
        }
      ]
    },
    "stateInfo": {
      "state": "ACTIVE"
    },
    "etag": "\"7caf4103d7669e12\"",
    "recommenderSubtype": "REMOVE_ROLE_STORAGE_BUCKET",
    "associatedInsights": [
      {
        "insight": "projects/123456789012/locations/us/insightTypes/google.iam.policy.Insight/insights/7849add9-73c0-419e-b169-42b3671173fb"
      }
    ],
    "priority": "P1"
  ]
}

推奨事項を慎重に確認し、それによってプリンシパルの Google Cloud リソースへのアクセスがどのように変化するかを見極めてください。REST API から推奨事項を確認する方法については、このページの推奨事項を確認するをご覧ください。

推奨事項を適用するには:

  1. レコメンデーションを CLAIMED とマークします。

    推奨事項を CLAIMED としてマークし、適用中に推奨事項を変更できないようにするには、Recommender API の recommendations.markClaimed メソッドを使用します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Cloud Storage バケットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • LOCATION: Cloud Storage バケットが配置されているリージョン(usus-central1 など)。
    • RECOMMENDATION_ID: 推奨事項の一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、レコメンデーション ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。バックスラッシュを使用して引用符をエスケープします(例: "\"df7308cca9719dcc\"")。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータと Key-Value ペアを含むオブジェクト。例: {"reviewedBy": "alice", "priority": "high"}メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    HTTP メソッドと URL:

    POST https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/recommenders/google.iam.policy.Recommender/recommendations/RECOMMENDATION_ID:markClaimed

    JSON 本文のリクエスト:

    {
      "etag": "ETAG",
      "stateMetadata": {
        "STATE_METADATA"
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    レスポンスでは、次の例のように CLAIMED ステータスにレコメンデーションが表示されます。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "stateInfo": {
      "state": "CLAIMED"
    },
    "etag": "\"7caf4103d7669e12\"",
    "recommenderSubtype": "REMOVE_ROLE_STORAGE_BUCKET",
    ...
    

  2. プロジェクトの許可ポリシーを取得して、推奨事項が反映されるように許可ポリシーを変更します。

  3. レコメンデーションを適用できた場合はレコメンデーションのステータスを SUCCEEDED に更新し、レコメンデーションを適用できない場合は FAILED に更新します。

    SUCCEEDED

    推奨事項を SUCCEEDED としてマークして、適用可能であることを示すには、Recommender API の recommendations.markSucceeded メソッドを使用します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Cloud Storage バケットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • LOCATION: Cloud Storage バケットが配置されているリージョン(usus-central1 など)。
    • RECOMMENDATION_ID: 推奨事項の一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、レコメンデーション ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。バックスラッシュを使用して引用符をエスケープします(例: "\"df7308cca9719dcc\"")。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータと Key-Value ペアを含むオブジェクト。例: {"reviewedBy": "alice", "priority": "high"}メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    HTTP メソッドと URL:

    POST https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/recommenders/google.iam.policy.Recommender/recommendations/RECOMMENDATION_ID:markSucceeded

    JSON 本文のリクエスト:

    {
      "etag": "ETAG",
      "stateMetadata": {
        "STATE_METADATA"
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    レスポンスでは、次の例のように SUCCEEDED ステータスにレコメンデーションが表示されます。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "stateInfo": {
      "state": "SUCCEEDED"
    },
    "etag": "\"7caf4103d7669e12\"",
    "recommenderSubtype": "REMOVE_ROLE_STORAGE_BUCKET",
    ...
    

    FAILED

    推奨事項を適用できなかったことを示す FAILED とマークするには、Recommender API の recommendations.markFailed メソッドを使用します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Cloud Storage バケットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • LOCATION: Cloud Storage バケットが配置されているリージョン(usus-central1 など)。
    • RECOMMENDATION_ID: 推奨事項の一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、レコメンデーション ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。バックスラッシュを使用して引用符をエスケープします(例: "\"df7308cca9719dcc\"")。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータと Key-Value ペアを含むオブジェクト。例: {"reviewedBy": "alice", "priority": "high"}メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    HTTP メソッドと URL:

    POST https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/recommenders/google.iam.policy.Recommender/recommendations/RECOMMENDATION_ID:markFailed

    JSON 本文のリクエスト:

    {
      "etag": "ETAG",
      "stateMetadata": {
        "STATE_METADATA"
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    レスポンスでは、次の例のように FAILED ステータスにレコメンデーションが表示されます。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "stateInfo": {
      "state": "FAILED"
    },
    "etag": "\"7caf4103d7669e12\"",
    "recommenderSubtype": "REMOVE_ROLE_STORAGE_BUCKET",
    ...
    

推奨事項について

各推奨事項には、それが作られた理由の理解に役立つ情報が含まれます。

推奨事項のフィールドの詳細については、Recommendation リファレンスをご覧ください。

この推奨事項のベースとなる権限の使用状況を確認するには、推奨事項に関連付けられたポリシー分析情報を表示します。これらの分析情報は associatedInsights フィールドにリストされています。推奨事項に関連付けられたポリシー分析情報を表示するには、次のようにします。

  1. 関連付けられた分析情報の ID をコピーします。ID は、insight フィールドの insights/ より後の部分です。たとえば、insight フィールドが projects/123456789012/locations/us/insightTypes/google.iam.policy.Insight/insights/7849add9-73c0-419e-b169-42b3671173fb の場合、分析情報 ID は 7849add9-73c0-419e-b169-42b3671173fb です。
  2. コピーした分析情報 ID を使用して、手順どおりに操作を行い、ポリシーの分析情報を取得します。

次のステップ