Jenkins 作為 CI/CD 自動化核心,需要安全地存取各種第三方服務,例如程式碼倉函式庫、Artifact Repository 等。本文將詳細說明如何在 Jenkins 中設定和管理不同型別的認證,包含使用者名稱/密碼、SSH 金鑰和 API Token,確保 CI/CD 流程安全可靠。透過 Credentials Binding plugin,我們可以在 Pipeline 中安全地使用這些認證,避免直接在程式碼中暴露敏感資訊。此外,文章也將說明如何在不同範圍(全域性和系統)和域中建立認證專案,方便管理和使用,有效提升整體安全性。
Jenkins安全設定與認證管理
在前面的章節中,我們討論了Jenkins的安全設定和與LDAP的整合。在本章中,我們將深入探討Jenkins的認證管理,包括如何建立和使用不同的認證型別。
認證管理的重要性
作為一個CI/CD自動化伺服器,Jenkins需要存取不同的第三方工具,例如Nexus artifact repository和Git code repository,以執行其CI/CD任務。這些工具實作了不同的認證機制,包括基本認證、SSH認證和API token-based認證。Jenkins需要提供所需的認證資訊以存取這些工具。
認證的組成
在Jenkins中,認證是由儲存在Jenkins例項中的身份驗證資訊組成的。您可以使用這些資訊連線到不同的第三方工具。透過儲存認證資訊,Jenkins可以以更安全的方式分享認證資訊。
建立認證條目
Jenkins提供了多種認證型別,包括基本認證、SSH認證、API token和憑證。您可以使用Jenkins Credentials plugin建立不同型別的認證,以儲存所需的身份驗證資訊。一旦建立了認證條目,您就可以使用Credentials ID參照它。
認證型別
以下是Jenkins中主要使用的認證型別:
- 基本認證:使用使用者名稱和密碼進行身份驗證。
- SSH認證:使用私鑰進行身份驗證。
- API token:使用API token進行身份驗證。
- 憑證:使用憑證進行身份驗證。
Credentials Binding plugin
透過Credentials Binding plugin,您可以在Jenkins pipeline中參照建立的認證條目。這樣,您就不需要在pipeline程式碼中指定使用者名稱和密碼或私鑰。
內容解密:
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // 使用Credentials Binding plugin參照建立的認證條目
                withCredentials([usernamePassword(credentialsId: 'my-credentials', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
                    // 執行構建任務
                    sh 'make build'
                }
            }
        }
    }
}
圖表翻譯:
  graph LR
    A[Jenkins] -->|建立認證條目|> B[Credentials plugin]
    B -->|參照認證條目|> C[Credentials Binding plugin]
    C -->|執行pipeline|> D[Jenkins pipeline]
    D -->|使用認證資訊|> E[第三方工具]
在上面的圖表中,我們展示了Jenkins如何建立和參照認證條目,以存取第三方工具。透過使用Credentials plugin和Credentials Binding plugin,Jenkins可以以更安全的方式管理認證資訊。
管理憑證
在 Jenkins 中,憑證是用於儲存不同型別的身份驗證資訊的。為了有效地管理憑證,瞭解範圍(Scope)和域(Domain)這兩個重要概念是必要的。
範圍(Scope)
當您建立一個憑證條目時,您需要指定其範圍。範圍定義了憑證條目可以在哪裡使用。有兩種型別的範圍:
- 全域性(Global):具有全域性範圍的憑證可以在所有 Jenkins 工作(Jobs)中使用,也可以由 Jenkins 伺服器作為系統使用。
- 系統(System):具有系統範圍的憑證只能由 Jenkins 例項用於執行系統管理功能,如郵件身份驗證、代理連線等。這種憑證不能在 Jenkins 工作中使用。
域(Domain)
域是一種用於分組存取類別似系統的憑證的方法。透過分組,當您組態存取某個系統時,只會顯示相關的憑證條目,而不是所有憑證。例如,如果您有十個憑證條目,其中三個用於存取 GitLab 程式碼倉函式庫,七個用於存取其他系統如 AWS,那麼當您組態存取 GitLab 程式碼倉函式庫時,看到的只有三個相關的憑證條目,而不是所有十個。
建立憑證條目
建立憑證條目可以在預設域、不同域以及不同的範圍(全域性和系統)中進行。下面將展示如何建立不同型別的憑證條目。
建立憑證條目步驟
- 登入 Jenkins:首先,您需要登入您的 Jenkins 伺服器。
- 進入憑證管理:點選 Jenkins 左側選單中的「憑證」選項,進入憑證管理頁面。
- 新增新憑證:在憑證管理頁面中,點選「新增新憑證」按鈕。
- 選擇憑證型別:根據您的需求,選擇適合的憑證型別,如「Username with password」或「SSH Username with private key」等。
- 輸入憑證詳細資訊:根據您選擇的憑證型別,輸入相關的詳細資訊,如使用者名稱、密碼、SSH 私鑰等。
- 指定範圍和域:選擇適合的範圍(全域性或系統)和域(預設域或自定義域)。
- 儲存憑證:完成以上步驟後,點選「儲存」按鈕將您的憑證條目儲存。
示例:建立 GitLab 程式碼倉庫存取憑證
假設您想要建立一個用於存取 GitLab 程式碼倉函式庫的憑證條目,您可以按照以下步驟進行:
- 選擇「Username with password」:這是最常見的用於存取 GitLab 的憑證型別。
- 輸入 GitLab 使用者名稱和密碼:在相關欄位中輸入您的 GitLab 使用者名稱和密碼。
- 指定範圍為全域性:這樣您的憑證就可以在所有 Jenkins 工作中使用。
- 指定域為「GitLab Credentials」:這樣相關的憑證就會被分組在一起,方便您在組態存取 GitLab 程式碼倉函式庫時選擇正確的憑證。
透過以上步驟,您就可以成功地在 Jenkins 中建立一個用於存取 GitLab 程式碼倉函式庫的憑證條目,並且能夠有效地管理您的憑證。
建立認證專案
在不同域和範圍中建立認證專案是一個重要的步驟。接下來,我們將探討如何在Jenkins中建立認證專案。
在全域域和全域範圍中建立認證專案
- 首先,前往Jenkins的管理頁面。
- 點選「管理認證」連結,開啟認證頁面,如圖8-1所示。
圖8-1. 認證頁面
- 在「儲存區域」部分,點選「全域」連結,開啟全域認證頁面。
- 點選左側的「新增認證」連結,開啟新增認證頁面,如圖8-2所示。
圖8-2. 新增認證頁面
- 
在「型別」欄位下拉式選單中,選擇您要建立的認證專案型別,例如「使用者名稱和密碼」,用於基本驗證;或「SSH使用者名稱和私人金鑰」,用於SSH驗證等。 
- 
現在,讓我們建立一個基本驗證的認證專案。 
- 
在「範圍」欄位中,有兩個選項可供選擇:全域(Jenkins、節點、專案、所有子專案等)和系統(Jenkins和節點)。保持選擇「全域」選項(Jenkins、節點、專案、所有子專案等)。 
內容解密:
在這個過程中,我們需要了解認證專案的型別和範圍。認證專案的型別可以是使用者名稱和密碼、SSH使用者名稱和私人金鑰等。範圍則決定了認證專案的適用範圍,例如全域或系統。
  flowchart TD
    A[開始] --> B[前往Jenkins管理頁面]
    B --> C[點選管理認證連結]
    C --> D[開啟認證頁面]
    D --> E[點選全域連結]
    E --> F[開啟全域認證頁面]
    F --> G[點選新增認證連結]
    G --> H[開啟新增認證頁面]
    H --> I[選擇認證專案型別]
    I --> J[選擇範圍]
    J --> K[建立認證專案]
圖表翻譯:
此圖表展示了建立認證專案的步驟。從前往Jenkins管理頁面開始,點選管理認證連結,開啟認證頁面,然後點選全域連結,開啟全域認證頁面。接下來,點選新增認證連結,開啟新增認證頁面,選擇認證專案型別和範圍,最後建立認證專案。
從技術架構視角來看,Jenkins 的認證管理機制是確保 CI/CD 流程安全可靠的關鍵環節。本文深入探討瞭如何在 Jenkins 中設定和管理不同型別的認證,涵蓋了基本認證、SSH 認證和 API Token 等,並詳細說明瞭 Credentials Binding plugin 的使用方法,實作了在 pipeline 中安全地參照認證資訊,避免明文暴露敏感資料。然而,Jenkins 原生介面在管理大量認證時略顯繁瑣,尤其在區分不同應用場景的認證時,容易造成混淆。未來可以考慮整合更精細的許可權管理系統,或匯入第三方外掛來提升認證管理效率。對於追求高度自動化和安全性的團隊,建議深入研究 Jenkins 認證管理的最佳實務,例如定期輪換認證、採用更安全的認證儲存方案等,以最大程度降低安全風險。玄貓認為,妥善管理 Jenkins 認證是提升 CI/CD 流程安全性的根本,值得所有 DevOps 工程師重視。
 
            