Azure DevOps 服務 |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020
為了保護執行其作業的程式碼,組織必須仔細控制對其原始程式碼儲存庫的存取。 本文說明 Azure Pipelines 建置和發行管線如何安全地存取存放庫,以將未經授權存取的風險降到最低。
本文是一系列的一部分,可協助您實作 Azure Pipelines 的安全性措施。 如需詳細資訊,請參閱 保護 Azure Pipelines。
先決條件
| 類別 | 要求 |
|---|---|
| Azure DevOps | - 在讓 Azure DevOps 安全且保護 Azure Pipelines 中實作建議。 - YAML 和 Azure Pipelines 的基本知識。 如需詳細資訊,請參閱 建立您的第一個管線。 |
| 權限 | - 若要修改管線許可權: 專案管理員群組的成員。 - 若要修改組織許可權: 專案集合系統管理員群組的成員。 |
管線的專案型身分識別
管線會在執行期間使用身分識別來存取資源,例如存放庫、服務連線和變數群組。 管線可以使用兩種類型的身分識別:集合層級或專案層級。
集合層級身分識別易於設定和使用,但專案層級身分識別會優先考慮安全性。 若要增強安全性,請使用專案層級身分識別來操作管線。 專案層級身分識別只能存取其專案內的資源,從而最大限度地減少惡意行為者未經授權存取的影響。 如需詳細資訊,請參閱 範圍建置身分識別 和 工作授權範圍。
若要將管線設定為使用專案層級身分識別,您需要在管線專案的專案設定下的管線設定中,針對非發行管線啟用 [>] 或針對發行管線啟用 [將作業授權範圍限制為目前專案]。
改善儲存庫存取安全性的步驟
專案系統管理員或專案集合系統管理員可以採取下列步驟來改善從管線存取 Git 存放庫的安全性。
檢查管線,以識別其他專案中的任何必要儲存庫。 如果您啟用 [將作業授權範圍限制為目前專案的非發行管線],管線只能從目前專案的存放庫簽出程式碼。
提供管線專案所需的任何其他專案的存取權限。 如需詳細資訊,請參閱 設定專案的許可權,以存取相同專案集合中的另一個專案。
授與管線建置身分識別對每個他們簽出的存放庫的 讀取 存取權。此外,授與管線身分識別對於任何被作為所需存放庫之子模組使用的存放庫的 讀取 存取權。 如需詳細資訊,請參閱 設定存取相同專案集合中另一個存放庫的許可權。
為管線專案啟用下列組織或專案設定:
- 將作業授權範圍限制為非發行管線的目前專案。
- 如果您的專案有發行管線,請將作業授權範圍限制為發行管線的目前專案。
- 如果您的專案有 Azure Repos YAML 管線,請保護 YAML 管線中存放庫的存取權。
在 組織設定 或 專案設定、管線、>、一般 中,將其切換設為 >,以啟用這些設定。
如果在 [組織設定] 中啟用設定,則無法在 [專案設定] 中覆寫它們。 如果未在 組織設定中啟用設定,則可以在專案層級啟用。
使用儲存庫作為子模組
如果一個存放庫在其專案中使用了另一個存放庫作為子模組,即使您將兩個存放庫的讀取權限給與管道,簽出子模組時也可能會失敗。 若要解決此問題,請先明確檢出子模組儲存庫,然後再檢出使用這些子模組的儲存庫。 如需詳細資訊,請參閱 查看子模組。
GitHub 存放庫
下列安全性考量適用於 GitHub 存放庫的管線存取。 如需詳細資訊,請參閱 存取 GitHub 存放庫。
GitHub 服務連線
若要使用 GitHub 存放庫,Azure Pipelines 需要 GitHub 服務連線。 加強服務連線安全性:
- 只允許存取管線執行所需的存放庫。
- 請勿選取 [授與服務連線所有管線的存取權限 ]。 明確授權每個使用它的管線的服務連線。
對 GitHub 存放庫的驗證
若要在組建期間觸發組建並擷取程式代碼,必須授與 Azure Pipelines GitHub 存放庫的存取權。 此存取可以使用 GitHub 個人存取權杖 (PAT) 、OAuth 或 GitHub Azure Pipelines 應用程式驗證。 如需詳細資訊,請參閱 存取 GitHub 存放庫。
GitHub Azure Pipelines 應用程式是持續整合 (CI) 管線的建議驗證類型。 組建和 GitHub 狀態更新接著會使用 Azure Pipelines 身分識別,而不是使用您的個人 GitHub 身分識別。 安裝應用程式時,您可以限制應用程式可以存取哪些儲存庫以提高安全性。
OAuth 和 PAT 驗證會使用您的個人 GitHub 身分識別,而且必須獲得管線存取授權。 出於安全考慮,不建議使用 PAT。 如果您必須使用 PAT 驗證,請選擇精細的 PAT,並將範圍限制為特定使用者、存放庫和許可權。 如需相關資訊,請參閱 管理您的個人存取權杖。
備註
如果您為 GitHub 組織中的所有存放庫安裝 GitHub 應用程式,則應用程式使用的權杖可以存取組織中的所有私人和公用存放庫。 為了提高安全性,請將私人存放庫分隔到個別的組織中,或明確選取應用程式可以存取的存放庫。
派生的 GitHub 儲存庫
分叉的儲存庫會增加管道中惡意程式碼執行或敏感資訊發布的風險。 源自組織外部的衍生專案會帶來特殊風險。
若要將分支存放庫的風險降到最低,預設會在 [專案設定] 或 [組織設定管線>設定>觸發程式] 中啟用 >] 和 [停用從分支存放庫建置提取要求]。
若要允許從分支的 GitHub 存放庫建置,但降低風險,請選取 [從分支存放庫安全地建置提取要求]。 此設定不允許提供秘密或使用與一般組建相同的許可權,而且需要小組成員的 PR 批注才能觸發管線。
或者,您可以選取 [自訂規則] ,以從 分支存放庫建置提取要求 ,以進一步自訂這些設定。
提高分叉安全性的其他方法包括:
如果您使用拉取請求驗證來觸發組建,請在管線定義的 觸發 區段中取消選取 從此存放庫的分支建置拉取請求,或確保已取消選取 讓秘密可供分支組建使用 和 讓分支組建具有與一般組建相同的許可權。 您也可以選取 [在建置提取要求之前需要小組成員的註解]。
使用 Microsoft 裝載的代理程式從分支建置。 然後,資源會在建置之後立即從代理程式中刪除。 如果您使用自託管代理程式,請定期清理和更新代理程式,或針對不同的分叉或分支使用個別的代理程式。
Azure Repos 儲存庫
保護 YAML 管線中存放庫的存取
保護在 YAML 管線中存放庫的存取權的專案或組織設定提供對 YAML 管線的細緻權限控制。 此設定會讓 YAML 管線明確要求存取任何存放庫的許可權,而不論專案為何。 如需詳細資訊,請參閱 保護 YAML 管線中存放庫的存取權。
備註
[保護 YAML 管線中存放庫的存取權] 設定不適用於 GitHub 存放庫。
啟用此設定時,Azure Repos YAML 管線一律會在第一次執行時要求存取存放庫的許可權。 您會看到類似以下螢幕擷取畫面的權限要求:
選取 [允許] 以授與管線存放庫或資源的許可權。 管道現在已經成功。
使用 Git 指令列來簽出其他儲存庫
命令列指令碼 (例如 git clone https://github/fabrikam-tailspin/FabrikamFiber/_git/OtherRepo/ ) 可能會失敗,當啟用 [保護 YAML 管線中存放庫的存取 權] 時。 若要解決此問題,請使用OtherRepo指令明確地檢出checkout存放庫,例如checkout: git://FabrikamFiber/OtherRepo指令。
Azure Repos 範例
下列範例說明改善管線中 Azure Repos 存取安全性的程式。
該 https://dev.azure.com/fabrikam-tailspin 組織包含 SpaceGameWeb 和 FabrikamFiber 項目。
SpaceGameWeb 專案包含 SpaceGameWeb 和 SpaceGameWebReact 儲存庫。
FabrikamFiber 專案包含 FabrikamFiber、FabrikamChat 和 FabrikamFiberLib 存放庫。 FabrikamFiber 存放庫會使用 FabrikamFiberLib 存放庫做為子模組。
SpaceGameWeb 專案中的 SpaceGameWeb 管線會簽出 SpaceGameWeb 專案中的 SpaceGameWebReact 存放庫,以及 FabrikamFiber 專案中的 FabrikamFiber 和 FabrikamChat 存放庫。
如果專案未設定為使用專案型組建身分識別,或保護 YAML 管線中存放庫的存取權,則 SpaceGameWeb 管線可以存取組織中所有專案中的所有存放庫,並成功執行。
使用專案層級身分識別
若要改善安全性,請使用專案層級身分識別來執行管道。 在 專案設定 或 組織設定 中,啟用 將作業授權範圍限制到非發行管線的目前專案 的切換選項。
如果啟用此設定,管線只能存取 SpaceGameWeb 專案中的資源,其中僅包含 SpaceGameWeb 和 SpaceGameWebReact 儲存庫。 管道失敗,因為它無法簽出 FabrikamFiber 專案中的存放庫。
您會看到錯誤 remote: TF401019: The Git repository with name or identifier FabrikamChat does not exist or you do not have permissions for the operation you are attempting 和 remote: TF401019: The Git repository with name or identifier FabrikamFiber does not exist or you do not have permissions for the operation you are attempting。
若要修正問題,請授與管線專案對 FabrikamFiber 專案的存取權,並將管線身分識別授與 FabrikamFiber、FabrikamChat 和 FabrikamFiberLib 存放庫的讀取存取權。
明確檢出子模組
FabrikamFiber 存放庫會使用 FabrikamFiberLib 存放庫做為子模組。 即使您授與管線這兩個存放庫的存取權,在簽出 FabrikamFiberLib 子模組時,FabrikamFiber 存放庫簽出仍然會失敗。
若要修正此問題,請先明確簽出 FabrikamFiberLib 存放庫,再簽出 FabrikamFiber 存放庫。 在checkout: git://FabrikamFiber/FabrikamFiberLib步驟之前新增一個checkout: FabrikamFiber步驟。 範例管線現在已經成功。
保護 YAML 工作流程的存取
如果範例 SpaceGameWeb 管線是 YAML 管線,且已啟用 [保護 YAML 管線中存放庫的存取 權],則管線需要在第一次執行時存取 SpaceGameWebReact、 FabrikamFiber 和 FabrikamChat 存放庫的許可權。
下列程式碼顯示完整的 YAML 管線。
trigger:
- main
pool:
vmImage: ubuntu-latest
resources:
repositories:
- repository: SpaceGameWebReact
name: SpaceGameWeb/SpaceGameWebReact
type: git
- repository: FabrikamFiber
name: FabrikamFiber/FabrikamFiber
type: git
- repository: FabrikamChat
name: FabrikamFiber/FabrikamChat
type: git
steps:
- script: echo "Building SpaceGameWeb"
- checkout: SpaceGameWebReact
- checkout: FabrikamChat
condition: always()
- checkout: git://FabrikamFiber/FabrikamFiberLib
- checkout: FabrikamFiber
submodules: true
condition: always()
- script: |
cd FabrikamFiber
git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" submodule update --recursive --remote
- script: cat $(Build.Repository.LocalPath)/FabrikamFiber/FabrikamFiberLib/README.md
更多儲存庫安全措施
若要降低 YAML 和傳統管線共用資源的安全性風險,請在 [專案設定] 或 [組織設定] 中開啟 [停用建立傳統組建管線] 和 [停用建立傳統發行管線] 切換,以停用傳統管線的建立。 傳統組建和發行管線建立預設會針對新組織停用。
使用管道範本 來定義管道結構,並協助防止惡意程式碼滲透。 範本也可以自動執行認證掃描或對受保護資源強制執行檢查等工作。
使用 受保護的分支檢查 來防止流水線在未經授權的分支上自動執行。
將存放庫設定為僅在指定的 YAML 管線中使用。 如需詳細資訊,請參閱 將管線許可新增至存放庫資源。
僅為流水線
resources中所列的存放庫提供存取權杖,以限制 Azure Pipelines 存取權杖的範圍。 如需詳細資訊,請參閱 存放庫保護。