サービス アカウントの使用の制限

Resource Manager に備わっている制約を組織ポリシーで使用すると、Identity and Access Management(IAM)サービス アカウントの使用を制限できます。

これらの制約の多くは、サービス アカウントおよび他のリソースを特定の方法で作成または構成できるかどうかを明確にします。これらの制約は遡及的ではなく、以前に作成および構成されたサービス アカウントには影響しません。

始める前に

制約を設定するには、組織のポリシーを変更する権限が必要です。たとえば、orgpolicy.policyAdmin ロールには組織のポリシーの制約を設定する権限があります。組織レベルでポリシーを管理する方法の詳細については、制約の使用ページをご覧ください。

マネージド制約

次の制約は、マネージド制約のタイプであり、true または false に設定されます。マネージド制約は、カスタム組織のポリシー プラットフォーム上に構築された事前定義された制約です。

マネージド制約を適用する組織のポリシーを作成する方法については、組織のポリシーでマネージド制約を使用するをご覧ください。

デフォルトのサービス アカウントにオーナーと編集者のロールが付与されないようにする

一部の Google Cloud サービスでは、デフォルトのサービス アカウントが自動的に作成されます。デフォルトのサービス アカウントが作成されると、プロジェクト編集者のロール(roles/editor)がそれに自動的に付与されます。後で、編集者ロールや所有者ロール(roles/owner)などの高度な権限ロールをデフォルトのサービス アカウントに付与することもできます。

編集者とオーナーのロールには、高度な権限が付与された基本ロールが含まれています。デフォルトのサービス アカウントを含む、本番環境のプリンシパルに付与しないでください。

デフォルトのサービス アカウントに編集者ロールまたはオーナーロールが付与されないようにするには、iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts マネージド制約を使用します。この制約により、デフォルトのサービス アカウントに編集者ロールまたはオーナーロールが自動または手動で付与されなくなります。

ブール型制約

次の制約はブール型制約のタイプであり、true または false に設定されます。

デフォルトのサービス アカウントへの自動的なロール付与を無効にする

一部の Google Cloud サービスでは、デフォルトのサービス アカウントが自動的に作成されます。デフォルトのサービス アカウントが作成されると、プロジェクト編集者のロール(roles/editor)がそれに自動的に付与されます。

セキュリティを強化するため、自動的なロール付与を無効にすることを強くおすすめします。iam.automaticIamGrantsForDefaultServiceAccounts ブール型制約を使用して、自動的なロール付与を無効にします。

サービス アカウント作成の無効化

iam.disableServiceAccountCreation ブール制約を使用して、新しいサービス アカウントの作成を無効にすることができます。これにより、デベロッパーがプロジェクトに対して持つその他の権限を制限することなく、サービス アカウントの管理を集中化できます。

この制約をプロジェクトに適用すると、一部の Google Cloud サービスが自動的にデフォルトのサービス アカウントを作成できなくなります。そのため、プロジェクトでサービス アカウントになりすます必要があるワークロードを実行すると、ワークロードが使用できるサービス アカウントがプロジェクトに含まれない場合があります。この問題を解決するには、プロジェクト間でサービス アカウントのなりすましを有効にします。この機能を有効にすると、一元化されたプロジェクトでサービス アカウントを作成し、他のプロジェクトのリソースにサービス アカウントを接続できます。

サービス アカウントの整理の詳細については、サービス アカウントの作成場所をご覧ください。

サービス アカウント キー作成を無効にする

iam.disableServiceAccountKeyCreation ブール型制約を使用して、新しい外部サービス アカウント キーと Cloud Storage HMAC キーの作成を無効にできます。これにより、サービス アカウントに関する、管理されない長期認証情報の使用を制御できます。この制約を設定すると、制約の影響を受けるプロジェクト内でサービス アカウント用のユーザー管理認証情報を作成できなくなります。

サービス アカウント キーのアップロードを無効にする

iam.disableServiceAccountKeyUpload ブール型制約を使用して、サービス アカウントに外部公開鍵をアップロードできます。この制約を設定すると、ユーザーは制約の影響を受けるプロジェクト内のサービス アカウントに公開鍵をアップロードすることはできません。

サービス アカウントの他のプロジェクトのリソースへのアタッチを無効にする

各サービス アカウントはプロジェクト内にあります。iam.disableCrossProjectServiceAccountUsage ブール型制約を使用して、プロジェクト内のサービス アカウントが他のプロジェクトのリソースにアタッチされないようにできます。

プロジェクト間でサービス アカウントを使用できるようにするには、プロジェクト間でのサービス アカウントのなりすましの有効化をご覧ください。

複数プロジェクトにまたがってサービス アカウントが使用されている場合、プロジェクト リーエンの削除を制限する

プロジェクトのサービス アカウントを他のプロジェクトのリソースにアタッチされるようにすると、IAM はプロジェクトの削除を防止するプロジェクト リーエンを追加します。デフォルトでは、プロジェクトに対して resourcemanager.projects.updateLiens 権限を持つユーザーがリーエンを削除できます。

iam.restrictCrossProjectServiceAccountLienRemoval ブール型制約を適用する場合、プリンシパルは、組織の resourcemanager.projects.updateLiens 権限を持つ場合にのみリーエンを削除できます。

いずれかのプロジェクトでプロジェクト間でのサービス アカウントのなりすましが許可されている場合は、この制約を適用することをおすすめします。

Workload Identity クラスタ作成の無効化

iam.disableWorkloadIdentityClusterCreation ブール型制約を使用して、新しい Google Kubernetes Engine クラスタの作成時に Workload Identity 機能を無効にすることを要求できます。組織内のサービス アカウントのアクセス権を厳密に制御する場合は、サービス アカウントの作成とサービス アカウント キーの作成に加えて、Workload Identity を無効にできます。

Workload Identity が有効になっている既存の GKE クラスタは影響を受けず、引き続き通常どおり機能します。

ブール型制約の適用

Console

サービス アカウントの使用を制限する制約を適用する組織のポリシーを設定するには:

  1. Google Cloud コンソールで、[組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

  2. プロジェクト選択ツールで、サービス アカウントの使用を制限する組織を選択します。

  3. このページに記載されているサービス アカウントの使用に関するブール型制約のいずれかをクリックします。

  4. [ポリシーを管理] をクリックします。

  5. [適用対象] で、[親のポリシーをオーバーライドする] を選択します。

  6. [ルールの追加] をクリックします。

  7. [適用] で [オン] を選択します。

  8. ポリシーを適用するには、[ポリシーを設定] をクリックします。

gcloud

ポリシーは Google Cloud CLI を使用して設定できます。

サービス アカウントの使用を制限するには、次のコマンドを実行します。

gcloud resource-manager org-policies enable-enforce \
    --organization 'ORGANIZATION_ID' \
    BOOLEAN_CONSTRAINT

ここで、BOOLEAN_CONSTRAINT は適用するブール型制約です。

適用を無効にするには、同じコマンドをこの

disable-enforce
[コマンド]

組織のポリシーで制約を使用する方法については、制約の使用をご覧ください。

ブール型制約を含むポリシーの例

次のコード スニペットは、iam.disableServiceAccountCreation ブール型制約を適用する組織のポリシーを示しており、これにより、サービス アカウントを作成できなくなります。

name: organizations/012345678901/policies/iam.disableServiceAccountCreation
spec:
  rules:
  - enforce: true

リスト型制約

次の制約はリスト型制約のタイプで、値のリストに設定されます。

OAuth 2.0 アクセス トークンの存続時間を延長する

サービス アカウントに存続時間の短い認証情報を提供する OAuth 2.0 アクセス トークンを作成できます。 デフォルトでは、アクセス トークンの最大存続時間は 1 時間(3,600 秒)です。ただし、最大存続時間を 12 時間まで延長できます。これを行うには、アクセス トークンの存続時間を延長する必要があるサービス アカウントを指定して、constraints/iam.allowServiceAccountCredentialLifetimeExtension リスト型制約が含まれる組織ポリシーに、これらのサービス アカウントを追加します。

サービス アカウント キーの有効期間を制限する

サービス アカウント キーを使用すると、リクエストをサービス アカウントとして認証できます。デフォルトでは、サービス アカウント キーに有効期限はありません。このデフォルトを変更するには、プロジェクト、フォルダまたは組織で新たに作成したすべての鍵に有効期限を設定します。

有効期限を設定するには、constraints/iam.serviceAccountKeyExpiryHours リスト制約を使用して、新しく作成されたキーが何時間有効であるかを指定します。この時間の後に、サービス アカウント キーは期限切れになり、もう使用できなくなります。

このリスト型制約は、次の ALLOW 値を受け入れますが、DENY 値を受け入れません。ベスト プラクティスとして、必要条件を満たす最短の有効期限を使用します。

  • 1h: 1 時間
  • 8h: 8 時間
  • 24h: 24 時間(1 日)
  • 168h: 168 時間(7 日)
  • 336h: 336 時間(14 日)
  • 720h: 720 時間(30 日)
  • 1440h: 1,440 時間(60 日)
  • 2160h: 2,160 時間(90 日)

constraints/iam.serviceAccountKeyExpiryHours 制約を親ポリシーと統合することはできません。この制約を適用するには、親ポリシーを置き換えるか、継承する必要があります。

許可された外部 ID プロバイダを指定する

外部 ID が Google Cloud リソースにアクセスできるようにするWorkload Identity 連携を使用する場合は、許可される外部 ID プロバイダを指定できます。デフォルトでは、すべてのプロバイダが許可されます。制限を設定するには、constraints/iam.workloadIdentityPoolProviders リスト制約を使用して、許可されたプロバイダの URI を次の形式で指定します。

  • Amazon Web Services(AWS): https://sts.amazonaws.com

    許可する AWS アカウントを制限するには、このページで説明する constraints/iam.workloadIdentityPoolAwsAccounts リスト制約を使用してください。

  • Microsoft Azure: https://sts.windows.net/azure-tenant-id

  • OpenID Connect(OIDC)をサポートするその他の ID プロバイダ: ID プロバイダの発行者 URI を使用します。

許可された AWS アカウントを指定する

外部 ID を Google Cloud リソースにアクセスさせる Workload Identity 連携を使用する場合は、リソースへのアクセスが許可される AWS アカウントを指定できます。デフォルトでは、AWS アカウントからのワークロードが Google Cloud リソースにアクセスできます。許可される AWS アカウントを制限するには、constraints/iam.workloadIdentityPoolAwsAccounts リスト制約を使用して、許可されるアカウント ID のリストを指定します。

公開されたサービス アカウント キーを自動的に無効にする

Google Cloud は、特定のサービス アカウント キーが公開されたことを検出することがあります。たとえば、公開リポジトリ内のキーを検出する場合があります。Google Cloud がこれらのキーに対して行う処理を指定するには、iam.serviceAccountKeyExposureResponse リスト制約を使用します。

このリスト型制約は、次の ALLOW 値を受け入れます。DENY 値は受け入れません。

  • DISABLE_KEY: Google Cloud が公開されたキーを検出すると、自動的にそのキーを無効にします。また、Cloud Audit Logs イベントを作成し、公開されたキーに関する通知をプロジェクト オーナーとセキュリティ担当者に送信します。

  • WAIT_FOR_ABUSE: Google Cloud は公開されたキーを予防的に無効にすることはしません。ただし、プラットフォームに悪影響を与えるような使われ方をした場合、Google Cloud は公開されたキーを無効にすることがあります。公開されたキーが無効になっているかどうかにかかわらず、Google Cloud は Cloud Audit Logs イベントを作成し、公開されたキーに関する通知をプロジェクト オーナーとセキュリティの連絡先に送信します。

Google Cloud が公開されたキーを検出するか、公開されたキーを無効にすると、次の処理も行われます。

  • Cloud Audit Logs イベントを生成します。

    • Google Cloud がキーが公開されたことを検出すると、不正行為イベント ログに不正行為イベントが作成されます。

    • Google Cloud がキーを無効にすると、監査ログにはプリンシパル gcp-compromised-key-response@system.gserviceaccount.com による無効化アクションが含まれます。

  • 公開または無効なキーの extendedStatus.value フィールドを設定します。拡張ステータス フィールドには、リークが検出された場所が含まれます。

この制約を DISABLE_KEY に設定することを強くおすすめします。この制約を WAIT_FOR_ABUSE に設定すると、公開されたキーが不正に使用されるリスクが高くなります。

制約を WAIT_FOR_ABUSE に設定する場合は、Cloud Audit Logs イベントに登録し、重要な連絡先でセキュリティの連絡先情報を確認して、セキュリティ担当者が通知にタイムリーに応答するかを確認することをおすすめします。

iam.serviceAccountKeyExposureResponse 制約を親ポリシーと統合することはできません。この制約を適用するには、親ポリシーを置き換える必要があります。

リスト型制約の設定

Console

リスト型制約を含む組織のポリシーを設定するには:

  1. Google Cloud コンソールで、[組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

  2. プロジェクト選択ツールから、組織のポリシーを設定するリソースを選択します。

  3. [組織のポリシー] ページで、リストから制約を選択します。その制約の [ポリシーの詳細] ページが表示されます。

  4. このリソースの組織のポリシーを更新するには、[ポリシーを管理] をクリックします。

  5. [ポリシーの適用] で、適用オプションを選択します。

    • 組織ポリシーを結合してまとめて評価するには、[親と結合する] を選択します。継承とリソース階層の詳細については、階層評価についてをご覧ください。
    • 親リソースから継承されたポリシーをオーバーライドするには、[置換] を選択します。
  6. [ルールの追加] をクリックします。

  7. [ポリシーの値] で [カスタム] を選択します。

  8. [ポリシーの種類] で [許可] を選択します。

  9. [カスタム値] で、リスト型制約の最初の値を入力します。

    1. さらに値を追加する場合は、[値の追加] をクリックして行を作成し、各行に 1 つの値を追加します。
  10. 値の追加が完了したら、[完了] をクリックします。

  11. ポリシーを適用するには、[ポリシーを設定] をクリックします。

gcloud

ポリシーは Google Cloud CLI を使用して設定できます。

gcloud resource-manager org-policies allow \
    CONSTRAINT_NAME \
    VALUE_1 [VALUE_N ...] \
    --organization=ORGANIZATION_ID \

次の値を置き換えます。

  • CONSTRAINT_NAME: リスト制約の名前。例: constraints/iam.allowServiceAccountCredentialLifetimeExtension
  • VALUE_1VALUE_N...: リスト制約の値。

組織のポリシーで制約を使用する方法については、制約の使用をご覧ください。

リスト型制約を含むポリシーの例

次のコード スニペットは、iam.allowServiceAccountCredentialLifetimeExtension リスト型制約を適用する組織のポリシーを示しています。これにより、リストに記載されたサービス アカウントに対する OAuth 2.0 アクセス トークンの最大有効期間が延長されます。

name: organizations/012345678901/policies/iam.allowServiceAccountCredentialLifetimeExtension
spec:
  rules:
  - values:
      allowedValues:
      - SERVICE_ACCOUNT_ADDRESS

エラー メッセージ

サービス アカウント作成の無効化

iam.disableServiceAccountCreation が適用されると、サービス アカウントの作成は次のエラーで失敗します。

FAILED_PRECONDITION: Service account creation is not allowed on this project.

サービス アカウント キー作成の無効化

iam.disableServiceAccountKeyCreation が適用されると、サービス アカウントの作成は次のエラーで失敗します。

FAILED_PRECONDITION: Key creation is not allowed on this service account.

Workload Identity クラスタ作成の無効化

iam.disableWorkloadIdentityClusterCreation が適用されている場合は、Workload Identity を有効にして GKE クラスタを作成すると、次のエラーで失敗します。

FAILED_PRECONDITION: Workload Identity is disabled by the organization
policy constraints/iam.disableWorkloadIdentityClusterCreation. Contact your
administrator to enable this feature.

既知の問題のトラブルシューティング

デフォルトのサービス アカウント

iam.disableServiceAccountCreation 制約を適用すると、そのプロジェクトでサービス アカウントを作成できなくなります。次のように、この制限が有効になると、プロジェクトでデフォルトのサービス アカウントを自動的に作成する Google Cloud サービスにも影響を及ぼします。

  • Compute Engine
  • GKE
  • App Engine
  • Dataflow

iam.disableServiceAccountCreation 制約が適用されている場合、デフォルト サービス アカウントを作成できないため、こうしたサービスを有効にしようとすると失敗します。

この問題を解決するには:

  1. iam.disableServiceAccountCreation 制約を一時的に削除します。
  2. 目的のサービスを有効にします。
  3. その他の目的のサービス アカウントを作成します。
  4. 最後に、制約を再適用します。