Understanding service accounts

6月 8, 2021
admin

Background

サービス アカウントは、Google API でデータへのアクセスを認証および許可する必要がある人間以外のユーザーを表すことを目的とした、Google アカウントの特殊なタイプです。

  • 仮想マシン (VM) 上でワークロードを実行する。
  • オンプレミスのワークステーションまたはデータ センターで、Google API を呼び出すワークロードを実行する。
  • 人間のユーザーのライフサイクルに関連しないワークロードを実行する。

Google API を呼び出すために、アプリケーションがサービス アカウントの ID を仮定して、ユーザーが直接関与しないようにすること。

サービス アカウントの管理

サービス アカウントが必要だと判断したら、サービス アカウントの使用方法を理解するために、次の質問をすることができます:

  • サービス アカウントはどのリソースにアクセスできますか?
  • サービス アカウントに必要な権限は何か。
  • サービス アカウントの身元を仮定するコードは、Google Cloud またはオンプレミスのどこに実行されるか。

    Service account flowchart

    サービス アカウントはソースとしてもアイデンティティとしても考えることができることに注意してください。

    サービス アカウントを ID として考える場合、aservice account にロールを付与して、リソース (プロジェクトなど) にアクセスできるようにできます。

    サービス アカウントをリソースとして考える場合、そのサービス アカウントにアクセスまたは管理するロールを他のユーザーに対して付与することができます。 たとえば、Compute Engine上で動作するアプリケーションがあり、そのアプリケーションがCloud Storageのオブジェクトの作成にのみアクセスできるようにしたい場合。 次の図は、この例を示しています。

    Service account flowchart

    Learn aboutGranting roles to all types of members, including service accounts.詳細については、「サービス アカウントを含むすべてのタイプのメンバーにロールを付与する」を参照してください。

    サービス アカウントを追跡する

    多くのサービス アカウントを作成すると、どのサービス アカウントがどのような目的で使用されているかわからなくなることがあります。 新しいサービスアカウントでは、サービスアカウントを作成するときに表示名を入力できます。

    未使用のサービスアカウントの識別

    未使用のサービスアカウントは不要なセキュリティリスクを引き起こすため、未使用のサービスアカウントを無効にし、不要になったことが確認されたらサービスアカウントを削除することをお勧めします。

    • サービス アカウント インサイトでは、過去 90 日間に認証されなかったプロジェクト内のサービス アカウントがわかります。
    • サービス アカウント使用状況メトリクスでは、サービス アカウントが最後に使用された日を確認できます。

    サービス アカウントの削除と再作成

    サービス アカウントを削除してから、同じ名前で新しいサービス アカウントを作成することが可能です。 その代わり、ロールバインディングはプレフィックスdeleted:を付けてサービスアカウントをリストアップします。

    最近削除したサービスアカウントと同じ名前で新しいサービスアカウントを作成した場合、古いバインディングはまだ存在するかもしれませんが、両方のアカウントが同じメールアドレスを持っていても、新しいサービスアカウントに適用されません。 この動作は、サービスアカウントが作成時にIdentity and Access Management (IAM) 内で一意のIDを与えられるために発生します。 内部的には、すべてのロールバインディングは、サービスアカウントの電子メールアドレスではなく、これらのIDを使用して付与されます。

    同様に、リソースにサービス アカウントをアタッチし、サービス アカウントを削除して、同じ名前で新しいサービス アカウントを作成した場合、新しいサービス アカウントはリソースにアタッチされません。

    元のサービスアカウントを削除できない場合、同じ名前と同じロールで新しいサービスアカウントを作成する必要があります。

    新しいサービスアカウントが元のサービスアカウントと同じリソースにアタッチされる必要がある場合は、次のいずれかを実行します。

    • Compute Engineインスタンスの場合、インスタンスにアタッチされているサービスアカウントを変更し、元のサービスアカウントを新しいサービスアカウントで置き換えることができます。
    • 他のすべてのリソースでは、既存のリソースを削除してから、同じタイプの新しいリソースを作成し、新しいサービスアカウントをアタッチする必要があります。

    サービス アカウントの権限

    このセクションでは、サービス アカウント、またはサービス アカウントを偽装する権限を持つユーザー アカウントに付与される権限の共通シナリオを説明します。

    • Getting minimum permissions to service accounts
    • Service account permissions for common scenarios

    Getting minimum permissions to service accounts

    すべてのタイプのメンバーと同様に、サービス アカウントにはその目的を達成するために必要最小限の権限セットのみを付与する必要があります。

    サービスアカウントにアクセスする権限をユーザーに付与する場合、そのユーザーはサービスアカウントが権限を持っているすべてのリソースにアクセスできることに留意してください。 つまり、チーム内で誰がサービスアカウントとして行動できるか(またはなりすましができるか)を厳密に判断することが重要です。

    App Engine および Compute Engine インスタンスを更新する IAM ロールを持つユーザー (App Engine Deployer や Compute Instance Admin など) は、これらのインスタンスを実行するために使用するサービス アカウントとしてコードを効果的に実行でき、サービス アカウントがアクセスできるすべてのリソースへのアクセスを間接的に取得することができます。 同様に、Compute Engine インスタンスへの SSH アクセスは、そのインスタンスとしてコードを実行する能力を提供するかもしれません。

    Service account permissions for common scenarios

    Service accounts can be used in many different scenarios, and each of them requires certain permissions.All rights reserved. このセクションでは、一般的なシナリオと必要な権限について説明します。

    リソースへのサービス アカウントのアタッチ

    サービス アカウントとして認証する長期実行ジョブを開始したい場合、そのジョブを実行するリソースにサービス アカウントをアタッチする必要があります。

    権限:

    • リソースを作成する権限
    • iam.serviceAccounts.actAs

    これらの権限を含む役割を見つけるには、権限について役割リストを検索します。 これらのリソースの例としては、

    • Compute Engine VMs
    • App Engine apps
    • Cloud Functions

    これらのリソースを作成すると、サービス アカウントを添付するオプションが用意されています。 このサービス アカウントは、リソースの ID として機能します。

    リソースを作成してサービス アカウントを添付するには、そのリソースを作成する権限と、リソースに添付するサービス アカウントを匿名にする権限が必要です。

    リソースを作成し、それにサービスアカウントを割り当てた後、そのリソースで長時間実行するジョブを開始できます。 リソースにサービス アカウントをアタッチする方法の詳細については、リソースにサービス アカウントをアタッチするを参照してください。

    サービス アカウントに直接なりすます

    権限:

    • iam.serviceAccounts.getAccessToken
    • iam.serviceAccounts.signBlob
    • iam.serviceAccounts.signJwt
    • iam.serviceAccounts.implicitDelegation

    ロール:

    • roles/iam.serviceAccountTokenCreator (Service Account Token Creator)

    必要な権限が与えられると、ユーザー (またはサービス) はいくつかの共通のシナリオでサービス アカウントの身元を直接偽装 (または主張) できるようになります。

    最初に、ユーザーはiam.serviceAccounts.getAccessToken権限を使用して、generateAccessToken()メソッドを呼び出すことにより、サービス アカウントの短期クレデンシャルを取得することができます。 短期認証情報を使用することで、ユーザーは Google Cloud に対してコマンドを発行することができ、サービスアカウントがアクセスできるすべてのリソースにアクセスすることができます。

    次に、ユーザーはiam.serviceAccounts.signBlob権限を使用して、signBlob()またはsignJwt()メソッドを呼び出すことにより、サービス アカウントのGoogle管理下の秘密鍵で署名されたアーティファクトを取得することができます。 Google が管理する秘密鍵は常にエスクローで保管され、直接公開されることはありません。 signBlob() では任意のペイロード (クラウド ストレージで署名された URL など) に署名できますが、signJwt() では整形式の JWT にのみ署名できます。

    最後に、ユーザーはサービス アカウント用のクレデンシャルを取得することなく、そのアカウントになりすます (またはアサーション) ことができます。 これは高度なユースケースであり、generateAccessToken()メソッドを使用したプログラムによるアクセスのみがサポートされています。 少なくとも A、B、C の 3 つのサービスアカウントがあるシナリオでは、サービスアカウント A が B に対して iam.serviceAccounts.implicitDelegation 権限を付与され、B が C に対して iam.serviceAccounts.getAccessToken 権限を付与されると、サービスアカウント C に対してアクセストークンを取得することができる。

    Generating OpenID Connect (OIDC) ID tokens

    Permissions:

    • iam.serviceAccounts.getOpenIdToken

    Roles:

    • roles/iam.serviceAccountTokenCreator (Service Account Token Creator)

    ユーザー(またはサービス)は、Google OIDC Provider (accounts.OIDC) が署名した OpenID Connect (OIDC) 互換の JWT トークンを生成できる。google.com) によって署名された OpenID Connect (OIDC) 互換の JWT トークンを生成できます。これは、iam.serviceAccounts.getOpenIdTokenパーミッションを使用するサービス アカウントの ID を表します。 たとえば、Identity-Aware Proxyは、ユーザーが実行するアプリケーションにOIDCベースのアクセスを許可します。

    外部秘密鍵の生成

    権限:

    • iam.serviceAccountKeys.create

    ロール:

    • roles/editor (Editor)
    • roles/iam.serviceAccountAdmin (Service Account Admin)

    ユーザーまたはサービスは、サービスアカウントとしてGoogleに直接認証するために使用できる外部の秘密鍵素材(RSA)を生成することが可能です。 この鍵は、ADC (Application Default Credentials) ライブラリまたは gcloud auth activate-service-account コマンドで使用できます。 この鍵素材にアクセスした人は、そのサービスアカウントがアクセスできるすべてのリソースにフルアクセスすることができます。 このような秘密鍵は最も慎重に扱われるべきであり、秘密鍵が存在すればするほど安全性は低下すると考えるべきです。

    サービスアカウントキーの管理

    サービスアカウントキーには、2つのタイプがあります。 これらのキーは、App Engine や Compute Engine などの Google Cloudservices で使用されます。 ダウンロードはできず、自動的にローテーションされ、最大2週間署名に使用される。 ローテーションのプロセスは確率的で、新しい鍵の使用量は鍵の有効期間中に徐々に増加したり減少したりします。

  • User-managed keys.これは、ユーザーが常に現在のキーセットにアクセスできるように、サービスアカウントの公開キーセットを最大24時間キャッシュすることをお勧めします。 これらの鍵は、ユーザーによって作成、ダウンロード、および管理されます。 サービスアカウントから削除すると、認証に使用できなくなります。

ユーザーが管理する鍵では、次のような鍵管理要件に対処するためのプロセスがあることを確認する必要があります。

  • Key storage
  • Key distribution
  • Key revocation
  • Key rotation
  • 不正なユーザーから鍵を保護する
  • Key recovery

サービスアカウントに対して有効なプライベートキーへのアクセスがある者は、サービスアカウントを通じてリソースにアクセスすることが可能である。 サービスアカウントへの鍵のアクセス(したがって、サービスアカウントがアクセスするデータ)のライフサイクルは、鍵をダウンロードしたユーザーのライフサイクルとは無関係であることに注意してください。

開発者がキーをソース コードにチェックインしたり、ワークステーションのダウンロード ディレクトリに残したりしないように常に注意してください。

キーのセキュリティを強化するには、次のガイダンスに従います。 新しいキーを作成し、新しいキーを使用するようにアプリケーションを切り替えてから古いキーを削除することで、キーをローテーションすることができます。 ローテーションを自動化するには、serviceAccount.keys.create()メソッドとserviceAccount.keys.delete()メソッドを一緒に使用します。 Google Cloud が管理するキーは、約 1 週間に 1 回ローテーションされます。

  • サービス アカウントとキーを監査するには serviceAccount.keys.list() メソッドを使用します。

Using service accounts with Compute Engine

Compute Engine インスタンスが他の Google Cloud リソースにアクセスするにはサービス アカウントとして実行する必要があります。

  • 同じプロジェクトに異なるサービスアカウントで VM を作成することができます。 作成後に VM のサービス アカウントを変更するには、instances.setServiceAccountメソッドを使用します。

  • サービス アカウントに IAM ロールを付与して、アクセスできるものを定義することができます。 多くの場合、スコープに依存する必要はありません。 これは、インスタンスを再作成せずに、VM のサービス アカウントの権限を変更できるという利点をもたらします。

  • Google Cloud リソースにアクセスするために、インスタンスはそのサービス アカウントに依存するので、それらがまだ実行中のインスタンスによって使用されているとき、サービス アカウントを削除しないようにしてください。 サービス アカウントを削除すると、インスタンスの動作に不具合が生じる可能性があります。

ベストプラクティス

  • サービス アカウントとして動作できるユーザーを指定します。 サービス アカウントのサービス アカウント ユーザーは、サービス アカウントがアクセスできるすべてのリソースに間接的にアクセスできます。

  • サービス アカウントには、目標を達成するために必要な最小限の権限のみを付与します。

  • 各サービスのサービスアカウントを作成し、そのサービスに必要な権限のみを付与します。

  • サービスアカウント用の命名規則を定義する。

  • ユーザー管理サービスアカウントキーの回転を自動化する処理を実装する。

  • serviceAccount.keys.list() メソッドまたはコンソールのログ ビューアー ページを使用してサービス アカウントとキーを監査します。

  • App Engine または Compute Engine 上の実行インスタンスが使用中のサービス アカウントは、それらのアプリケーションがサービス アカウントへのアクセスを停止させる場合以外は削除しないでください。

試してみる

Google Cloud が初めての方は、アカウントを作成して、実際のシナリオで Google 製品がどのように機能するかを評価してください。 また、新規のお客様には、ワークロードの実行、テスト、およびデプロイに使用できる 300 ドルのクレジットを無料で提供しています。

無料で開始する

コメントを残す

メールアドレスが公開されることはありません。