Jenkins 憑證 Devops 的粘合劑

小猿來也發表於2021-07-09

大家好,我是小猿來也,一個熱衷於搞 Devops 自動化的 Java 程式猿。

萬事具備,只欠東風。當我決定大搞特搞 Devops 的時候,Jenkins 憑證卻傻傻分不清。

玩 Devops 的小夥伴應該對 Jenkins 都有了解。

Github 上 16.8k 的 Star 的專案,1500+ 的構建、釋出等自動化外掛可供選擇,事實上的業界 CICD 標準領導者。

今天就和大家簡單分享一下 Jenkins 憑證,主要內容包括 Jenkins 憑據的介紹,Jenkins 憑據的種類,Jenkins 憑證的安全性,以及如何配置 Jenkins 憑據,最後通過一個基於 GitHub 的 SSH 憑證配置的試驗,來詳細演示 Jenkins 憑據的配置流程及注意事項。

1. 憑證介紹

Jenkins 憑證是指很多可以和 Jenkins 進行互動的第三方站點和應用程式,如 GitHub,SonarQube,Jira,Docker 等為 Jenkins 專門配置的憑證,通過這樣的專門的憑證可以將 Jenkins 對第三方站點和應用程式的可用功能區間鎖定在特定的範圍內。

2. 憑證的種類

Jenkins可以儲存以下型別的憑證:

  • Username and password (使用者名稱和密碼) :可以是單獨的使用者名稱、密碼,也可以是冒號分隔的字串(格式為 username:password),如 GitHub 的使用者名稱和密碼

  • GitHub App : Github App 可以通過 Github 提供的認證資訊去呼叫 Github API。GitHub端的設定路徑在 GitHub 的 Settings / Developer settings 下。

  • SSH Username with private key ( SSH 使用者名稱與私有金鑰):一個 SSH 公鑰/私鑰對

  • Secret file(加密檔案):本質上是檔案中的加密內容

  • Secret text(加密文字):API令牌(例如 GitHub 個人訪問令牌)

  • Certificate (證照):一個PKCS#12證照檔案和可選密碼

3. 憑證的安全性

為了最大程度地提高安全性,在 Jenkins 中配置的憑證會以加密形式儲存在 Jenkins 例項上(基於 Jenkins 例項 ID 進行加密),並且Jenkins job 中僅通過憑證 ID 來使用。

這最大程度地減少了將實際憑證本身暴露給 Jenkins 使用者的機會,並阻礙了將憑證從一個 Jenkins 例項複製到另一個例項的可能。

4. 配置憑證

任何具有"憑證">"建立"許可權的 Jenkins 使用者都可以將憑證新增到 Jenkins。Jenkins 使用者可以使用 Administer 許可權來配置這些許可權。

同時,如果你的 Jenkins 例項的"全域性安全配置"頁面的"授權策略"被設定為預設的"登入使用者可以執行任何設定"或"任何人可以做任何設定",則任何 Jenkins 使用者都可以新增和配置憑證。

5. 新增新的全域性憑證

要將新的全域性憑證新增到 Jenkins 例項,需要執行以下操作:

  1. 確保已登入 Jenkins,具有 "憑證" > "建立" 許可權。

  2. 在 Jenkins 主頁中,單擊左側的 Manage Jenkins > Manage Credentials。

  3. 在右側作用範圍為 Jenkins 的憑證儲存下,單擊 Jenkins。

  4. 在"System"下,單擊"Global credentials (unrestricted)"連結以進入預設域。

  5. 點選左側的新增憑證。
    注意:如果此預設域中沒有憑證,則也可以單擊"新增一些憑證"(與單擊"新增憑證"相同)。

  1. 選擇憑證種類,在"種類"欄位中,選擇要新增的憑證的型別。

  2. 在"範圍"欄位中,選擇以下任一項:

  • 全域性:如果要新增的憑證是針對管道 job 的。選擇此選項會將憑證的範圍應用於管道 job "物件"及其所有後代物件。

  • 系統:如果要新增的憑證是 Jenkins 例項本身與系統管理功能(例如,電子郵件身份驗證,代理連線等)進行互動的 job。選擇此選項會將憑證的範圍應用於只單個 job。

  1. 將憑證本身新增到所選憑證型別的相應欄位中:
  • 加密文字:複製加密文字並將其貼上到"Secret"欄位中。

  • 使用者名稱和密碼:在相應欄位中指定憑證的使用者名稱和密碼。

  • 加密檔案:點選選擇檔案按鈕旁邊的檔案欄位選擇祕密檔案上傳到 Jenkins。

  • 帶有私鑰的 SSH 使用者名稱-在其各自的欄位中指定憑證 Username, Private Key 和可選的 Passphrase。
    注意:直接選擇 Enter 可讓您複製私鑰的文字並將其貼上到生成的 Key 文字框中。

  • 證照:指定證照和可選的密碼。選擇上傳 PKCS#12 證照,可以通過出現的上傳證照按鈕將證照作為檔案上傳。

  • Docker 主機證照認證:將適當的詳細資訊複製並貼上到客戶端金鑰客戶端證照伺服器CA證照欄位中。

  1. 在 ID 欄位中,指定一個有意義的憑證 ID 值-例如 jenkins-user-for-xyz-artifact-repository。您可以使用大寫或小寫字母作為憑證 ID,以及任何有效的分隔符。但是,為了使您的 Jenkins 例項上的所有使用者受益,最好使用單一且一致的約定來指定憑證 ID。
    注意:此欄位是可選的。如果未指定其值,Jenkins 將為憑證ID分配一個全域性唯一 ID(GUID)值。需要強調的是,一旦設定了憑證 ID,就無法再更改它。

  2. 為憑證指定一個可選的描述。

  3. 單擊確定以儲存憑證。

6. 基於 GitHub 的 SSH 憑證配置試驗

6.1. 新增憑證

SSH 的憑證由一個公鑰檔案一個私鑰檔案,這樣兩個檔案組成。

$ cd .ssh/
$ pwd
/Users/your-jenkins-run-system-user/.ssh
$ ls
id_rsa			id_rsa.pub		

我們需要把其中的id_rsa.pub的內容,即公鑰的內容配置到 GitHub 端。

同時把id_rsa的內容,即私鑰的內容配置到 Jenkins 端,這樣才算完成了 Jenkins 和 GitHub 互動前的憑證配置。

給 Jenkins 新增一個憑證最直接的方法就是如第5部分內容所描述的操作步驟,進入新增憑證的頁面(如上圖所示)。

在新增憑證的表單的憑證型別欄位中選擇SSH Username with private key型別。
ID 欄位非必填,不填系統會自動生成。
描述欄位非必填,可以隨意填寫。
Username 欄位非必填,可以隨意填寫,不填時儲存後會預設補上執行 Jenkins 的作業系統使用者。
Private Key 欄位就是配置你的 SSH 私鑰的地方。正確的開啟方式是你需要拷貝你的id_rsa檔案的實際內容到這個地方即可。

這裡因為是在做試驗,所以隨意填寫一個字串,比如codingnb,當然你可以按照自己的喜好隨意填寫。
完整的憑證配置資訊如下圖所示。

Passphrase 欄位根據你生成 SSH 的憑證時的實際情況填寫,一般情況下這個欄位不填即可。
填完所有資訊"確定"之後,你就會在全域性憑證列表中看到剛才新增的名為ssh-credentials-test-error的憑證。

正如它的名字一樣,ssh-credentials-test-error是一個錯誤的憑證,後面我們會驗證這個憑證的有效性。

6.2. 測試憑證的有效性

憑證有了,那麼怎麼驗證它的有效性呢?
為了驗證憑證的有效性,我們建立了一個自由風格的 Jenkins job 來做試驗,這個 job 我們把它叫做ssh-credentials-demo

Jenkins 中自由風格的 job 由General原始碼管理構建觸發器構建環境構建構建後操作6個階段組成。

本試驗中這個 job 做的事情非常簡單,就是從 GitHub 上拉取事先準備好的原始碼,然後執行ls -a命令檢視下載之後的檔案目錄。如果能夠正常拉取程式碼則證明憑證有效,否則憑證無效。

試驗中這6個階段中需要稍加配置的階段,我會在下面分別給予說明,未做說明的階段,你使用預設的配置即可。

  1. 原始碼管理

倉庫地址:git@GitHub.com:tobrainto/demo.git 分支:main。

在配置原始碼倉庫地址和分支的同時你還需要指定 Jenkins 和 GitHub 互動的憑證。
這個時候你可以選擇一個已經新增好的憑證,也可以通過 Jenkins 在原始碼管理配置的介面中提供的快捷入口來新增一個新的憑證。

為了完成對比試驗,這裡先選擇之前建立的那個有問題的名為ssh-credentials-test-error的憑證,之後我們會通過這邊提供的快捷入口新增一個正確的憑證。

選中ssh-credentials-test-error後,經過1秒到2秒 Jenkins 會自動去驗證憑證的有效性,因為憑證ssh-credentials-test-error中 Private Key 欄位是隨意填寫的,所以這裡憑證會驗證失敗。

詳細的錯誤資訊如下

無法連線倉庫:Command "git ls-remote -h -- git@GitHub.com:tobrainto/demo.git HEAD" returned status code 128:
stdout:
stderr: Load key "/var/folders/hq/9rdkq_5j7cz_25s2lqntqhwr0000gn/T/jenkins-gitclient-ssh12631328169216538563.key": invalid format
git@GitHub.com: Permission denied (publickey).
fatal: 無法讀取遠端倉庫。

請確認您有正確的訪問許可權並且倉庫存在。

我們先不管這個錯誤,繼續進行試驗。

  1. 構建

構建階段只是簡單的執行ls -a命令檢視下載之後的檔案目錄。

3. 構建後操作

構建後我們刪除當前工作區,以免影響下一次試驗的構建。

對這些需要配置的階段完成配置之後,我們立即構建ssh-credentials-demo這個 job,不出意外這個 job 構建失敗了。

這個時候我們回到ssh-credentials-demo這個 job 的配置中,重新進入原始碼管理階段,通過原始碼管理提供的憑證"新增"按鈕新增一個正確的憑證。

點選上圖紅框內的"新增"按鈕,彈出下圖所示的憑證新增表單窗。

這一次 Private Key 欄位我們配置正確的內容,即和上面 GitHub 端配置的公鑰配對的私鑰檔案的內容。

提交表單之後,我們在原始碼管理中的備選憑證列表中已經可以看到剛才新增的名為ssh-credentials-test-yeah的憑證。

我們選中它,最初選中的時候,依然會有上面的紅色的憑證驗證失敗的提示,那個提示是之前使用ssh-credentials-test-error憑證留下的驗證資訊,我們不用管它。

大概過了1秒到2秒之後,基於ssh-credentials-test-yeah憑證的校驗資訊就會覆蓋它,新的憑證校驗成功,之前紅色的憑證驗證失敗的提示資訊消失了。

緊接著我們再一次構建ssh-credentials-demo這個 job ,嗯構建成功了。

另外當我回到全域性憑證列表,在列表中我們已經可以看到剛剛新增的名為ssh-credentials-test-yeah的憑證。

在這個列表裡我們選擇ssh-credentials-test-error這個憑證進行編輯,我們僅僅把它的 Private Key 欄位的值由之前隨意填寫的codingnb改成同ssh-credentials-test-error憑證的 Private Key 欄位的值相同的真正的 SSH 私鑰檔案的內容,其他欄位內容一律不做修改,保持不變。
然後我們回到ssh-credentials-demo這個 job ,我們再次把它使用的憑證改為ssh-credentials-test-error這個憑證。
以上變更過程中的圖我們這裡就不再貼了。
最後我們再一次構建ssh-credentials-demo這個 job ,嗯同樣,我們使用修改之後的ssh-credentials-test-error這個憑證對job構建成功了。

6.3. 結論

最後我們簡單總結一下,Jenkins 支援 6 種型別的憑證,我們最常使用的是 SSH 憑證。

試驗中我們我們分別演示了從 job 中建立憑證和從系統管理中建立憑證。

實驗中可以看出來給 Jenkins 配置 SSH 憑證,只要填上正確的 SSH 私鑰即可,使用者名稱等其他欄位的資訊對憑證的有效性是沒有影響。

Jenkins 憑據我們這次就先介紹這麼多,更多有關 Jenkins 的知識,Devops 從零到一的落地實踐,我們慢慢一起學習,一起實踐,我會繼續在這裡分享。

相關文章