このページでは、サービス アカウントの公開鍵をアップロードする方法について説明します。公開鍵をアップロードすると、鍵ペアの秘密鍵を使用してサービス アカウントとして認証できます。
準備
Enable the IAM API.
サービス アカウント認証情報について理解する。
必要なロール
サービス アカウント キーのアップロードに必要な権限を取得するため、プロジェクトまたは鍵を管理するサービス アカウントに対するサービス アカウント キー管理者(roles/iam.serviceAccountKeyAdmin
)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
詳しくは、サービス アカウントのロールをご覧ください。
組織のポリシーの構成によっては、キーをアップロードする前に、プロジェクトでサービス アカウント キーのアップロードを許可する必要がある場合もあります。
プロジェクトでサービス アカウント キーをアップロードするための権限を取得するには、組織に対する次の IAM ロールを付与するよう管理者に依頼してください。
- 組織ポリシー管理者(
roles/orgpolicy.policyAdmin
) - 組織閲覧者(
roles/resourcemanager.organizationViewer
) - タグ管理者(
roles/resourcemanager.tagAdmin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには、プロジェクトでサービス アカウント キーをアップロードするための権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
プロジェクトでサービス アカウント キーをアップロードできるようにするには、次の権限が必要です。
-
orgpolicy.constraints.list
-
orgpolicy.customConstraints.create
-
orgpolicy.customConstraints.delete
-
orgpolicy.customConstraints.get
-
orgpolicy.customConstraints.list
-
orgpolicy.customConstraints.update
-
orgpolicy.policies.create
-
orgpolicy.policies.delete
-
orgpolicy.policies.list
-
orgpolicy.policies.update
-
orgpolicy.policy.get
-
orgpolicy.policy.set
-
resourcemanager.organizations.get
-
resourcemanager.projects.listTagBindings
-
resourcemanager.projects.listEffectiveTags
-
resourcemanager.tagKeys.get
-
resourcemanager.tagKeys.list
-
resourcemanager.tagValues.list
-
resourcemanager.tagValues.get
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
サービス アカウント キーのアップロードを許可する
サービス アカウント キーを作成する前に、プロジェクトに iam.disableServiceAccountKeyUpload
組織のポリシー制約が適用されていないことを確認してください。この制約がプロジェクトに適用されている場合、そのプロジェクトでサービス アカウント キーをアップロードすることはできません。
ほとんどのプロジェクトにこの制約を適用し、サービス アカウント キーが本当に必要なプロジェクトのみを除外することをおすすめします。その他の認証方法の詳細については、ユースケースに適した認証方法を選択するをご覧ください。
プロジェクトを iam.disableServiceAccountKeyUpload
組織のポリシー制約から除外するには、組織のポリシー管理者に次の操作を依頼します。
-
組織レベルで、プロジェクトまたはフォルダを組織のポリシーから除外するかどうかを定義するために、タグキーとタグ値を作成します。キー
disableServiceAccountKeyUpload
と値enforced
、not_enforced
を使用してタグを作成することをおすすめします。タグキーとタグ値の作成方法については、新しいタグの作成と定義をご覧ください。
-
disableServiceAccountKeyUpload
タグを組織に適用し、その値をenforced
に設定します。組織内のすべてのプロジェクトまたはフォルダは、別のタグ値で上書きされない限り、このタグ値を継承します。リソースにタグを適用する方法については、リソースへのタグの適用をご覧ください。
-
組織のポリシーから除外するプロジェクトまたはフォルダごとに
disableServiceAccountKeyUpload
タグを付けて、その値をnot_enforced
に設定します。この方法でプロジェクトまたはフォルダにタグ値を設定すると、組織から継承されたタグ値がオーバーライドされます。 -
除外リソースに制約が適用されないように、サービス アカウント キーのアップロードを禁止する組織のポリシーを作成または更新します。このポリシーには、次のルールが必要です。
-
disableServiceAccountKeyUpload: not_enforced
タグの付いたリソースに適用されないようにiam.disableServiceAccountKeyUpload
制約を構成します。このルールの条件は次のようになります。resource.matchTag(\"ORGANIZATION_ID/disableServiceAccountKeyUpload\", \"not_enforced\")
- 他のすべてのリソースに適用されるように
iam.disableServiceAccountKeyUpload
制約を構成します。
タグ条件を使用して組織のポリシーを作成する方法については、タグを使用した組織のポリシーの設定をご覧ください。
-
サービス アカウントの公開鍵をアップロードする
ユーザーが管理する鍵ペアの公開鍵の部分をアップロードして、サービス アカウントに関連付けることができます。公開鍵をアップロードすると、鍵ペアの秘密鍵をサービス アカウント キーとして使用できます。
アップロードする鍵は、X.509 v3 証明書でラップされ、base64 でエンコードされた RSA 公開鍵である必要があります。OpenSSL などのツールを使用して、この形式の鍵と証明書を生成できます。
X.509 証明書に個人情報を含めないでください。一般的なサブジェクトを使用してください。また、省略可能な属性は追加しないでください。証明書は一般公開されています。証明書に含まれる個人情報は、証明書を取得するすべての人に開示されます。詳しくは、アップロードされる X.509 証明書に機密情報を含めないをご覧ください。
たとえば、次のコマンドは 2,048 ビットの RSA 鍵ペアを生成し、公開鍵を 365 日間有効な自己署名証明書にラップします。
openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
-keyout /path/to/private_key.pem \
-out /path/to/public_key.pem \
-subj "/CN=unused"
その後、サービス アカウントの公開鍵として public_key.pem
ファイルをアップロードできます。
コンソール
- Google Cloud コンソールで、[サービス アカウント] ページに移動します。
残りの手順は、Google Cloud コンソールに表示されます。
- プロジェクトを選択します。
- [サービス アカウント] ページで、キーをアップロードするサービス アカウントのメールアドレスをクリックします。
- [キー] タブをクリックします。
- [鍵を追加] プルダウン メニューをクリックして、[既存の鍵をアップロード] を選択します。
- [参照] をクリックし、公開鍵ファイルを見つけて選択します。または、[既存の鍵を貼り付け] ボックスに公開鍵の内容をコピーして貼り付けることもできます。
- [アップロード] をクリックします。
gcloud
gcloud iam service-accounts keys upload
コマンドを実行して、サービス アカウント キーに署名するための公開鍵をアップロードします。
次の値を置き換えます。
KEY_FILE
: アップロードする鍵データを含むファイルのパス(./public_key.pem
など)。SA_NAME
: 鍵をアップロードするサービス アカウントの名前。PROJECT_ID
: Google Cloud プロジェクト ID。
gcloud iam service-accounts keys upload KEY_FILE \ --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com
アップロードした鍵の一意な ID が出力されます。
Name: projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0
コマンドが成功したかどうかを確認するには、gcloud iam service-accounts keys list
コマンドを実行します。
gcloud iam service-accounts keys list \ --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com
次のように、出力にはキーの作成後に返された一意な ID が含まれます。
KEY_ID | CREATED_AT | EXPIRES_AT | 無効 |
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 | 2019-06-26T21:01:42Z | 9999-12-31T23:59:59Z |
REST
projects.serviceAccounts.keys.upload
メソッドは、ユーザーが管理する鍵ペアから公開鍵をアップロードし、この鍵をサービス アカウントに追加します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクト IDプロジェクト ID は英数字からなる文字列です(例:my-project
)。SA_NAME
: 鍵を関連付けるサービス アカウントの名前。PUBLIC_KEY_DATA
: 鍵ペアの公開鍵データ。X.509 v3 証明書でラップされた RSA 公開鍵である必要があります。最初の行(-----BEGIN CERTIFICATE-----
)と最後の行(-----END CERTIFICATE-----
)を含め、公開鍵データを base64 でエンコードします。
HTTP メソッドと URL:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys:upload
リクエストの本文(JSON):
{ "publicKeyData": "PUBLIC_KEY_DATA" }
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{ "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0", "validAfterTime": "2020-05-17T19:31:19Z", "validBeforeTime": "2021-05-17T19:31:19Z", "keyAlgorithm": "KEY_ALG_RSA_2048", "keyOrigin": "USER_PROVIDED", "keyType": "USER_MANAGED" }
公開鍵のアップロードを無効にする
プロジェクトのキーのアップロードを無効にする方法については、サービス アカウント キーのアップロードを制限するをご覧ください。
次のステップ
- サービス アカウント キーを作成、削除する方法を確認する。
- サービス アカウント キーの一覧表示と取得方法を学習する。
- サービス アカウント キーによる認証の代替手段を確認する。
- サービス アカウント キーを使用してサービス アカウントとして認証する方法を確認する。
- サービス アカウント キーの管理に関するおすすめの方法を理解します。
使ってみる
Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
無料で開始