大家好,我是小猿來也,一個熱衷於搞 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 從零到一的落地實踐,我們慢慢一起學習,一起實踐,我會繼續在這里分享。