共用方式為


從管線保護 Azure Repos 的存取

您的存放庫是企業成功的重要資源,因為它們包含可為您的企業提供動力的程序代碼。 不應該輕易地授與存放庫的存取權。

本文說明如何改善管線存取 Azure Repos 的安全性,以限制原始程式碼進入錯誤之手的風險。

讓管線安全存取 Azure 存放庫的設定,是同時啟用了 [針對非發行管線,將作業授權範圍限制在目前的專案]、[針對發行管線,將作業授權範圍限制在目前的專案] 和 [保護 YAML 管線中存放庫的存取] 切換的設定。

我們將討論組建管線和傳統發行管線:

基本流程圖

這些步驟在所有管線中都類似:

  1. 判斷管線需要存取屬於相同組織的 Azure Repos 存放庫清單,但位於不同的專案中。

    您可以藉由檢查管線來編譯存放庫清單。 或者,您可以開啟 [將作業授權範圍限制為目前專案的 (非)發行管線] 切換,並記下管線 無法簽出哪些存放庫。子模組存放庫可能不會在第一次失敗的執行中顯示。

  2. 針對每個包含管線所需存取之存放庫的 Azure DevOps 專案,請遵循步驟,將 管線的組建身分識別存取權授與該專案

  3. 針對您的管線簽出的每個 Azure Repos 存放庫,請遵循步驟,將管線的組建身分識別授與該存放庫的讀取許可權。

  4. 針對管線簽出且位於相同專案中的每個存放庫,這些存放庫會作為子模組使用,請遵循步驟,將管線的組建身分識別授與該存放庫的讀取許可權。

  5. 開啟 [將作業授權範圍限制為非發行管線的目前專案]、將作業授權範圍限制為目前的發行管線專案,以及 [保護對 YAML 管線中存放庫的存取權] 切換。

建置管線

為了說明在管線存取 Azure Repos 時改善管線安全性所採取的步驟,我們將使用執行中的範例。

假設您正在處理 SpaceGameWeb 裝載於專案、 fabrikam-tailspin/SpaceGameWeb Azure Repos 存放庫中的 SpaceGameWeb 管線。 此外,假設您的SpaceGameWeb管線會簽出SpaceGameWebReact相同專案中的存放庫,以及專案中的 FabrikamFiberfabrikam-tailspin/FabrikamFiberFabrikamChat 存放庫。

最後,假設存放 FabrikamFiber 庫使用存放 FabrikamFiberLib 庫作為裝載於相同專案中的子模組。 深入瞭解 如何查看子模組

專案的 SpaceGameWeb 存放庫結構看起來像在下列螢幕快照中。

Screenshot of the SpaceGameWeb repository structure.

專案的 FabrikamFiber 存放庫結構看起來像在下列螢幕快照中。

Screenshot of the FabrikamFiber repository structure.

假設您的專案未設定為使用以項目為基礎的組建身分識別,或保護對 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存放庫,以及專案中的 FabrikamFiberfabrikam-tailspin/FabrikamFiberFabrikamChat 存放庫。

當您執行範例管線時,您會看到類似下列螢幕快照的組建。 Screenshot of running the SpaceGameWeb pipeline the first time after turning on the Protect access to repositories in YAML pipelines toggle.

系統會要求您將許可權授與管線取出的存放庫,或已定義為資源。 Screenshot of being asked to grant permission to the SpaceGameWeb pipeline to access three repositories.

完成後,您的管線將會執行,但會失敗,因為它無法將存放庫簽出 FabrikamFiberLib 為的 FabrikamFiber子模組。 若要解決此問題,請明確簽出 FabrikamFiberLib,例如,在步驟之前-checkout: FabrikamFiber新增- 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

存放庫使用另一個存放庫作為子模組

假設管線取出的其中一個存放庫會使用另一個存放庫(在相同的專案中)作為子模組,如同和存放庫的範例FabrikamFiberFabrikamFiberLib所示。 深入瞭解 如何查看子模組

此外,假設您已提供SpaceGame此存放庫的組建身分識別讀取許可權,但簽出FabrikamFiberLib子模組時,FabrikamFiber存放庫的簽出仍然失敗。

若要解決此問題,請明確簽出 FabrikamFiberLib,例如,在步驟之前-checkout: FabrikamFiber新增- checkout: git://FabrikamFiber/FabrikamFiberLib步驟。

傳統發行管線

保護發行管線存放庫存取權的程序類似於組建管線的存取。

為了說明您需要採取的步驟,我們將使用執行中的範例。 在我們的範例中fabrikam-tailspin/FabrikamFiberDocRelease,專案中有名為 FabrikamFiberDocRelease 的發行管線。 假設管線會簽出專案中的FabrikamFiberfabrikam-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.

若要修正這些問題,請遵循基本程式中的步驟

如果您現在執行我們的範例管線,它會成功。

另請參閱