在 Azure Pipelines 中使用 Azure Key Vault 秘密

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Azure 金鑰保存庫 可讓開發人員安全地儲存和管理機密資訊,例如 API 金鑰、認證或憑證。 Azure 金鑰保存庫 服務支援兩種類型的容器:保存庫和受控 HSM (硬體安全性模組) 集區。 保存庫可以同時儲存軟體和 HSM 支援的金鑰、秘密和憑證,而受控 HSM 集區則完全支援 HSM 支援的金鑰。

在本教學課程中,您將了解如何:

  • 使用 Azure CLI 建立 Azure 金鑰保存庫
  • 新增秘密並設定對 Azure 金鑰保存庫的存取
  • 在管線中使用祕密

必要條件

建立存放庫

如果您已經有自己的存放庫,請繼續進行下一個步驟。 否則,請遵循下列指示來初始化您的存放庫。 我們將使用此 Azure 存放庫來設定管線。

  1. 登入您的 Azure DevOps 組織,然後瀏覽至您的專案。

  2. 選取 [存放庫],然後選取 [ 初始化 ] 以使用自述檔初始化主要分支。

    顯示如何使用自述檔初始化存放庫的螢幕快照。

建立 Azure Key Vault

  1. 登入 Azure 入口網站,然後選取 右上角的 Cloud Shell 按鈕。

  2. 如果您有一個以上的 Azure 訂用帳戶與您的帳戶相關聯,請使用下列命令來指定預設訂用帳戶。 您可以使用 az account list 來產生訂用帳戶清單。

    az account set --subscription <YOUR_SUBSCRIPTION_NAME_OR_ID>
    
  3. 設定您的預設 Azure 區域。 您可以使用 az account list-locations 來產生可用區域的清單。

    az config set defaults.location=<YOUR_REGION>
    
  4. 建立新的資源群組。

    az group create --name <YOUR_RESOURCE_GROUP_NAME>
    
  5. 建立新的 Azure 金鑰保存庫。

    az keyvault create \
      --name <YOUR_KEY_VAULT_NAME> \
      --resource-group <YOUR_RESOURCE_GROUP_NAME>
    
  6. 在 Azure 金鑰保存庫中建立新的秘密。

    az keyvault secret set \
      --name <YOUR_SECRET_NAME> \
      --value <YOUR_ACTUAL_SECRET> \
      --vault-name <YOUR_KEY_VAULT_NAME>
    

設定金鑰保存庫存取原則

若要存取 Azure 金鑰保存庫,我們必須設定服務主體,以授與 Azure Pipelines 的存取權。 請遵循 本指南 ,使用 Azure CLI 建立服務主體,然後繼續進行本節中的後續步驟。

  1. 流覽至 Azure 入口網站,然後使用搜尋列來尋找您稍早建立的密鑰保存庫。

    顯示如何搜尋 Azure 金鑰保存庫 的螢幕快照。

  2. 選取 [ 存取原則],然後選取 [ 建立 ] 以建立新的原則。

  3. 在 [秘密許可權] 底下,選取 [取得列表]。

  4. 選取 [ 下一步],然後選取您稍早建立的服務主體。 服務主體是物件,代表要求存取 Azure 資源的應用程式或服務。

  5. 選取 [下一步],然後再次選取 [下一步]。

  6. 檢閱您的原則,然後在完成時選取 [ 建立 ]。

注意

不支援使用 Azure 角色型存取控制 (Azure RBAC) 的 Azure 金鑰保存庫。

新增角色指派

在下一個步驟中,我們將使用服務主體建立ARM服務連線。 在確認連線之前,我們需要授與訂用帳戶層級的服務主體 讀取 存取權:

  1. 流覽至 Azure 入口網站

  2. 從左側導覽面板中選取 [訂用帳戶 ],然後尋找並選取您的訂用帳戶。

  3. 選取 [訪問控制],然後選取 [新增>角色指派]。

    顯示如何在訂用帳戶層級新增角色指派的螢幕快照。

  4. 選取 [角色] 索引標籤下的 [讀取者],然後選取 [下一步]。

  5. 選取 [ 使用者、群組或服務主體],然後選取 [選取 成員]。

    顯示如何在 Azure 中將成員新增至角色指派的螢幕快照。

  6. 使用搜尋列來尋找您的服務主體,然後選取 「+」 符號加以選取,然後按兩下 [選取 ] 按鈕。

  7. 選取 [ 檢閱 + 指派]、檢閱您的設定,然後再次選取 [檢閱 + 指派 ],以確認您的選擇並新增角色指派。

建立服務連線

  1. 登入您的 Azure DevOps 組織,然後瀏覽至您的專案。

  2. 選取 [項目設定>服務連線],然後選取 [新增服務連線] 以建立新的服務連線。

  3. 選取 [Azure Resource Manager],然後選取 [ 下一步]。

  4. 選取 [服務主體][手動],然後選取 [ 下一步]。

  5. 針對 [範圍層級] 選取 [Azure 雲端] 和 [訂用帳戶],然後輸入您的訂用帳戶標識符和訂用帳戶名稱。

  6. 填寫下列欄位,其中包含您在建立服務主體時取得的信息,然後在完成時選取 [ 驗證 ]:

    • 服務主體標識碼:您的服務主體 appId
    • 服務主體金鑰:您的服務主體 密碼
    • 租用戶標識碼:您的服務主體 租使用者
  7. 驗證成功之後,請為您的服務連線提供名稱和描述(選擇性),然後核取 [ 授與所有管線的訪問許可權 ] 複選框。

  8. 選取 [ 驗證],然後在完成時儲存

    顯示如何使用服務主體建立新 Azure Resource Manager 服務連線的螢幕快照。

  1. 登入您的 Azure DevOps 集合,然後流覽至您的專案。

  2. 選取 [項目設定>服務連線>][新增服務連線],然後選取 [Azure Resource Manager] 以建立新的 ARM 服務連線。

  3. 為服務連線指定名稱,然後選取 [範圍層級] 的 [Azure Cloud for Environment] 和 [訂用帳戶]。

  4. 輸入您的 訂用帳戶標識碼 和訂 用帳戶名稱

  5. 填寫下列欄位,其中包含您在建立服務主體時取得的信息,然後在完成時選取 [ 驗證連線 ]:

    • 服務主體用戶端標識碼:您的服務主體 appId
    • 服務主體金鑰:您的服務主體 密碼
    • 租用戶標識碼:您的服務主體 租使用者
  6. 核取 [ 允許所有管線使用此聯機 ] 複選框,然後在完成時選取 [ 確定 ]。

    顯示如何在 Azure DevOps Server 2019 中使用服務主體建立新 ARM 服務連線的螢幕快照。

建立新管線

  1. 登入您的 Azure DevOps 組織,然後瀏覽至您的專案。

  2. 選取 [ 管線],然後選取 [ 新增管線]。

  3. 選取 [ 使用傳統編輯器 ] 建立傳統管線。

  4. 選取 [Azure Repos Git],選取您的存放庫和預設分支,然後選取 [ 繼續]。

  5. 選取 .Net Desktop 管線範本。

  6. 在此範例中,我們只需要最後兩個工作。 按 CTRL 鍵,然後選取前五個工作,以滑鼠右鍵按兩下並選擇 [移除選取的工作 ],以刪除它們。

    顯示如何刪除多個管線工作的螢幕快照。

  7. 選取 + 以新增工作。 搜尋命令行工作、選取它,然後選取 [新增] 將它新增至管線。 新增之後,請依照下列方式進行設定:

    • 顯示名稱:建立檔案
    • 文稿echo $(YOUR_SECRET_NAME) > secret.txt

    顯示如何設定命令行工作的螢幕快照。

  8. 選取 + 以新增工作。 搜尋 Azure 金鑰保存庫 工作、選取工作,然後選取 [新增] 將其新增至管線。 新增之後,請依照下列方式進行設定:

    • 顯示名稱:Azure 金鑰保存庫
    • Azure 訂用帳戶:選取您稍早建立的服務主體服務連線
    • 金鑰保存庫:選取您的金鑰保存庫
    • 秘密篩選:以逗號分隔的秘密名稱清單,或離開 * 以從選取的密鑰保存庫下載所有秘密

    顯示如何在傳統管線中設定 Azure 金鑰保存庫 工作的螢幕快照。

  9. 選取 [ 複製檔案 ] 工作,並填寫必要的欄位,如下所示:

    • 顯示名稱:複製檔案
    • 內容:secret.txt
    • 目標資料夾:$(build.artifactstagingdirectory)

    顯示如何在傳統管線中設定複製檔案工作的螢幕快照。

  10. 選取 [ 發佈成品 ] 工作,並填寫必要的字段,如下所示:

    • 顯示名稱:發佈成品
    • 發佈路徑:$(build.artifactstagingdirectory)
    • 成品名稱:卸除
    • 成品發佈位置:Azure Pipelines

    顯示如何在傳統管線中設定發佈成品工作的螢幕快照。

  11. 選取 [ 儲存並排入佇列],然後選取 [ 執行 ] 以執行管線。

  12. 管線執行完成後,返回管線摘要,然後選取已發佈的成品。

  13. 選取 [卸>除secret.txt以下載已發佈的成品。

    顯示如何下載已發佈成品的螢幕快照。

  14. 開啟您剛下載的文本檔,文本文件應該包含來自 Azure 金鑰保存庫的秘密。

  1. 登入您的 Azure DevOps 集合,然後流覽至您的專案。

  2. 選取 [ 管線],然後選取 [ 組建]。

  3. 選取 [新增>新的組建管線]。

  4. 選取 [ 使用傳統編輯器 ] 來建立新的傳統組建管線。

  5. 選取 [Azure Repos Git],選取您的存放庫和預設分支,然後選取 [ 繼續]。

  6. 選取 .Net Desktop 管線範本,然後選取 [套用]。

  7. 在此範例中,我們只需要最後兩個工作。 按 CTRL 鍵,然後選取前五個工作,以滑鼠右鍵按兩下並選擇 [移除選取的工作 ],以刪除它們。

    此螢幕快照顯示如何在 Azure DevOps Server 2019 中刪除傳統管線中的多個管線工作。

  8. 選取 + 以新增工作。 搜尋命令行工作、選取它,然後選取 [新增] 將它新增至管線。 新增之後,請依照下列方式進行設定:

    • 顯示名稱:建立檔案
    • 文稿echo $(YOUR_SECRET_NAME) > secret.txt

    顯示如何在 Azure DevOps Server 2019 中傳統管線中設定命令行工作的螢幕快照。

  9. 選取 + 以新增工作。 搜尋 Azure 金鑰保存庫 工作,選取它,然後選取 [新增] 將其新增至管線。 新增之後,請依照下列方式進行設定:

    • 顯示名稱:Azure 金鑰保存庫
    • Azure 訂用帳戶:選取您稍早建立的服務主體服務連線
    • 金鑰保存庫:選取您的金鑰保存庫
    • 秘密篩選:以逗號分隔的秘密名稱清單,或離開 * 以從選取的密鑰保存庫下載所有秘密

    顯示如何在 Azure DevOps Server 2019 傳統管線中設定 Azure 金鑰保存庫 工作的螢幕快照。

  10. 選取 [ 複製檔案 ] 工作,並填寫必要的欄位,如下所示:

    • 顯示名稱:複製檔案
    • 內容:secret.txt
    • 目標資料夾:$(build.artifactstagingdirectory)

    顯示如何在 Azure DevOps Server 2019 中傳統管線中設定複製檔案工作的螢幕快照。

  11. 選取 [ 發佈成品 ] 工作,並填寫必要的字段,如下所示:

    • 顯示名稱:發佈成品
    • 發佈路徑:$(build.artifactstagingdirectory)
    • 成品名稱:卸除
    • 成品發佈位置:Azure Pipelines

    顯示如何在 Azure DevOps Server 2019 中傳統管線中設定發佈成品工作的螢幕快照。

  12. 選取 [ 儲存和佇列],然後選取 [ 儲存和佇列 ] 以執行組建管線。

  13. 管線執行完成後,請選取 [成品],然後選取 [卸除]。

  14. 在新開啟的視窗中,選取 [卸>除secret.txt],選取省略號圖示 [...],然後選取 [下載] 以儲存文本檔。

  15. 開啟您剛才下載的文字檔,它應該包含來自 Azure 金鑰保存庫的秘密。

警告

本教學課程僅供教育之用。 如需安全性最佳做法以及如何安全地使用秘密,請參閱使用 Azure 金鑰保存庫 管理伺服器應用程式中的秘密。

清除資源

請遵循下列步驟來刪除您所建立的資源:

  1. 如果您已建立新的組織來裝載您的專案,請參閱 如何刪除您的組織,否則 請刪除您的專案

  2. 本教學課程期間建立的所有 Azure 資源都會裝載在單一資源群組之下。 執行下列命令來刪除您的資源群組及其所有資源。

    az group delete --name <YOUR_RESOURCE_GROUP_NAME>
    

常見問題集

問:我收到下列錯誤:「使用者或群組沒有秘密清單許可權」我該怎麼做?

答:如果您遇到錯誤,指出使用者或群組沒有密鑰保存庫的秘密清單許可權,請執行下列命令來授權應用程式存取 Azure 金鑰保存庫 中的金鑰或秘密:

$ErrorActionPreference="Stop";
$Credential = Get-Credential;
Connect-AzAccount -SubscriptionId <YOUR_SUBSCRIPTION_ID> -Credential $Credential;
$spn=(Get-AzureRmADServicePrincipal -SPN <YOUR_SERVICE_PRINCIPAL_ID>);
$spnObjectId=$spn.Id;
Set-AzureRmKeyVaultAccessPolicy -VaultName key-vault-tutorial -ObjectId $spnObjectId -PermissionsToSecrets get,list;