憑證(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
而後單擊「Global credentials (unrestricted)」連接,再單擊「Add Credentials」ide
Jenkins默認支持如下憑證類型:Secret text、Username with password、Secret file、SSHUsername with private key、Certificate:PKCS#十二、Docker Host CertificateAuthentication credentials。函數
Secret text是一串須要保密的文本,好比GitLab的API token。
ui
Username with password指用戶和密碼憑證。加密
Secret file指須要保密的文本文件。使用Secret file時,Jenkins會將文件複製到一個臨時目錄中,再將文件路徑設置到一個變量中。構建結束後,所複製的Secret file會被刪除。插件
SSH Username with private key指一對SSH用戶名和密鑰。3d
添加憑證後,安裝Credentials Binding Plugin插件,經過其提供的withCredentials步驟就能夠在pipeline中使用憑證了。
Secret text
Username with password
Secret file
SSH Username with private key
sshUserPrivateKey函數還支持如下參數。
• usernameVariable:SSH用戶名的變量名。
• passphraseVariable:SSH key密碼的變量名。
Secret text:
AWS-SECRET-KEY-ID和AWS-SECRET-ACCESS-KEY是咱們預先定義的憑證ID。creden-tials方法將憑證的值賦給變量後,咱們就能夠像使用普通環境變量同樣使用它們了,如:echo"${AWS ACCESS KEY ID}"。
Username with password:
與 Secret text 不一樣的是,咱們須要經過 BITBUCKET CREDS USR 拿到用戶名的值,經過BITBUCKET CREDS PSW拿到密碼的值。而變量BITBUCKET CREDS的值則是一個字符串,格式爲:<用戶名>:<密碼>。
Secret file:
credentials helper方法只支持Secret text、Username with password、Secretfile三種憑證。
(1)安裝HashiCorp Vault插件
(2)添加Vault Token憑證
(3)配置Vault插件
(4) 在pipeline中讀取
咱們能夠在environment和steps中使用vault步驟。推薦在environment中使用。
vault步驟的參數以下:
• path,存儲鍵值對的路徑。
• key,存儲內容的鍵。
• vaultUrl(可選),vault服務地址。
• credentialsId(可選),vault服務認證的憑證。
若是不填vaultUrl與credentialsId參數,則使用系統級別的配置。
若是使用的是credentials helper方法或者withCredentials步驟爲變量賦值的,那麼這個變量的值是不會被明文打印到Jenkins日誌中的。除非使用如下方法:
在沒有使用credential的場景下,咱們又該如何在日誌中隱藏變量呢?可使用Masked Pass-word插件。經過該插件提供的包裝器,能夠隱藏咱們指定的敏感信息。
初次使用 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參數,使用自定義的正則表達式匹配須要隱藏的文本。寫法以下:
經過Masked Password插件還能夠設置全局級別的密文隱藏,在Manage Jenkins→ConfigureSystem頁中能夠找到,具體配置如圖