未使用のサービス アカウントを見つける

このページでは、サービス アカウントの分析情報を管理する方法について説明します。この分析情報は、プロジェクト内で過去 90 日間に認証されていないサービス アカウントの分析結果です。このような未使用のサービス アカウントとキーは、セキュリティ リスクとなるため、無効にするか削除することをおすすめします。

サービス アカウントにバインドされた API キーで認証されたリクエストは、サービス アカウントの使用状況の指標に記録されません。そのため、これらのサービス アカウントが未使用として報告されることがあります。

Google Cloud以外の Google API を使用した認証アクティビティ(Google Workspace API への権限のドメイン全体の委任など)は、アクティビティ アナライザサービス アカウントの分析情報では追跡されません。これらの認証アクティビティを追跡するには、Cloud Monitoring のサービス アカウントの使用状況の指標を使用します。

サービス アカウントを無効にするか削除する前に、サービス アカウントの分析情報と Cloud Monitoring のサービス アカウントの使用状況指標を相互参照することをおすすめします。この方法では、 Google Cloudの外部で Google API で使用されているサービス アカウントを削除できません。

始める前に

  • Recommender API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。詳しくは、ロールを付与する方法をご覧ください。

    API の有効化

  • (省略可)Recommender の分析情報をご覧ください。

必要なロール

サービス アカウントの分析情報を管理するために必要な権限を取得するには、分析情報を管理するプロジェクトに対して次の IAM ロールを付与するよう管理者に依頼します。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

これらの事前定義ロールには、サービス アカウントの分析情報を管理するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

サービス アカウントの分析情報を管理するには、次の権限が必要です。

  • サービス アカウントの分析情報を表示するには:
    • recommender.iamServiceAccountinsights.get
    • recommender.iamServiceAccountinsights.list
  • サービス アカウントの分析情報を変更するには: recommender.iamServiceAccountinsights.update

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

サービス アカウントの分析情報を一覧表示する

プロジェクトのすべてのサービス アカウントの分析情報を一覧表示するには、次のいずれかの方法を使用します。

gcloud

gcloud recommender insights list コマンドを使用して、プロジェクトのすべてのサービス アカウントの分析情報を表示します。

コマンドを実行する前に、次の値を置き換えます。

  • PROJECT_ID: 分析情報を一覧表示するプロジェクトの ID。
gcloud recommender insights list --insight-type=google.iam.serviceAccount.Insight \
    --project=PROJECT_ID \
    --location=global

出力には、プロジェクトのすべてのサービス アカウントの分析情報が一覧表示されます。次に例を示します。

INSIGHT_ID                            CATEGORY  INSIGHT_STATE  LAST_REFRESH_TIME     SEVERITY  INSIGHT_SUBTYPE        DESCRIPTION
446303ba-2a14-49cc-b9fa-e2d2499d4f82  SECURITY  ACTIVE         2022-05-24T07:00:00Z  LOW       SERVICE_ACCOUNT_USAGE  Service account sa-1@my-project.iam.gserviceaccount.com was inactive.
4cfd82c3-7320-4dc6-9b67-ca0756bbd54c  SECURITY  ACTIVE         2022-05-24T07:00:00Z  LOW       SERVICE_ACCOUNT_USAGE  Service account sa-2@my-project.iam.gserviceaccount.com was inactive.
a627bed7-c8f4-4611-89c9-2a9a8618ca1b  SECURITY  ACTIVE         2022-05-24T07:00:00Z  LOW       SERVICE_ACCOUNT_USAGE  Service account sa-3@my-project.iam.gserviceaccount.com was inactive.
a922dd59-df0a-422d-a2a4-096195e1dae5  SECURITY  ACTIVE         2022-05-24T07:00:00Z  LOW       SERVICE_ACCOUNT_USAGE  Service account sa-4@my-project.iam.gserviceaccount.com was inactive.

REST

Recommender API の insights.list メソッドを使用すると、プロジェクト内のすべてのサービス アカウントの分析情報が一覧表示されます。

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

  • PROJECT_ID: 分析情報を一覧表示するプロジェクトの ID。

HTTP メソッドと URL:

GET https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights

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

レスポンスには、プロジェクト内のすべてのサービス アカウントの分析情報が含まれます。次に例を示します。

{
  "insights": [
    {
      "name": "projects/123456789012/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/446303ba-2a14-49cc-b9fa-e2d2499d4f82",
      "description": "Service account sa-1@my-project.iam.gserviceaccount.com was inactive.",
      "content": {
        "serviceAccountId": "103185812403937829397",
        "email": "sa-1@my-project.iam.gserviceaccount.com",
        "lastAuthenticatedTime": "2020-09-11T07:00:00Z"
      },
      "lastRefreshTime": "2022-05-24T07:00:00Z",
      "observationPeriod": "19008000s",
      "stateInfo": {
        "state": "ACTIVE"
      },
      "category": "SECURITY",
      "targetResources": [
        "//cloudresourcemanager.googleapis.com/projects/123456789012"
      ],
      "insightSubtype": "SERVICE_ACCOUNT_USAGE",
      "etag": "\"9d797dd04263c855\"",
      "severity": "LOW"
    },
    {
      "name": "projects/123456789012/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/4cfd82c3-7320-4dc6-9b67-ca0756bbd54c",
      "description": "Service account sa-2@my-project.iam.gserviceaccount.com was inactive.",
      "content": {
        "serviceAccountId": "105496400997178042131",
        "email": "sa-2@my-project.iam.gserviceaccount.com"
      },
      "lastRefreshTime": "2022-05-24T07:00:00Z",
      "observationPeriod": "16070400s",
      "stateInfo": {
        "state": "ACTIVE"
      },
      "category": "SECURITY",
      "targetResources": [
        "//cloudresourcemanager.googleapis.com/projects/123456789012"
      ],
      "insightSubtype": "SERVICE_ACCOUNT_USAGE",
      "etag": "\"783a32b635d79a4e\"",
      "severity": "LOW"
    }
  ]
}

分析情報のコンポーネントの詳細については、このページのサービス アカウントの分析情報を確認するをご覧ください。

1 つのサービス アカウントの分析情報を取得する

1 つの分析情報に関する詳細(分析情報の説明、ステータス、推奨事項など)を取得するには、次のいずれかの方法を使用します。

gcloud

分析情報の ID を指定して gcloud recommender insights describe コマンドを使用すると、1 つの分析結果に関する情報を表示できます。

  • INSIGHT_ID: 表示する分析情報の ID。ID を確認するには、プロジェクトの分析情報の一覧を表示します。
  • PROJECT_ID: 分析情報を管理するプロジェクトの ID。
gcloud recommender insights describe INSIGHT_ID \
    --insight-type=google.iam.serviceAccount.Insight \
    --project=PROJECT_ID \
    --location=global

出力に分析情報の詳細が表示されます。たとえば、次の分析情報は、サービス アカウント sa-1@my-project.iam.gserviceaccount.com が 2020 年 10 月 11 日以降認証されていないことを示しています。

category: SECURITY
content:
  email: sa-1@my-project.iam.gserviceaccount.com
  lastAuthenticatedTime: '2020-10-11T07:00:00Z'
  serviceAccountId: '103185812403937829397'
description: Service account sa-1@my-project.iam.gserviceaccount.com
  was inactive.
etag: '"9d797dd04263c855"'
insightSubtype: SERVICE_ACCOUNT_USAGE
lastRefreshTime: '2022-05-24T07:00:00Z'
name: projects/123456789012/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/446303ba-2a14-49cc-b9fa-e2d2499d4f82
observationPeriod: 19008000s
severity: LOW
stateInfo:
  state: ACTIVE
targetResources:
- //cloudresourcemanager.googleapis.com/projects/123456789012

分析情報のコンポーネントの詳細については、このページのサービス アカウントの分析情報を確認するをご覧ください。

REST

1 つの分析情報を取得するには、Recommender API の insights.get メソッドを使用します。

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

  • PROJECT_ID: 分析情報を管理するプロジェクトの ID。
  • INSIGHT_ID: 表示する分析情報の ID。分析情報 ID が不明な場合は、プロジェクト内で分析情報を一覧表示することにより確認できます。分析情報の name フィールドの insights/ より後の部分が分析情報の ID です。

HTTP メソッドと URL:

GET https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/INSIGHT_ID

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

レスポンスに分析情報が含まれます。たとえば、次の分析情報は、サービス アカウント sa-1@my-project.iam.gserviceaccount.com が 2020 年 10 月 11 日以降認証されていないことを示しています。

{
  "name": "projects/123456789012/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/446303ba-2a14-49cc-b9fa-e2d2499d4f82",
  "description": "Service account sa-1@my-project.iam.gserviceaccount.com was inactive.",
  "content": {
    "serviceAccountId": "103185812403937829397",
    "email": "sa-1@my-project.iam.gserviceaccount.com",
    "lastAuthenticatedTime": "2020-09-11T07:00:00Z"
  },
  "lastRefreshTime": "2022-05-24T07:00:00Z",
  "observationPeriod": "19008000s",
  "stateInfo": {
    "state": "ACTIVE"
  },
  "category": "SECURITY",
  "targetResources": [
    "//cloudresourcemanager.googleapis.com/projects/123456789012"
  ],
  "insightSubtype": "SERVICE_ACCOUNT_USAGE",
  "etag": "\"9d797dd04263c855\"",
  "severity": "LOW"
}

分析情報のコンポーネントの詳細については、このページのサービス アカウントの分析情報を確認するをご覧ください。

サービス アカウントの分析情報を確認する

1 回のインサイトを取得したら、その内容を確認して、ハイライトされたリソース使用量のパターンを確認できます。

分析情報のコンテンツはサブタイプによって決まります。サービス アカウントの分析情報(google.iam.serviceAccount.Insight)の分析情報には、SERVICE_ACCOUNT_USAGE サブタイプがあります。

SERVICE_ACCOUNT_USAGE の分析情報は次のコンポーネントから構成されます(順番は異なる場合があります)。

  • associatedRecommendations: 分析情報に関連付けられている推奨事項の ID。分析情報に関連付けられた推奨事項がない場合、このフィールドは空白になります。
  • category: IAM 分析情報のカテゴリは常に SECURITY になります。
  • content: サービス アカウントが最後に認証された時間を報告します。このフィールドには次のコンポーネントが含まれます。

    • email: サービス アカウントのメールアドレス。
    • lastAuthenticatedTime: サービス アカウントが最後に認証された時刻。サービス アカウントに記録された認証がない場合、このフィールドは含まれません。
    • serviceAccountId: サービス アカウントの一意の数値 ID。
  • description: 人が読める形式の分析情報の概要。
  • etag: 分析情報の現在の状態の一意の ID。分析情報が変わるたびに、新しい etag 値が割り当てられます。

    分析情報の状態を変更するには、既存の分析情報の etag を指定する必要があります。etag を使用すると、最後に取得した後に分析情報が変更されていない場合にのみ、オペレーションを実行できます。

  • insightSubtype: 分析情報のサブタイプ。
  • lastRefreshTime: 分析情報が最後に更新された日付。分析情報の生成に使用されたデータの鮮度を表します。
  • name: 分析情報の名前。次の形式になります。

    projects/PROJECT_ID/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/INSIGHT_ID

    プレースホルダの値は次のとおりです。

    • PROJECT_ID: 分析情報が生成されたプロジェクトの ID。
    • INSIGHT_ID: 分析情報の一意の ID。
  • observationPeriod: 分析情報の期間。分析情報の生成に使用されるソースデータは lastRefreshTime で終了し、lastRefreshTime から observationPeriod を引いた時間に開始します。
  • stateInfo: 分析情報が提案後、多くの状態遷移が発生します。

    • ACTIVE: 分析情報が生成されていますが、アクションが実行されていません。あるいは、分析情報の状態を更新せずに処理が行われています。アクティブな分析情報は、基になるデータが変更されると更新されます。
    • ACCEPTED: 分析情報に基づいて一部の操作が行われています。関連する推奨事項が CLAIMEDSUCCEEDEDFAILED のいずれかにマークされるか、もしくは分析情報が直接承認されると、分析情報は承認された状態になります。分析情報が ACCEPTED 状態の場合、分析情報のコンテンツは変更できません。承認された分析情報は、承認後 90 日間保持されます。
  • targetResources: 分析情報の対象となるプロジェクトの完全なリソース名。例: //cloudresourcemanager.googleapis.com/projects/123456789012

サービス アカウントの分析情報を ACCEPTED とマークする

アクティブな分析情報に基づいてアクションを実行する場合は、その分析情報を ACCEPTED としてマークします。ACCEPTED 状態は、この分析情報に基づいてアクションを実行したことを Recommender API に通知します。この情報は推奨事項の改善に役立ちます。

承諾された分析情報は、ACCEPTED とマークされてから 90 日間保持されます。

gcloud

分析情報 ID を指定して gcloud recommender insights mark-accepted コマンドを使用し、分析情報を ACCEPTED とマークします。

  • INSIGHT_ID: 表示する分析情報の ID。ID を確認するには、プロジェクトの分析情報の一覧を表示します。
  • PROJECT_ID: 分析情報を管理するプロジェクトの ID。
  • ETAG: 分析情報のバージョンの ID。etag を取得する方法は次のとおりです。

    1. gcloud recommender insights describe コマンドで分析情報を取得します。
    2. 出力から etag 値を見つけてコピーします(引用符も含む)。例: "d3cdec23cc712bd0"
gcloud recommender insights mark-accepted INSIGHT_ID \
    --insight-type=google.iam.serviceAccount.Insight \
    --project=PROJECT_ID \
    --location=global \
    --etag=ETAG

出力に、ACCEPTED 状態の分析情報が表示されます。

category: SECURITY
content:
  email: sa-1@my-project.iam.gserviceaccount.com
  lastAuthenticatedTime: '2020-10-11T07:00:00Z'
  serviceAccountId: '103185812403937829397'
description: Service account sa-1@my-project.iam.gserviceaccount.com
  was inactive.
etag: '"39c4199dcec92848"'
insightSubtype: SERVICE_ACCOUNT_USAGE
lastRefreshTime: '2022-05-24T07:00:00Z'
name: projects/123456789012/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/446303ba-2a14-49cc-b9fa-e2d2499d4f82
observationPeriod: 19008000s
severity: LOW
stateInfo:
  state: ACCEPTED
targetResources:
- //cloudresourcemanager.googleapis.com/projects/123456789012

分析情報の状態の詳細については、このページのサービス アカウントの分析情報を確認するをご覧ください。

REST

Recommender API の insights.markAccepted メソッドを使用して、分析情報を ACCEPTED としてマークします。

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

  • PROJECT_ID: 分析情報を管理するプロジェクトの ID。
  • INSIGHT_ID: 表示する分析情報の ID。分析情報 ID が不明な場合は、プロジェクト内で分析情報を一覧表示することにより確認できます。分析情報の name フィールドの insights/ より後の部分が分析情報の ID です。
  • ETAG: 分析情報のバージョンの ID。etag を取得する方法は次のとおりです。
    1. insights.get メソッドで分析情報を取得します。
    2. レスポンスから etag 値を見つけてコピーします。

HTTP メソッドと URL:

POST https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/INSIGHT_ID:markAccepted

リクエストの本文(JSON):

{
  "etag": "ETAG"
}

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

レスポンスには、状態が ACCEPTED の分析情報が含まれます。

{
  "name": "projects/123456789012/locations/global/insightTypes/google.iam.serviceAccount.Insight/insights/446303ba-2a14-49cc-b9fa-e2d2499d4f82",
  "description": "Service account sa-1@my-project.iam.gserviceaccount.com was inactive.",
  "content": {
    "serviceAccountId": "103185812403937829397",
    "email": "sa-1@my-project.iam.gserviceaccount.com",
    "lastAuthenticatedTime": "2020-10-11T07:00:00Z"
  },
  "lastRefreshTime": "2022-05-24T07:00:00Z",
  "observationPeriod": "19008000s",
  "stateInfo": {
    "state": "ACCEPTED"
    },
  "category": "SECURITY",
  "targetResources": [
    "//cloudresourcemanager.googleapis.com/projects/123456789012"
  ],
  "insightSubtype": "SERVICE_ACCOUNT_USAGE",
  "etag": "\"39c4199dcec92848\"",
  "severity": "LOW"
}

分析情報の状態の詳細については、このページのサービス アカウントの分析情報を確認するをご覧ください。

次のステップ