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

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

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

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

次の制約はboolean constraintのタイプであり、true または false に設定されます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

適用を無効にするには、

disable-enforce
コマンドで同じコマンドを発行します。

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

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

See more code actions.
name: organizations/012345678901/policies/iam.disableServiceAccountCreation
spec:
  rules:
  - enforce: true

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

サービス アカウントに存続時間の短い認証情報を提供する 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 が 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 を使用します。

外部 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 イベントを作成し、公開されたキーに関する通知をプロジェクト オーナーとセキュリティ担当者に送信します。

Cloud Audit Logs イベントは、Google Cloud が漏洩したキーを検出するか、キーを無効にしたときに作成されます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ポリシーは 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 アクセス トークンの最大有効期間が延長されます。

See more code actions.
name: organizations/012345678901/policies/iam.allowServiceAccountCredentialLifetimeExtension
spec:
  rules:
  - values:
      allowedValues:
      - SERVICE_ACCOUNT_ADDRESS

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

See more code actions.
FAILED_PRECONDITION: Service account creation is not allowed on this project.

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

See more code actions.
FAILED_PRECONDITION: Key creation is not allowed on this service account.

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

See more code actions.
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. 最後に、制約を再適用します。