大家好,我是小猿來也,一個熱衷於搞 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 例項,需要執行以下操作:
-
確保已登入 Jenkins,具有 "憑證" > "建立" 許可權。
-
在 Jenkins 主頁中,單擊左側的 Manage Jenkins > Manage Credentials。
-
在右側作用範圍為 Jenkins 的憑證儲存下,單擊 Jenkins。
-
在"System"下,單擊"Global credentials (unrestricted)"連結以進入預設域。
-
點選左側的新增憑證。
注意:如果此預設域中沒有憑證,則也可以單擊"新增一些憑證"(與單擊"新增憑證"相同)。
-
選擇憑證種類,在"種類"欄位中,選擇要新增的憑證的型別。
-
在"範圍"欄位中,選擇以下任一項:
-
全域性:如果要新增的憑證是針對管道 job 的。選擇此選項會將憑證的範圍應用於管道 job "物件"及其所有後代物件。
-
系統:如果要新增的憑證是 Jenkins 例項本身與系統管理功能(例如,電子郵件身份驗證,代理連線等)進行互動的 job。選擇此選項會將憑證的範圍應用於只單個 job。
- 將憑證本身新增到所選憑證型別的相應欄位中:
-
加密文字:複製加密文字並將其貼上到"Secret"欄位中。
-
使用者名稱和密碼:在相應欄位中指定憑證的使用者名稱和密碼。
-
加密檔案:點選選擇檔案按鈕旁邊的檔案欄位選擇祕密檔案上傳到 Jenkins。
-
帶有私鑰的 SSH 使用者名稱-在其各自的欄位中指定憑證 Username, Private Key 和可選的 Passphrase。
注意:直接選擇 Enter 可讓您複製私鑰的文字並將其貼上到生成的 Key 文字框中。 -
證照:指定證照和可選的密碼。選擇上傳 PKCS#12 證照,可以通過出現的上傳證照按鈕將證照作為檔案上傳。
-
Docker 主機證照認證:將適當的詳細資訊複製並貼上到
客戶端金鑰
,客戶端證照
和伺服器CA證照
欄位中。
-
在 ID 欄位中,指定一個有意義的憑證 ID 值-例如 jenkins-user-for-xyz-artifact-repository。您可以使用大寫或小寫字母作為憑證 ID,以及任何有效的分隔符。但是,為了使您的 Jenkins 例項上的所有使用者受益,最好使用單一且一致的約定來指定憑證 ID。
注意:此欄位是可選的。如果未指定其值,Jenkins 將為憑證ID分配一個全域性唯一 ID(GUID)值。需要強調的是,一旦設定了憑證 ID,就無法再更改它。 -
為憑證指定一個可選的描述。
-
單擊確定以儲存憑證。
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個階段中需要稍加配置的階段,我會在下面分別給予說明,未做說明的階段,你使用預設的配置即可。
- 原始碼管理
倉庫地址: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: 無法讀取遠端倉庫。
請確認您有正確的訪問許可權並且倉庫存在。
我們先不管這個錯誤,繼續進行試驗。
- 構建
構建階段只是簡單的執行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 從零到一的落地實踐,我們慢慢一起學習,一起實踐,我會繼續在這裡分享。