上傳服務帳戶金鑰

本頁面說明如何上傳服務帳戶的公開金鑰。上傳公開金鑰後,即可使用金鑰組的私密金鑰,以服務帳戶身分進行驗證。

事前準備

必要的角色

如要取得上傳服務帳戶金鑰所需的權限,請要求管理員授予您專案或服務帳戶的「服務帳戶金鑰管理員」 (roles/iam.serviceAccountKeyAdmin) IAM 角色,您要管理該服務帳戶的金鑰。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

詳情請參閱「服務帳戶角色」。

視機構政策設定而定,您可能也需要允許在專案中上傳服務帳戶金鑰,才能上傳金鑰。

如要取得權限,允許在專案中上傳服務帳戶金鑰,請要求管理員在貴機構中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這些預先定義的角色包含允許在專案中上傳服務帳戶金鑰的必要權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要在專案中上傳服務帳戶金鑰,您必須具備下列權限:

  • 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 機構政策限制,請機構政策管理員執行下列操作:

  1. 在機構層級建立標記鍵和標記值,用於定義資源是否應豁免於機構政策。建議您建立含有 disableServiceAccountKeyUpload 鍵和 enforcednot_enforced 值的標記。

    如要瞭解如何建立代碼鍵和代碼值,請參閱建立及定義新代碼

  2. disableServiceAccountKeyUpload 標記附加至機構,並將值設為 enforced。除非以其他標記值覆寫,否則組織中的所有資源都會繼承這個標記值。

    如要瞭解如何將標記附加至資源,請參閱將標記附加至資源

  3. 如要為專案或資料夾免除機構政策限制,請附加 disableServiceAccountKeyUpload 標記,並將值設為 not_enforced。以這種方式為專案或資料夾設定標記值,會覆寫從機構沿用的標記值。
  4. 建立或更新機構政策,禁止上傳服務帳戶金鑰,以免對豁免資源強制執行限制。這項政策應包含下列規則:

    • 設定 iam.disableServiceAccountKeyUpload 限制,確保系統不會對任何含有 disableServiceAccountKeyUpload: not_enforced 標記的資源強制執行這項限制。這項規則中的條件應如下所示:

      "resource.matchTag('ORGANIZATION_ID/disableServiceAccountKeyUpload', 'not_enforced')"
      
    • 設定 iam.disableServiceAccountKeyUpload 限制,以強制執行所有其他資源。

上傳服務帳戶的公開金鑰

您可以上傳使用者管理金鑰組的公開金鑰部分,將其與服務帳戶建立關聯。上傳公開金鑰後,即可使用金鑰組的私密金鑰做為服務帳戶金鑰。

您上傳的金鑰必須是 RSA 公開金鑰,且必須包裝在 X.509 v3 憑證中,並以 base64 編碼。您可以使用 OpenSSL 等工具,產生這種格式的金鑰和憑證。

請勿在 X.509 憑證加入任何私人資訊。具體來說,請使用一般主體,且不要新增任何選用屬性。憑證會公開顯示,因此擷取憑證的使用者都能查看其中的私人資訊。詳情請參閱「避免在上傳的 X.509 憑證中揭露機密資訊」。

如果您的專案強制執行 iam.serviceAccountKeyExpiryHours 組織政策限制,則您上傳的金鑰必須在限制中指定的時間範圍內到期。如要設定金鑰的到期時間,請在用於產生 X.509 憑證的指令中使用 -days 值。如果 -days 值大於限制中指定的時間範圍,指令就會失敗。

舉例來說,下列指令會產生 2048 位元的 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 檔案上傳為服務帳戶的公開金鑰。

控制台

  1. 前往 Trusted Cloud 控制台的「Service accounts」(服務帳戶) 頁面。
  2. 選取專案。
  3. 在「Service Accounts」(服務帳戶) 頁面中找到您要上傳金鑰的服務帳戶,然後點選該帳戶的電子郵件地址。
  4. 按一下「Keys」(金鑰) 分頁標籤。
  5. 按一下「Add key」(新增金鑰) 下拉式選單,然後選取「Upload existing key」(上傳現有金鑰)
  6. 按一下「Browse」(瀏覽),然後找出並選取公開金鑰檔案。或者,您也可以複製公開金鑰檔案的內容,然後貼到「Paste existing key」(貼上現有金鑰) 方塊中。
  7. 按一下「上傳」。

gcloud

執行 gcloud iam service-accounts keys upload 指令,上傳用於簽署服務帳戶金鑰的公開金鑰。

替換下列值:

  • KEY_FILE:包含要上傳金鑰資料的檔案路徑,例如 ./public_key.pem
  • SA_NAME:要上傳金鑰的服務帳戶名稱。
  • PROJECT_ID:您的 Trusted Cloud 專案 ID。
gcloud iam service-accounts keys upload KEY_FILE \
    --iam-account=SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com

輸出結果包含已上傳金鑰的唯一識別碼:

Name: projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0

如要確定指令是否執行成功,請執行 gcloud iam service-accounts keys list 指令:

gcloud iam service-accounts keys list \
    --iam-account=SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com

輸出結果會包含建立金鑰後所傳回的相同唯一識別碼:

KEY_ID CREATED_AT EXPIRES_AT 已停用
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42Z 9999-12-31T23:59:59Z  

REST

projects.serviceAccounts.keys.upload 方法會上傳使用者管理金鑰組的公開金鑰,並將這個金鑰新增至服務帳戶。

使用任何要求資料之前,請先替換以下項目:

  • PROJECT_ID:您的 Trusted Cloud 專案 ID。專案 ID 為英數字串,例如 my-project
  • SA_NAME:要與金鑰建立關聯的服務帳戶名稱。
  • PUBLIC_KEY_DATA:金鑰組的公開金鑰資料。必須是包裝在 X.509 v3 憑證中的 RSA 公開金鑰。以 Base64 編碼公開金鑰資料,包括第一行 -----BEGIN CERTIFICATE----- 和最後一行 -----END CERTIFICATE-----

HTTP 方法和網址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com/keys:upload

JSON 要求主體:

{
  "publicKeyData": "PUBLIC_KEY_DATA"
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.s3ns-system.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"
}

停用公開金鑰上傳功能

如要停用專案上傳金鑰的功能,請參閱「限制服務帳戶金鑰上傳作業」。

後續步驟