在自動化流程中,我們不可避免地需要調用 API Token、資料庫密碼或 SSH 私鑰。將這些敏感資訊硬編碼在 Jenkinsfile 或儲存在 Jenkins 內建的 credentials 系統中雖然可行,但當規模擴大到跨團隊、多環境時,這種做法會產生「密鑰碎片化」與「權限失控」的風險。
本篇將介紹如何整合 HashiCorp Vault 進行專業級的秘密管理。
相較於傳統方案,Vault 提供了更強大的安全性與管理能力:
雖然可以使用 Token 進行驗證,但針對 Jenkins 這種自動化系統,我們推薦使用 AppRole。這是一種類似於 OAuth2 的機器對機器 (M2M) 驗證方式,透過 RoleID 與 SecretID 的組合來換取臨時 Token,安全性更高。
# 定義 Jenkins 專屬 Policy
path "secret/data/jenkins/*" {
capabilities = ["read"]
}
Manage Jenkins -> System。http://<VAULT_IP>:8200
Vault Token 或 AppRole 憑證。透過 withVault 指令,我們可以實現「隨取隨用」且「不留痕跡」的密鑰調度。
node('dotnet') {
// 定義要讀取的路徑與對應鍵值
// engineVersion: 2 代表使用支援版本控制的 KV v2 引擎
def secrets = [
[path: 'secret/jenkins/gitlab', engineVersion: 2, secretValues: [
[envVar: 'GIT_TOKEN', vaultKey: 'token']
]]
]
withVault(configuration: [vaultUrl: 'http://<VAULT_IP>:8200', vaultCredentialId: 'vault-approle'], secrets: secrets) {
// 取得的 GIT_TOKEN 會被注入為環境變數
sh "curl -H 'PRIVATE-TOKEN: ${GIT_TOKEN}' https://gitlab.com/api/v4/projects"
}
}
Jenkins 插件會自動將從 Vault 取得的字串標記為敏感資訊。在 Console Output 中,任何嘗試印出 ${GIT_TOKEN} 的行為都會被轉換為 ****。這確保了密鑰不會在 CI 日誌中留下任何蹤跡。
透過 Jenkins 與 Vault 的整合,我們將「秘密管理」從「開發流程」中剝離,移交給專業的安全系統處理。這種做法降低了金鑰外洩的可能性,並讓環境遷移(如從 Test 到 Prod)變得更加透明與安全。
下一天,我們將把這套安全機制應用在實戰的品質掃描 Workflow 中,完成從建置、分析到品質門檻(Quality Gate)的完整聯動。