管理工具鏈中的密鑰

CI 和 CD 工具鏈中的工具整合需要機密,例如密碼、API 金鑰、憑證或其他代幣。 例如,IBM Cloud® API 金鑰可執行基本的管道任務,例如登入 IBM Cloud。 同樣地,服務 ID API 金鑰會將證明寫入 Cloud Object Store 實例中的儲存區。

基於安全理由,這些密鑰不得顯示人員的身分或帳戶,因為人員通常具有比實際工具鏈自動化需求更高的存取權。 與人員身分或帳戶的連結也會違反 "least privilege"的安全原則。 此外,人員通常會變更角色或甚至公司,而且必須移除其認證,這可能會中斷工具鏈自動化。 透過使用專門為自動化目的而連結的身分,它在自動化與使用自動化的人員之間提供權責區分。

相反地,用於非IBM Cloud 資源 (例如 GitHub Enterprise) 的密鑰必須與您企業內的功能 ID 相關聯,且只有工具鏈所需的適當存取權。 同樣地,IBM Cloud 資源的密碼必須與與 IAM 服務 ID 相關聯的 IAM 服務 ID API 金鑰 相關聯。 IAM 服務 ID 存取權需要將範圍限定為工具鏈所需的最少專用權。

管理此類認證必須安全且符合密鑰管理最佳作法。 具體而言,這意味著使用經核准的境內儲存庫提供者(例如 IBM Cloud® Secrets Manager、IBM® Key Protect 或 HashiCorp Vault 然後將您的工具鏈機密連結至這些資源。

工具鏈設定和管道使用者介面所提供的機密管理功能,可透過使用 IBM Cloud® Secrets Manager、IBM® Key Protect 或 HashiCorp Vault 的機密整合來選擇儲存庫機密。 透過使用「密鑰選取器」對話框,工具鏈或管線編輯器可以從連結密鑰整合中選取已命名的密鑰,該整合 由 CRN (雲端資源名稱) 配置或 由名稱配置,然後在工具鏈及管線內的執行時期透過參照進行解析。 選擇密鑰之後,會將 CRN 或標準密鑰參照注入至對應的工具鏈或管線安全內容,其中格式為 crn:v1:...secret:<secret-guid> (如果它是 由 CRN 配置的 Secrets Manager 整合),或者 {vault::integration-name.secret-name} (如果它是使用任何受支援提供者並 依名稱配置的儲存庫整合)。

標準 依名稱 參照格式目前無法解析密鑰名稱中包含句點字元的密鑰,因為此字元用來區隔標準路徑的每一個區段。

不論使用哪種類型的密鑰參照 ( 依 CRN 或 依名稱),前端使用者介面元件及「密鑰選取器」對話框只會使用密鑰參照。 依 CRN 或 依名稱 密鑰參照的已解析值絕不會公開給前端系統,而且一律會根據允許可用的 授權 (使用 IAM 授權及存取原則來配置),在執行時期在工具鏈及管線內動態解析。

在 IBM Cloud® 內,透過 CRN 以及工具鏈和管道中的名稱機密引用進行解析的動態過程,是透過使用內部虛擬專用端點 (VPE) 來執行,並連接到所有區域中的所有 IBM Cloud® Secrets Manager 和 IBM® Key Protect 提供者實例。 這可確保工具鏈、管道以及 IBM Cloud® Secrets Manager 和 IBM® Key Protect 提供者實例之間的所有請求與回應資料都保留在界內專用 IBM Cloud 網路中,不會透過任何公共網路通道傳輸。

除了從工具鏈中任何連結的密鑰整合逐一手動選取選擇的密鑰之外,還提供使用 Secret Hint 的選項。 此選項可讓工具鏈範本預先定義為簡短格式密鑰參照的建議密鑰名稱 (也稱為 Hints)。 密鑰提示的格式為 {vault::secret-name},其中不包含任何密鑰整合名稱。 這為工具鏈作者提供了彈性,因為所有必要的密鑰名稱都可以預先移入 toolchain.yml,然後會針對為工具鏈配置的任何密鑰整合自動解析這些名稱。

如先前所述,您可以 透過 CRN 配置 Secrets Manager 以參照密碼。 如需詳細資訊,請參閱 雲端資源名稱(CRN)。 此格式容許更大的彈性,因為如果正確的 授權 到位,您可以從不同帳戶中的 Secrets Manager 實例參照密鑰。 如需相關資訊,請參閱 配置 Secrets Manager。

CI 及 CD 中使用的密鑰概述如下:

Hint 是建議的預設名稱,在連結至工具鏈的任何可用的 依名稱 密鑰整合中,會自動針對第一個相符密鑰解析為相同名稱的密鑰。

DevSecOps管道秘密

DevSecOps秘密
密碼 提示 資訊
IBM Cloud API 金鑰 ibmcloud-api-key 必要 :CI 與 CD 用來向 IBM 公用雲端進行鑑別,並執行廣泛的作業
GPG 私密金鑰 signing_key 必要: 僅限 CI 這是用來簽署 CI 管線所建置映像檔的憑證
IBM 專用工作者節點服務 API 金鑰 private-worker-service-api-key 必要: 僅限 CI 用於在 Tekton Private Worker Service 上執行 Delivery Pipeline 工作量的服務 ID API 金鑰
GitHub 存取記號 git-token 選用 :CI 與 CD 用來向 GitHub 進行鑑別,並提供對儲存庫的存取權
Artifactory API 記號 artifactory-token 必要 :CI 與 CD 用來存取管線作業所使用的映像檔
Slack Webhook slack-webhook 選用項目 :CI 與 CD 如果您選擇使用 Slack 工具整合來公佈工具鏈狀態通知,則需要此 Webhook
ServiceNow API 記號 servicenow-api-token 必要: 僅限 CD 用來存取「立即服務」以進行變更管理作業
HashiCorp Vault 角色 ID role-id 需要:CI & CD 用於與 HashiCorp Vault 伺服器驗證
HashiCorp Vault 秘密 ID secret-id 需要:CI & CD 用於與 HashiCorp Vault 伺服器驗證
IBM Cloud Object Storage 寫出器 API 金鑰 cos-api-key 必要 :CI 與 CD 用來向 Object Storage 服務進行鑑別-此金鑰必須具有 writer 許可權
IBM Cloud Object Storage 閱讀器 API 金鑰 backup-cos-api-key 必要 :CI 與 CD 用來向 Object Storage 服務進行鑑別-此金鑰必須具有 Reader 許可權
SonarQube 密碼或鑑別記號 sonarqube-password 選用 :CI 用來向 SonarQube 原始碼分析器進行鑑別

如果您使用 HashiCorp Vault 伺服器,請確保 HashiCorp Vault 工具整合使用 AppRole Auth Method 方法。 使用 AppRole 身份驗證方法時,需要 role-id 和 secret-id 才能成功將 HashiCorp Vault 伺服器與工具鏈整合。 因為 role-id 和 secret-id 本身都是密鑰,所以建議使用 IBM Key Protect 工具整合 來儲存它們,以便可以在工具鏈工作流程中安全地擷取並套用它們。 所有其他工具鏈秘密都應該使用 HashiCorp Vault 工具整合來儲存和擷取。

如果未設定管道環境屬性 git-token,預設會使用 ibmcloud-api-key 擷取 Git Repos and Issue Tracking 存取權限。 不過,如果 ibmcloud-api-key 沒有 git 的存取權,則必須設定 git-token。

配置密鑰儲存庫

使用 IBM Cloud,您可以從各種密鑰管理及資料保護供應項目中選擇,以協助您保護機密資料並集中化密鑰。 您可以根據 管理 IBM Cloud 密碼 中所說明的需求,在儲存庫整合之間進行選擇。 本文件提供必要條件以及如何使用規定的密鑰名稱清單 (也稱為提示) 的相關資訊。 透過使用範本中的提示,工具鏈可以自動移入預先配置的密鑰,而無需從連接至工具鏈的各種儲存庫整合中手動選取它們。

使用 IBM Cloud® Secrets Manager 來安全地儲存和應用秘密,例如 API 金鑰、影像簽章或屬於您工具鏈的 HashiCorp Vault 認證。

Secrets Manager工具整合形式
IBM Secrets Manager工具整合

範本也附有 HashiCorp Vault 工具整合,如以下範例:

HashiCorp Vault 包含必填欄位和範例值的工具整合表單
HashiCorp Vault 工具整合

要使用 HashiCorp Vault,您必須提供以下資訊:

  • 名稱: 此工具整合的名稱。 此名稱會顯示在工具鏈中。
  • 伺服器 URL: 您 HashiCorp Vault Instance 的伺服器 URL。 例如,https://<vault-service>.<org>.com:8200。
  • Integration URL: 當您按一下 HashiCorp Vault Integration 動態磚,您要導航到的 URL。
  • 秘密路徑:HashiCorp Vault Instance 中儲存秘密的掛載路徑。
  • 驗證方法:HashiCorp Vault Instance 的驗證方法。 使用 AppRole。
  • 角色 ID: 選取 AppRole 以評估其他認證的 ID。
  • 密鑰 ID: 依預設,任何登入 (具有 secret_id) 都需要且預期一律為密鑰的認證。

這些範本也隨附 IBM® Key Protect for IBM Cloud® 工具整合:

Key Protect }具有必填欄位和範例值的工具整合表單
IBM Key Protect工具整合

如果您事先將 role id 和 secret id 儲存在 Key Protect 中,則可以選取在工具卡中包含那些密鑰的 Key Protect 實例,如圖 2 所示。 完成之後,就可以在 HashiCorp Vault 工具卡中按一下角色 id 和秘密 id 欄位上的按鍵圖示,並使用拾取器將秘密套用到這些欄位。

同樣地,工具鏈中使用的任何其他密鑰都具有附加至文字欄位的金鑰圖示。 您可以使用相同的選取器控制將 HashiCorp Vault 秘訣套用至所有剩餘的實體。

從 IBM Cloud Secrets Manager

使用 get_env 指令可安全存取機密。 此方法可以擷取秘密,而不會在日誌中公開。

支援的秘密類型

目前,我們支援從 Secrets Manager 中的環境屬性取得下列類型的秘密:

  • 任意

  • IAM 認證

  • 鍵值

用法:

  export SECRET_VALUE=$(get_env "secret_key" "")

在此範例中:

  • secret_key 是用來儲存秘密的名稱。

  • SECRET_VALUE 保存擷取的秘密值,以供稍後使用。

根據秘密的類型,get_env 會擷取特定的值:

擷取任意秘密
  {
    "name": "my-secret",
    "secret_type": "arbitrary",
    ...
    "payload": "The quick brown fox jumped over the lazy dog."
  }

如果 get_env 與 my-secret 一起使用,則會擷取 payload 的值。

擷取 iam_credentials 秘書
  {
    "name": "my-iam-credentials",
    "secret_type": "iam_credentials",
    ...
    "api_key": "RmnPBn6n1dzoo0v3kyznKEpg0WzdTpW9lW7FtKa017_u",
    "api_key_id": "ApiKey-dcd0b857-b590-4507-8c64-ae89a23e8d76",
    "service_id": "ServiceId-bb4ccc31-bd31-493a-bb58-52ec399800be"
  }

如果 get_env 與 my-iam-credentials 一起使用,則會檢索 api_key。

擷取key-value Secret
  {
    "name": "my-kv-secret",
    "secret_type": "key-value",
    ...
    "data": "{\"key\":\"value\"}"
  }

如果 get_env 與 my-kv-secret 一起使用,則會檢索鍵值對內的 value