保護 Azure Pipelines 中的秘密
Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
本文提供保護 Azure Pipelines 中秘密的最佳做法。 祕密是指任何您想要嚴密控制存取的項目,例如 API 金鑰、密碼、憑證或密碼編譯金鑰。
Azure Pipelines 不會產生祕密值。 不過,您可能需要將祕密新增至管線,以儲存 API 金鑰等敏感資料。 若要深入了解如何設定祕密變數,請參閱設定祕密變數。
如果有其他方法可用,請勿使用秘密
保護秘密的最佳方法是第一次沒有秘密。 檢查您的管線是否可以使用與使用秘密來執行工作不同的方法。
- 使用服務連線:
- 當您以 Azure 或其他服務為目標時,請使用服務連線,而不是在變數中管理秘密。
- 服務連線可讓您安全地連線到外部服務,而不需直接在管線設定中公開敏感性資訊。
- 如需詳細資訊,請參閱 管理服務連線 和 使用 Azure Resource Manager 服務連線連線連線連線至 Microsoft Azure。
使用受控識別:
- 請考慮使用受控識別,而不是直接處理秘密。
- 受控識別可讓您的應用程式和服務向 Azure 服務驗證安全性,而不需要明確的認證。
- 您可以使用 受控識別來存取其他 Azure 服務。
Azure CLI 工作:
- 如果您使用 Azure CLI 工作,請在管線中考慮使用
addSpnToEnvironment
設定來存取腳本中的服務主體詳細數據,而不需明確傳遞秘密。
- 如果您使用 Azure CLI 工作,請在管線中考慮使用
如需詳細資訊,請參閱 使用服務主體和受控識別
使用秘密變數
請勿將敏感性值儲存為純文本,並儲存在 Azure Pipelines .yml 檔案中。
秘密變數可用於私人資訊,例如密碼、標識符,以及您不想在管線中公開的其他識別數據。 建議您使用 Azure 金鑰保存庫 來設定秘密變數。 您也可以在 UI 或變數群組中設定秘密變數。 不建議使用記錄命令來設定秘密變數。 當您使用記錄命令設定秘密時,任何可以存取管線的人員也可以看到秘密。
秘密變數會加密,而且可以在管線中使用,而不公開其值。 雖然不會公開其值,但絕不會以輸出的形式回應秘密,也不會在命令行上傳遞秘密。 相反地,我們建議您將祕密對應至環境變數。
當您建立秘密時,請遵循 變數命名指導方針 ,並確定您的秘密名稱不會揭露敏感性資訊。
限制對秘密變數的存取
若要限制 Azure DevOps 中秘密的存取,請遵循下列最佳做法:
- 將您的秘密儲存在 Azure 金鑰保存庫。 使用 Azure 金鑰保存庫,您就可以使用 Azure 的角色型存取控制模型來限制對秘密或秘密群組的存取。
- 在管線的UI中設定秘密變數。 在管線的管線設定 UI 中設定的祕密變數,其範圍會限定於設定所在的管線。 因此,您可以擁有只有可存取該管線之使用者的秘密。
- 在變數群組中設定秘密。 變數群組會遵循連結 庫安全性模型。 您可以控制誰可以在文檔庫中定義新專案,以及誰可以使用現有的專案。
不要將秘密寫入記錄
Azure Pipelines 會儘可能嘗試從記錄中清除秘密,但並非萬無一失。 避免將祕密回應至主控台、在命令列參數中使用祕密,或將其記錄到檔案。 當您使用輸出敏感性資訊的 Azure CLI 命令時,請小心。 None output format
如果您需要從 Azure CLI 呼叫擷取秘密,Use none output format and retrieve security information to a secret variable
請使用 和 。
請勿使用結構化數據做為秘密
請避免使用 JSON、XML 或 YAML 等結構化數據格式來封裝秘密值,包括歸位字元、 \r
和換行\n
字元等控制字元。 相反地,請為每個敏感性值建立個別的秘密。 此方法可確保更好的修訂精確度,並將不小心公開敏感數據的風險降到最低。
稽核秘密的處理方式
若要稽核 Azure Pipelines 中使用秘密的方式,請遵循下列最佳做法:
- 檢閱原始碼: 檢查裝載管線之存放庫的原始程式碼。 若要確保正確處理秘密,請檢查管線中使用的任何工作。 例如,確認秘密不會不小心傳送至非預期的主機,或明確地列印到記錄輸出。
- 檢查執行記錄: 測試有效且無效的輸入之後,請檢視管線的執行記錄。 請確定秘密已正確修改,且不會公開。 有時候,命令或工具中的錯誤可能會不小心將秘密洩漏到錯誤記錄檔中。 雖然 Azure Pipelines 嘗試從記錄中清除秘密,但手動檢閱仍然很重要。
稽核和輪替秘密
若要稽核和輪替秘密,請遵循下列最佳做法:
- 檢閱已註冊的秘密: 定期評估管線中註冊的秘密。 確認它們仍是必要的,並移除不再需要的任何專案,這有助於降低雜亂和潛在的安全性風險。
- 輪替秘密: 定期輪替秘密,以將遭入侵秘密惡意探索的時間範圍降到最低。 藉由定期變更秘密,您可以增強安全性。
- 選擇正確的驗證方法
- 使用的秘密型態:
- 個人存取令牌 (PAT): 這些令牌用於驗證。 選擇正確的驗證方法時,請遵循安全性最佳做法。 您可以使用 REST API 來管理 PAT。
- 秘密變數:使用秘密變數安全地儲存機密資訊,例如 API 金鑰、密碼,或管線中的其他認證。
- Azure 金鑰保存庫 秘密:使用 Azure 金鑰保存庫 安全地儲存和管理秘密。
- 服務連線: 這些服務連線可讓您的管線連線到外部服務(例如 Azure、GitHub、Docker Hub)。 請確定服務連線秘密的適當設定和安全處理。
- 使用的秘密型態:
使用 YAML 範本
使用範本,而不是直接在管線 YAML 中包含內嵌腳本與秘密參數。 此方法會藉由將敏感性資訊從主要管線中抽象化,來增強安全性。
若要實作此方法,請為您的腳本建立個別的 YAML 檔案,然後將該腳本儲存在個別的安全存放庫中。 然後,您可以參考範本,並在 YAML 中傳遞秘密變數作為參數。 安全變數應該來自 Azure 金鑰保存庫、變數群組或管線 UI。 如需使用範本的詳細資訊,請參閱 範本使用方式參考。
使用分支原則和變數群組許可權限制秘密
若要確定秘密系結至 main
分支,且無法存取隨機分支,您可以使用變數群組許可權、條件式作業插入和分支原則的組合。
使用分支原則,您可以強制執行 只允許主要分支組建的組建驗證 原則。 然後,您可以使用 變數群組許可權 來確保只有授權的管線可以存取儲存在變數群組中的秘密。 最後,您可以使用管線中的條件,確定變數群組只能由推送至 main
分支來參考。
jobs:
- job: ExampleJob
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "This runs only for the main branch"
displayName: 'Conditional Step'
variables:
- group: your-variable-group-name