Jenkins的憑證管理

Jenkins的憑證管理

什麼是憑證?

憑證(cridential)是Jenkins進行受限操做時的憑據。好比使用SSH登陸遠程機器時,用戶名和密碼或SSH key就是憑證。而這些憑證不可能以明文寫在Jenkinsfile中。Jenkins憑證管理指的就是對這些憑證進行管理。正則表達式

爲了最大限度地提升安全性,在Jenkins master節點上對憑證進行加密存儲(經過Jenkins實例ID加密),只有經過它們的憑證ID才能在pipeline中使用,而且限制了將證書從一個Jenkins實例複製到另外一個Jenkins實例的能力。安全

也由於全部的憑證都被存儲在Jenkins master上,因此在Jenkins master上最好不要執行任務,以避免被pipeline非法讀取出來。那麼在哪裏執行pipeline呢?應該分配到Jenkins agent上執行。app

建立憑證

首先確保當前用戶有添加憑證的權限。咱們使用超級管理員的身份登陸。單擊Jenkins首頁左側的Credentials→Systemssh

file

而後單擊「Global credentials (unrestricted)」連接,再單擊「Add Credentials」ide

file

憑證的類型

Jenkins默認支持如下憑證類型:Secret text、Username with password、Secret file、SSHUsername with private key、Certificate:PKCS#十二、Docker Host CertificateAuthentication credentials。函數

​ Secret text是一串須要保密的文本,好比GitLab的API token。
fileui

​ Username with password指用戶和密碼憑證。加密

file

​ Secret file指須要保密的文本文件。使用Secret file時,Jenkins會將文件複製到一個臨時目錄中,再將文件路徑設置到一個變量中。構建結束後,所複製的Secret file會被刪除。插件

file

​ SSH Username with private key指一對SSH用戶名和密鑰。3d

file

添加憑證後,安裝Credentials Binding Plugin插件,經過其提供的withCredentials步驟就能夠在pipeline中使用憑證了。

​ Secret text

file

​ Username with password

file

​ Secret file

file

​ SSH Username with private key

file

​ sshUserPrivateKey函數還支持如下參數。

​ • usernameVariable:SSH用戶名的變量名。

​ • passphraseVariable:SSH key密碼的變量名。

credentials helper方法使用憑證

​ Secret text:

file

​ AWS-SECRET-KEY-ID和AWS-SECRET-ACCESS-KEY是咱們預先定義的憑證ID。creden-tials方法將憑證的值賦給變量後,咱們就能夠像使用普通環境變量同樣使用它們了,如:echo"${AWS ACCESS KEY ID}"。

Username with password:

file

​ 與 Secret text 不一樣的是,咱們須要經過 BITBUCKET CREDS USR 拿到用戶名的值,經過BITBUCKET CREDS PSW拿到密碼的值。而變量BITBUCKET CREDS的值則是一個字符串,格式爲:<用戶名>:<密碼>。

Secret file:

file

credentials helper方法只支持Secret text、Username with password、Secretfile三種憑證。

使用HashiCorp Vault

(1)安裝HashiCorp Vault插件

file

(2)添加Vault Token憑證

file

(3)配置Vault插件

file

(4) 在pipeline中讀取

file

咱們能夠在environment和steps中使用vault步驟。推薦在environment中使用。

vault步驟的參數以下:

• path,存儲鍵值對的路徑。

• key,存儲內容的鍵。

• vaultUrl(可選),vault服務地址。

• credentialsId(可選),vault服務認證的憑證。

若是不填vaultUrl與credentialsId參數,則使用系統級別的配置。

在Jenkins日誌中隱藏敏感信息

​ 若是使用的是credentials helper方法或者withCredentials步驟爲變量賦值的,那麼這個變量的值是不會被明文打印到Jenkins日誌中的。除非使用如下方法:

file

在沒有使用credential的場景下,咱們又該如何在日誌中隱藏變量呢?可使用Masked Pass-word插件。經過該插件提供的包裝器,能夠隱藏咱們指定的敏感信息。

file

初次使用 Masked Password 插件很容易覺得是使用 s1 和 s2 做爲變量的,如 echo"被隱藏的密文:${s1} 和 ${s2}"。實際上,var參數只是用於方便在自由風格的Jenkins項目中區分不一樣的須要隱藏的密文。在pipeline中使用,它就沒有存在的意義了。可是即便這樣也不能省略它,必須傳一個值。password參數傳的是真正要隱藏的密文。

那麼,爲何echo "secret1"這條語句中並無使用預約義的變量,secret1也會被隱藏呢?這是由Masked Password插件的實現方式決定的。

Jenkins 提供了 ConsoleLogFilter 接口,能夠在日誌打印階段實現咱們本身的業務邏輯。Masked Password 插件實現了 ConsoleLogFilter 接口,而後利用正則表達式將匹配到的文本replaceAll成********。

MaskPasswordsBuildWrapper包裝器除了支持varPasswordPairs參數,還支持varMaskRegexes參數,使用自定義的正則表達式匹配須要隱藏的文本。寫法以下:

file

經過Masked Password插件還能夠設置全局級別的密文隱藏,在Manage Jenkins→ConfigureSystem頁中能夠找到,具體配置如圖
file

相關文章
相關標籤/搜索