從管線保護 Azure Repos 的存取
Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
您的存放庫對於您的業務成功至關重要,因為它們會建置支援您作業的程序代碼。 應謹慎控制存放庫的存取權。 本文會引導您在存取 Azure Repos 時增強 組建管線 和 傳統發行管線 安全性,以降低未經授權的存取風險。
若要確保 Azure 存放庫的安全存取,請啟用下列切換:
- 將作業授權範圍限制為非發行管線的目前專案
- 將作業授權範圍限制為發行管線的目前專案
- 保護 YAML 管線中存放庫的存取
基本流程圖
若要保護您的管線,下列步驟在所有管線中都類似:
- 識別管線需要存取相同組織內,但跨不同專案存取的 Azure Repos 存放庫。
若要這樣做,請檢查您的管線,或啟用 將作業授權範圍限製為目前專案的 (非)發行管線,並記下管線 無法簽出哪些存放庫。子模組存放庫可能不會在第一次失敗的執行中顯示。 - 針對包含管線需要存取之存放庫的每個專案 ,將管線的組建身分識別存取權授與該專案。
- 為管線的組建身分識別授與管線取出之每個存放庫的讀取許可權。
- 為管線的組建身分識別授與管線簽出且位於相同專案中的每個存放庫,該存放庫的讀取許可權可做為存放庫的子模組。
- 啟用將作業授權範圍限制為非發行管線的目前專案、將作業授權範圍限制為發行管線的目前專案,以及保護對 YAML 管線中存放庫的存取。
建置管線
為了說明在管線存取 Azure Repos 時改善管線安全性所採取的步驟,我們會使用下列範例。
- 假設您正在處理
SpaceGameWeb
裝載於專案、fabrikam-tailspin/SpaceGameWeb
Azure Repos 存放庫中的SpaceGameWeb
管線。 - 您的
SpaceGameWeb
管線會SpaceGameWebReact
簽出相同專案中的存放庫,以及專案中的FabrikamFiber
fabrikam-tailspin/FabrikamFiber
和FabrikamChat
存放庫。 - 存放
FabrikamFiber
庫會使用存放FabrikamFiberLib
庫作為子模組,裝載於相同的專案中。 - 專案的
SpaceGameWeb
存放庫結構看起來像在下列螢幕快照中。 - 專案的
FabrikamFiber
存放庫結構看起來像在下列螢幕快照中。 - 假設您的專案未設定為使用以項目為基礎的組建身分識別,或保護對 YAML 管線中存放庫的存取。 此外,假設您已成功執行管線。
針對建置管線使用以項目為基礎的組建身分識別
在管線執行期間,身分識別會用來存取資源,例如存放庫、服務聯機和變數群組。 管線可以利用兩種類型的身分識別:專案層級和集合層級。 前者優先處理安全性,而後者則強調容易使用。 如需詳細資訊,請參閱 限定範圍的組建身分識別 和 作業授權範圍。
為了增強安全性,請在執行管線時使用專案層級身分識別。 這些身分識別只能存取其相關聯專案中的資源,將惡意執行者未經授權存取的風險降到最低。
若要將管線設定為使用專案層級身分識別,請針對非發行管線設定,將作業授權範圍限制為目前的專案。
在我們的執行範例中,當此切換關閉時, SpaceGameWeb
管線可以存取所有專案中的所有存放庫。 切換開啟時, SpaceGameWeb
只能存取專案中的資源 fabrikam-tailspin/SpaceGameWeb
,因此只能 SpaceGameWeb
存取 和 SpaceGameWebReact
存放庫。
如果您執行範例管線,當您開啟切換開關時,管線會失敗,而錯誤記錄會告訴您 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.
若要修正結帳問題,請遵循本文基本程式一節中所述的步驟。
此外,在使用這些存放庫的存放庫之前,先明確取出子模組存放庫。 在我們的範例中,這表示存放 FabrikamFiberLib
庫。
如果您執行我們的範例管線,它會成功。
進一步設定
若要進一步改善存取 Azure Repos 時的安全性,請考慮啟用 保護 YAML 管線中存放庫的存取權。
SpaceGameWeb
假設管線是 YAML 管線,而且其 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: 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 管線中存放庫的存取
Azure DevOps 為 Azure Repos 存放庫提供更細緻的許可權機制,其形式是 保護 YAML 管線中存放庫的 存取權。 此設定可讓 YAML 管線明確要求存取 所有 Azure Repos 存放庫的許可權,而不論其所屬的項目為何。 如需詳細資訊,請參閱 存取存放庫。 此設定不會影響簽出其他類型的存放庫,例如 GitHub 裝載的存放庫。
在我們的執行範例中,當開啟此設定時,SpaceGameWeb
管線會要求許可權以存取SpaceGameWebReact
專案中的fabrikam-tailspin/SpaceGameWeb
存放庫,以及專案中的 FabrikamFiber
fabrikam-tailspin/FabrikamFiber
和 FabrikamChat
存放庫。
當您執行範例管線時,它會建置類似下列範例。
授與管線存放庫或資源的許可權。
您的管線執行,但失敗,因為它無法將存放 FabrikamFiberLib
庫簽出為 的 FabrikamFiber
子模組。 若要解決此問題,請在步驟之前-checkout: FabrikamFiber
新增步驟,明確地查看 。FabrikamFiberLib
- checkout: git://FabrikamFiber/FabrikamFiberLib
範例管線成功。
我們最後的 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
疑難排解
針對任何發生的問題,請使用下列解決方案。
您在命令列中使用 git 來簽出相同組織中的存放庫
例如,您使用 - script: git clone https://$(System.AccessToken)@dev.azure.com/fabrikam-tailspin/FabrikamFiber/_git/OtherRepo/
。 開啟 YAML 管線設定中的 [保護存放庫存取權] 設定時,命令會失敗。
若要解決此問題,請使用 checkout
命令簽出存放OtherRepo
庫,例如 - checkout: git://FabrikamFiber/OtherRepo
。
存放庫使用另一個存放庫作為子模組
假設管線取出的其中一個存放庫會使用另一個存放庫(在相同的專案中)作為子模組,如同和存放庫的範例FabrikamFiber
FabrikamFiberLib
所示。 深入瞭解 如何查看子模組。
此外,假設您已提供SpaceGame
此存放庫的組建身分識別讀取許可權,但簽出FabrikamFiberLib
子模組時,FabrikamFiber
存放庫的簽出仍然失敗。
若要解決此問題,請藉由在問題之前-checkout: FabrikamFiber
新增- checkout: git://FabrikamFiber/FabrikamFiberLib
步驟,明確地簽出 FabrikamFiberLib
。
傳統發行管線
為了說明您需要採取的步驟,我們會使用執行中的範例。 在我們的範例中fabrikam-tailspin/FabrikamFiberDocRelease
,專案中有名為 FabrikamFiberDocRelease
的發行管線。 假設管線會簽出專案中的FabrikamFiber
fabrikam-tailspin/FabrikamFiber
存放庫、執行命令來產生公用檔,然後將它發佈至網站。 此外,假設存放 FabrikamFiber
庫會使用存放 FabrikamFiberLib
庫(在相同的專案中)作為子模組。
針對傳統發行管線使用以項目為基礎的組建身分識別
當管線執行時,它會使用身分識別來存取各種資源,例如存放庫、服務連線、變數群組。 管線可以使用兩種類型的身分識別:專案層級一和集合層級一。 前者提供更好的安全性。 後者提供易於使用。 深入瞭解 限定範圍的組建身分識別 和 作業授權範圍。
建議您使用專案層級身分識別來執行管線。 根據預設,專案層級身分識別只能存取其所屬專案中的資源。 使用此身分識別可改善安全性,因為它可減少惡意人員在劫持管線時取得的存取權。
若要讓您的管線使用專案層級身分識別,請針對發行管線設定,將作業授權範圍限製為目前的專案。
在我們的執行範例中,當此切換關閉時, FabrikamFiberDocRelease
發行管線可以存取所有專案中的所有存放庫,包括存放 FabrikamFiber
庫。 切換開啟時, FabrikamFiberDocRelease
只能存取專案中的資源 fabrikam-tailspin/FabrikamFiberDocRelease
,因此存放 FabrikamFiber
庫會變成無法存取。
如果您執行範例管線,當您開啟切換開關時,管線會失敗,而記錄會告訴您 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.
若要修正這些問題,請遵循本文基本程式一節中的步驟。
我們的範例管線成功。