設定使用者指定的服務帳戶

如要在 Cloud Build 中遵循最低權限原則,您可以設定 Cloud Build 使用具備足夠權限的服務帳戶執行建構作業。本頁面說明如何設定服務帳戶。

如未指定服務帳戶,Cloud Build 可能會自動選取服務帳戶,代表您執行建構作業。這個服務帳戶可能具備不必要的廣泛權限,例如存取 Cloud Source Repositories 和專案中的任何 Cloud Storage bucket。

為提升專案的安全性,並降低設定錯誤或惡意使用者可能造成的影響,建議您遵循最低權限原則。採用這項原則後,您就能為每個服務帳戶指派權限和角色,範圍限定在該帳戶執行的工作。舉例來說,您可以如Google Cloud 這篇網誌所示,使用一個服務帳戶建構映像檔並推送至 Artifact Registry。

事前準備

  • Enable the Cloud Build and IAM APIs.

    Enable the APIs

  • 如果您打算使用這個帳戶建立及管理憑證 (例如建立短期憑證),請啟用 IAM Service Account Credentials API。

    Enable the API

  • 如果還沒有服務帳戶,請建立服務帳戶

授予 IAM 權限

如要允許建構作業存取連線所需的服務,您必須授予部分角色和權限:

  1. 開啟 Cloud Build 設定頁面:

    開啟 Cloud Build 「Settings」(設定) 頁面

    畫面上會顯示「Service account permissions」(服務帳戶權限) 分頁

    服務帳戶權限頁面的螢幕截圖

  2. 從下拉式清單中,選取要變更角色的服務帳戶。

  3. 將要新增角色的狀態設為「啟用」

  4. 如果建構管道所需的角色未列於此處,您可以在 IAM 設定頁面中授予其他角色

如要進一步瞭解建構作業通常需要的角色,請參閱「設定 Cloud Build 資源的存取權」和「Cloud Build IAM 角色和權限」的完整清單。

設定建構作業記錄檔

為建構作業指定自己的服務帳戶時,您必須將建構記錄儲存在 Cloud Logging 或使用者建立的 Cloud Storage bucket 中。您無法將記錄檔儲存在預設記錄檔 bucket 中。

  • 如要將記錄檔儲存在 Cloud Storage 值區中,請按照「將建構作業記錄儲存在使用者建立的值區中」一文中的操作說明進行。請確認您未在記錄檔值區中設定保留政策,否則 Cloud Build 可能無法將建構記錄寫入該值區。

  • 如要在 Cloud Logging 中儲存建構記錄,請將「記錄寫入者」(roles/logging.logWriter) 角色授予服務帳戶。

  • 如要進一步瞭解建構記錄的儲存位置,請參閱「選擇建構記錄的儲存位置」。

使用設定檔執行建構作業

如要使用設定檔手動執行建構作業,請按照下列步驟操作:

  1. 在專案根目錄中,建立名為 cloudbuild.yamlcloudbuild.json 的 Cloud Build 建構設定檔。

  2. 新增 serviceAccount 欄位和偏好的記錄設定。

    • 如要在 Cloud Logging 中儲存建構記錄,請新增 logging 欄位,並將該欄位的值設為 CLOUD_LOGGING_ONLY

    • 如果您將建構作業記錄儲存在使用者建立的 Cloud Storage 值區中:

      • 新增 logging 欄位,並將其值設為 GCS_ONLY
      • 新增 logsBucket 欄位,並將其值設為 Cloud Storage bucket 位置。

    以下範例會設定 Cloud Build,使用使用者指定的服務帳戶執行建構作業,並將建構記錄儲存在使用者建立的 Cloud Storage 值區中:

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    serviceAccount: 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "serviceAccount": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    
    

    將建構設定檔中的預留位置值替換為下列值:

    • LOGS_BUCKET_LOCATION 是用來儲存建構記錄的 Cloud Storage bucket。例如:gs://mylogsbucket
    • PROJECT_ID 是執行建構作業的 Google Cloud 專案 ID。
    • SERVICE_ACCOUNT 是您要為建構作業指定的服務帳戶電子郵件地址或專屬 ID。舉例來說,服務帳戶的電子郵件地址看起來會像這樣: service-account-name@project-id.iam.gserviceaccount.com
  3. 使用建構設定檔展開建構作業:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    將上述指令中的預留位置值替換為下列值:

    • CONFIG_FILE_PATH 是建構設定檔的路徑。
    • SOURCE_DIRECTORY 是原始碼的路徑或網址。

    如果您未在 gcloud builds submit 指令中指定 CONFIG_FILE_PATHSOURCE_DIRECTORY,Cloud Build 會假設建構設定檔和原始碼位於目前的工作目錄中。

使用觸發條件執行建構作業

如要使用自己的服務帳戶,透過 Cloud Build 觸發條件執行建構作業,請設定偏好的記錄選項,並在建立觸發條件時選取偏好的服務帳戶。

  1. 在建構設定檔中:

    • 如要在 Cloud Logging 中儲存建構記錄,請新增 logging 欄位,並將該欄位的值設為 CLOUD_LOGGING_ONLY

    • 如果您將建構作業記錄儲存在使用者建立的 Cloud Storage 值區中:

      • 新增 logging 欄位,並將其值設為 GCS_ONLY
      • 新增 logsBucket 欄位,並將其值設為 Cloud Storage bucket 位置。

    以下範例會將建構記錄設定為儲存在使用者建立的 Cloud Storage bucket 中:

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    

    請將 LOGS_BUCKET_LOCATION 改成用來儲存建構記錄的 Cloud Storage 值區。例如:gs://mylogsbucket

  2. 指定要用於建構觸發條件的服務帳戶:

    主控台

    如要使用 Google Cloud 控制台的「觸發程序」頁面執行建構作業,使用者指定的服務帳戶必須與建構觸發程序位於同一個專案。如要搭配使用觸發條件與跨專案服務帳戶,請使用 gcloud 工具建立建構觸發條件。

    1. 建立或編輯建構作業觸發條件

    2. 在「服務帳戶」欄位中,指定服務帳戶。如未指定服務帳戶,Cloud Build 會使用預設服務帳戶

    3. 按一下「建立」即可儲存建構觸發條件。

    gcloud

    建立建構觸發條件時,請使用 --service-account 旗標指定服務帳戶。在下列範例中,gcloud 指令會建立建構觸發程序,從 Git 存放區提取程式碼:

    gcloud builds triggers create github \
       --name=TRIGGER_NAME \
       --repo-name=REPO_NAME \
       --repo-owner=REPO_OWNER \
       --branch-pattern=BRANCH_PATTERN
       --build-config=BUILD_CONFIG_FILE
       --service-account=SERVICE_ACCOUNT
       --project=BUILD_PROJECT
    

    將建構設定檔中的預留位置值替換為下列值:

    • TRIGGER_NAME 是建構觸發條件的名稱。
    • REPO_NAME 是存放區的名稱。
    • REPO_OWNER 是存放區擁有者的使用者名稱。
    • BRANCH_PATTERN 是存放區中的分支名稱,用於叫用建構作業。
    • TAG_PATTERN 是存放區中的標記名稱,用於叫用建構作業。
    • BUILD_CONFIG_FILE 是建構設定檔的路徑。
    • SERVICE_ACCOUNT 是您的服務帳戶,格式為 /projects/PROJECT_ID/serviceAccounts/ACCOUNT_ID_OR_EMAIL
    • BUILD_PROJECT 是您要啟動建構作業的專案。

跨專案設定

只有在未強制執行iam.disableCrossProjectServiceAccountUsage機構政策限制的情況下,您才能使用使用者指定的服務帳戶,在與建立服務帳戶的專案不同的專案中執行建構作業。這項限制預設為強制執行。

  • 下列指令會停用該限制的強制執行,並授予必要存取權。貴機構必須瞭解相關安全風險,再於機構政策中設定限制:

    gcloud resource-manager org-policies disable-enforce \
       iam.disableCrossProjectServiceAccountUsage \
       --project=SERVICE_ACCOUNT_PROJECT_ID
    

    在這個指令中,SERVICE_ACCOUNT_PROJECT_ID 是包含使用者指定服務帳戶的專案

  • 在具有使用者指定服務帳戶的專案中,將 roles/iam.serviceAccountTokenCreator 角色授予您要執行建構的專案 Cloud Build 服務代理程式:

    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member="serviceAccount:BUILD_SERVICE_AGENT" \
        --role="roles/iam.serviceAccountTokenCreator"
    

    將指令中的預留位置值替換為下列項目:

    • SERVICE_ACCOUNT_PROJECT_ID:專案 ID,用於存放使用者指定的服務帳戶。
    • BUILD_SERVICE_AGENT:服務代理人的電子郵件 ID,格式為 service-BUILD_PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com,其中 BUILD_PROJECT_NUMBER 是您執行建構作業的專案專案編號。您可以從專案設定頁面取得專案編號。

限制:

  • Google Cloud 專案必須位於 Google Cloud 機構中。

  • 您必須使用 gcloud builds submitgcloud builds triggers create,在指令列中啟動建構作業。如要在 Google Cloud 控制台中使用「觸發程序」頁面,使用者指定的服務帳戶和建構觸發程序必須位於同一個專案中。

後續步驟