保護 Azure Pipelines 中的秘密
本文提供保護 Azure Pipelines 中秘密的最佳做法。 祕密是指任何您想要嚴密控制存取的項目,例如 API 金鑰、密碼、憑證或密碼編譯金鑰。
Azure Pipelines 不會產生祕密值。 不過,您可能需要將祕密新增至管線,以儲存 API 金鑰等敏感資料。 若要深入了解如何設定祕密變數,請參閱設定祕密變數。
如果有其他方法可用,請勿使用秘密
保護秘密的最佳方法是一開始沒有秘密。 檢查您的管線是否可以使用與使用秘密來執行工作不同的方法。
- 使用服務連線。 例如,如果您的目標是 Azure 或其他使用服務連線的服務,您應該使用服務連線,而不是在變數中管理秘密。 如需詳細資訊,請參閱使用ARM服務連線來管理服務連線和 連線 至 Microsoft Azure。
- 偏好受控識別,而不是使用秘密。
- 可使用受控識別來存取其他服務的 Azure 服務
- 什麼是 Azure 資源受控識別?
- 如果您使用 Azure CLI 工作,您可以使用
addSpnToEnvironment
設定來存取腳本中的服務主體詳細數據。 - 使用服務主體和受控識別
使用秘密變數
敏感性值絕不應儲存為純文本在 Azure Pipelines .yml 檔案中。
秘密變數可用於私人資訊,例如密碼、標識符,以及您不想在管線中公開的其他識別數據。 設定秘密變數的建議方式是使用 Azure 金鑰保存庫。 您也可以在 UI 或變數群組中設定秘密變數。 不建議使用記錄命令來設定秘密變數。 當您使用記錄命令設定秘密時,任何可以存取管線的人都能看到秘密。
秘密變數會加密,而且可以在管線中使用,而不公開其值。 雖然不會公開其值,但絕不會以輸出的形式回應秘密,也不會在命令行上傳遞秘密。 相反地,我們建議您將祕密對應至環境變數。
當您建立秘密時,請遵循 變數命名指導方針 ,並確定您的秘密名稱不會揭露敏感性資訊。
限制對秘密變數的存取
若要限制對 Azure DevOps 中秘密的存取,您可以:
- 將您的秘密儲存在 Azure 金鑰保存庫。 使用 Azure 金鑰保存庫,您就可以使用 Azure 的角色型存取控制模型來限制對秘密或秘密群組的存取。
- 在管線的UI中設定秘密變數。 在管線設定UI中設定的秘密變數會限定於其設定所在的管線。 因此,您可以擁有只有可存取該管線之使用者的秘密。
- 在變數群組中設定秘密。 變數群組會遵循連結 庫安全性模型。 您可以控制誰可以在文檔庫中定義新專案,以及誰可以使用現有的專案。
不要將秘密寫入記錄
Azure Pipelines 會盡可能嘗試從記錄中清除祕密。 此篩選作業係盡力而為,無法攔截祕密可能洩漏的每個方式。 避免將祕密回應至主控台、在命令列參數中使用祕密,或將其記錄到檔案。 例如,某些 Azure CLI 命令輸出資訊,您必須保護。 如果您從管線呼叫 Azure CLI,請使用 None 輸出格式,而且如果您需要從 Azure CLI 呼叫擷取秘密,請使用無輸出格式,並將安全性資訊擷取至秘密變數。
請勿使用結構化數據做為秘密
結構化數據可能會導致記錄檔內的秘密修訂失敗,因為修訂在很大程度上依賴尋找特定秘密值的完全相符專案。 例如,請勿使用 JSON、XML 或 YAML 的 Blob 來封裝秘密值,包括歸位字元(\r
)和換行字元(\n
),因為這樣可大幅降低秘密正確修訂的機率。 相反地,請為每個敏感性值建立個別的秘密。
稽核秘密的處理方式
稽核秘密的使用方式,以協助確保秘密如預期般處理。 您可以檢閱裝載管線之存放庫的原始程式碼,並檢查管線中使用的任何工作,以執行此動作。 例如,檢查它們未傳送至非預期的主機,或明確地列印至記錄輸出。
在測試有效/無效的輸入之後,檢視管線的執行記錄,並檢查秘密是否已正確修改,或未顯示。 您叫用的命令或工具不一定會發出錯誤,而且秘密稍後可能會出現在錯誤記錄中。 Azure Pipelines 會盡可能嘗試從記錄中清除祕密。 此篩選作業係盡力而為,無法攔截祕密可能洩漏的每個方式。 因此,最好在測試有效且無效的輸入之後,手動檢閱管線記錄。
稽核和輪替秘密
定期檢閱管線所使用的已註冊秘密,以確認它們仍然需要,並移除不再需要的秘密。
定期輪替秘密,以減少遭入侵秘密有效期間的時間範圍。
管線使用的秘密型態可能包括:
下一步
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應