保護您的存放庫和管線

已完成

當您使用自動化來部署您的基礎結構時,您的管線和存放庫變得強大且重要。 因為它們現在代表了將變更套用至您受控環境的唯一方式。

Azure DevOps 組織、GitHub 存放庫和管線的許多部分都需要受到保護。 下表提供一些要保護的最重要元素,以及如果您未適當保護這些元素時可能會發生的弱點範例。

要保護的元素 範例弱點
Azure DevOps 組織或 GitHub 存放庫,包括有權存取的人員,以及允許他們執行的動作。 心懷不滿的前員工刪除您的程式碼存放庫。
存放庫中的重要分支,以及變更這些分支上的程式碼需要做什麼。 有人不小心將一些不安全的 Bicep 程式碼認可到存放庫主要分支上。
存放庫內的程式碼,包括基礎結構定義、測試和應用程式程式碼。 有人忘記測試他們撰寫的程式碼,但該程式碼在發行到生產時無法正常運作。
管線定義。 有人不慎新增管線步驟,將資料庫連線字串寫入管線記錄中。
執行管線的代理程式或執行器。 針對草稿提取要求執行的管線會將安全性弱點安裝到代理程式上,供日後用於生產部署。
任何可能在管線內執行的協力廠商工作或元件。 協力廠商管線工作會將服務主體的認證傳送到惡意網站。
管線用來存取 Azure 的服務主體。 非生產服務主體不小心變更了您的生產環境。
管線用來存取外部系統之祕密。 小組成員為原型撰寫新的管線定義檔案,且不小心將其連接到生產環境。

現在讓我們了解一些方法,您可在 Azure DevOps 和 GitHub 中用來套用程式碼存放庫和部署管線相關的治理和控制。

管理使用者和權限

考慮您如何授與 Azure DevOps 組織或 GitHub 存放庫的存取權。 思考誰有權存取,以及其可以做什麼。

最好使用組織的 Microsoft Entra 執行個體作為管線的識別提供者。 這樣,您就可以確保每當有人加入或離開組織時,系統會自動授與或撤銷管線的存取權。 使用 Microsoft Entra ID,您也可以輕鬆實作保護,例如條件式存取和多重要素驗證。

注意

若要使用 Microsoft Entra 與 GitHub 的整合,組織需要 GitHub Enterprise授權。

您也可以建立小組 (在 GitHub) 或群組 (在 Azure DevOps),這代表可以一起授與權限的一組使用者。 如此一來,您不需要個別指派權限。 您可以輕鬆變更使用者的權限,方法是將使用者新增到其中,並從小組或群組中將其移除。

提示

Azure DevOps 使用最低權限權限模型,這與 Azure 使用的模型不同。 在 Azure DevOps 中,拒絕權限會覆寫允許權限。 這意味著如果您被指派給具有不同組權限的多個群組,您只能執行所有群組允許的動作。

請確定您瞭解尤其是指派給群組的權限指派方式。

保護重要的程式碼分支

管線和自動化應該以識別特定程式碼分支為基礎,例如主要。 這些指定分支上的程式碼通常受信任且允許部署到生產環境。 套用控制項以確保已驗證和檢閱您重要分支上的程式碼。

考慮使用分支保護規則 (在 GitHub) 或分支原則 (在 Azure Repos),以防止直接認可重要的程式碼分支。 然後,您可以要求小組使用提取要求來合併任何變更。 您可以套用自動檢查和手動檢閱程序,以確認變更在合併之前是有效的。

測試及檢閱程式碼

請確定小組瞭解您對於檢閱和測試所有程式碼的預期,包括基礎結構定義。

管線定義是 YAML 檔案,因此是程式碼形式。 您需要檢閱及評估管線定義的變更。 否則,有人可能會不小心或惡意建立管線步驟,該步驟會洩漏服務主體的認證,或對 Azure 資產進行危險的變更。

管線定義檔的任何變更都需要徹底檢閱。 請確定小組中的每個人都瞭解管線具有高度權限,因此需要特別注意。

保護管線代理程式和執行器

管線會在代理程式上執行 (適用於 Azure Pipelines) 或執行器 (適用於GitHub Actions)。 您可以將代理程式和執行器視為虛擬機器。 管線定義會執行您所提供的工作和指令碼,以控制這些虛擬機器。

Azure Pipelines 和 GitHub Actions 提供 Microsoft 或 GitHub 設定及維護的託管代理程式和執行器。 平台擁有者將機器設定為符合建議的安全性做法。 平台擁有者的責任包括修補作業系統弱點。

您可以改為選擇使用您自己的實體或虛擬機器,供代理程式和執行器使用。 此類型的機器稱為自我裝載式 代理程式和執行器。 如果您使用自我裝載式代理程式和執行器,您必須負責確保機器的設定正確,並防範威脅。

Microsoft 託管的代理程式和 GitHub 託管的執行器是暫時性的。 任何對代理程式或執行器的檔案或設定變更,都會在管線執行結束時損毀。 如果您自行託管代理程式或執行器,同一台機器可能會用於多個個別的管線或環境,包括生產和非生產環境。 假設有人建立管線定義,該定義會修改代理程式作業系統的一些重要檔案,並從提取要求執行管線。 下次針對生產環境執行部署時,可能會重複使用代理程式。 現在您無法預測損毀的檔案會對生產環境造成什麼影響。

基於這些原因,最好盡可能使用 Microsoft 託管的代理程式和 GitHub 託管的執行器。 如果您必須使用自我裝載執行器,請仔細評估其設定和使用所涉及的風險。

評估在管線內執行的協力廠商元件

如果您使用社群提供的 GitHub Actions 或 Azure DevOps 延伸模組,請瞭解其建立者及其功能。 協力廠商管線元件可能會存取服務主體的認證,因而存取在 Azure 中的整個環境。

在 Azure DevOps 中,組織管理員通常會先核准每個延伸模組,然後才能使用。 如果您是組織的系統管理員,請考慮您所使用之每個元件所涉及的安全性風險。 您必須負責驗證其是否值得信任且安全。

每當您使用協力廠商動作或工作時,請指定該版本。 考慮指定您檢閱的確切版本。 允許管線自動使用更新版本可能會造成您未檢閱的風險。

保護管線的服務主體

管線使用服務主體來存取 Azure 和其他服務。 請務必保護服務主體,並確保不會不當使用其認證。 考慮套用多層保護。

首先,您可以考慮保護服務主體的認證:

  • 盡可能使用受控身分識別工作負載身分識別,以避免完全儲存認證。 雖然您無法使用所有管線搭配使用受控身分識別或工作負載身分識別,但在您能夠這麼做時建議這麼做。
  • 規劃服務主體認證的定期變更或輪換方式。 例如,貴組織可能有每 90 或 120 天輪換認證的原則。 考慮誰將負責輪換,以及如何更新認證的所有使用位置。
  • 請考慮指定一名祕密監管人,其角色是管理祕密、金鑰和憑證,使這些項目不會對組織其他部分公開。

接下來,請考慮您授與服務主體的權限:

  • 將 Microsoft Entra 條件式存取原則套用至管線的服務主體。 這些原則可協助識別有風險的登入和行為。 例如,如果您的管線服務主體一律從某個地理區域登入,條件式存取可以偵測並防止來自非預期位置的登入,這可能表示認證已遭到入侵。
  • 請仔細考慮您授與每個服務主體的權限。 例如,假設您有一個服務主體,可用來讀取共用資源的設定。 請考慮您是否只能授與該服務主體讀取者存取權,因為服務主體不需要執行任何需要更多權限的動作。
  • 針對您指派給服務主體的每個權限使用最小範圍。 例如,如果服務主體只需要部署到單一資源群組,則將角色指派範圍限定到該資源群組,而不是整個訂閱。
  • 針對您的每個環境使用個別的服務主體。 如此一來,即使主體的認證遭到入侵,或有人取得某個環境的存取權,其也無法存取其他環境。

保護服務連線和祕密

服務連線 (Azure Pipelines 中) 或祕密 (GitHub 中) 包含管線用來存取 Azure 環境之服務主體的認證。 請務必保護服務連線和祕密,並控制哪些管線會使用每個服務連線和祕密。 否則,您可能會不小心讓非生產環境使用有權存取生產資源的服務主體。

在 Azure DevOps 中,當您建立服務連線時,您可以將其設定為需要核准,新管線或環境才能加以使用。

Azure DevOps 也能您建立檢查與特定服務連線的關聯。 檢查以新增另一層保護。 例如,您可以在生產服務連線上設定檢查,以確認其只用於存放庫主要分支的程式碼上。 這項檢查有助於防止將未經授權的程式碼部署到生產環境。

在 GitHub 中,您可以設定環境特定的秘密,以便在 GitHub Actions 工作流程使用該環境時,它只會提供秘密值。 您可以使用特定環境的祕密及核准等環境控制項,降低將非生產部署用於部署到生產環境的風險。 您也可以使用工作負載身分識別,來避免在 GitHub Actions 工作流程中使用任何認證,並排除認證可能公開的可能性。

使用 GitHub 安全性功能

GitHub 提供您應評估及使用的安全性功能。 這些功能包括:

  • Dependabot,會掃描原始程式碼的相依性以尋找已知的弱點。
  • 祕密掃描,可識別存放庫中看起來像金鑰或認證的文字。 在存放庫中儲存祕密是一種錯誤的做法。 如果您收到存放庫中某個祕密的警示,您應該考慮遭入侵的該祕密值,然後加以撤銷或變更。
  • 稽核,以瞭解誰對 GitHub 設定進行了變更。
  • 安全性概觀,合併您組織存放庫中所有安全性警示。

使用 Azure DevOps 稽核記錄

Azure DevOps 提供稽核記錄,協助您瞭解誰對管線、分支原則、存放庫及其他資源進行了變更。 建議您啟用稽核並定期檢閱稽核記錄。

保護存放庫和管線

我們已討論您可以套用至存放庫和管線的重要控制項。 現在,讓我們來看看哪些控制項您可用來保護我們稍早在本單元中所列的每個重要元素:

要保護的元素 要套用的控制項
Azure DevOps 組織或 GitHub 存放庫,包括有權存取的人員,以及允許他們執行的動作。
  • 使用 Microsoft Entra ID 進行驗證。
  • 使用小組和群組來指派權限。
  • 啟用稽核記錄,並定期檢閱稽核記錄。
存放庫中的重要分支,以及變更這些分支上的程式碼需要做什麼。 套用分支保護規則或分支原則。
存放庫內的程式碼,包括基礎結構定義、測試和應用程式程式碼。
  • 強制執行程式碼檢閱需求。
  • 新增自動或手動測試。
  • 在 GitHub 上,使用 Dependabot 和祕密掃描。
管線定義。 強制執行程式碼檢閱需求。
執行管線的代理程式或執行器。
  • 在 Azure Pipelines 上,使用 Microsoft 託管的代理程式。
  • 在 GitHub Actions 上,使用 GitHub 託管的執行器。
任何可能在管線內執行的協力廠商工作或元件。 檢閱與所有協力廠商延伸模組和工作相關聯的安全性風險。
管線用來存取 Azure 的服務主體。
  • 在 GitHub Actions 中使用工作負載身分識別。 針對 Azure Pipelines,使用服務主體並定期輪換其認證。
  • 針對每個環境使用個別的服務主體。
  • 套用條件式存取原則。
管線用來存取外部系統之祕密。
  • 在 Azure DevOps 上,使用核准及檢查服務連線。
  • 在 GitHub 上,使用環境特定的祕密和工作負載身分識別。