共用方式為


在 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. 選取 [存放庫],然後選取 [ 匯入]。 輸入下列存放庫 URL,然後選取 [ 匯入]。

    https://github.com/MicrosoftDocs/pipelines-dotnet-core
    

建立 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>
    

設定驗證

建立使用者指派的受控識別

  1. 登入 Azure 入口網站,然後在搜尋列中搜尋受控識別服務。

  2. 選取 [建立],然後填寫必要的字段,如下所示:

    • 用帳戶:從下拉功能表中選取您的訂用帳戶。
    • 資源群組:選取現有資源群組或建立新的資源群組。
    • 區域:從下拉功能表中選取區域。
    • 名稱:輸入使用者指派的受控識別的名稱。
  3. 完成時,請選取 [ 檢閱 + 建立 ]。

  4. 部署完成後,請選取 [移至資源],然後複製 [ 用帳戶] 和 [用戶端標識符 ] 值,以用於後續步驟。

  5. 流覽至 [設定>屬性],然後複製受控識別的租使用者標識碼值以供稍後使用。

設定金鑰保存庫存取原則

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

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

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

  4. 選取 [下一步],然後將您稍早建立之受控識別的用戶端標識碼到搜尋列中。 選取您的受控識別。

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

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

建立服務連線

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

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

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

  4. 針對 [ 身分識別類型],從下拉功能表中選取 [受控識別 ]。

  5. 針對 步驟 1:受控識別詳細數據,填寫字段,如下所示:

    • 受控識別的訂用帳戶:選取包含受控識別的訂用帳戶。

    • 受控識別的資源群組:選取裝載受控識別的資源群組。

    • 受控識別:從下拉功能表中選取您的受控識別。

  6. 針對 步驟 2:Azure 範圍,填寫字段,如下所示:

    • 服務連線的範圍層級:選取 [訂用帳戶]。

    • 服務連線的訂用帳戶:選取受控識別將存取的訂用帳戶。

    • 服務連線的資源群組:(選擇性) 指定 以限制一個資源群組的受控識別存取。

  7. 針對 步驟 3:服務連線詳細數據

    • 服務連線名稱:提供服務連線的名稱。

    • 服務管理參考:來自 ITSM 資料庫的內容資訊。

    • 描述:(選擇性) 新增描述。

  8. 在 [ 安全性] 中,選取 [ 授與所有管線 訪問許可權] 複選框,以允許所有管線使用此服務連線。 如果您未選取此選項,則必須手動授與使用此服務連線之每個管線的存取權。

  9. 選取 [ 儲存 ] 以驗證並建立服務連線。

    顯示如何建立受控識別ARM服務連線的螢幕快照。

從管線存取金鑰保存庫秘密

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

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

  3. 選取 Azure Repos Git (YAML),然後選取您的存放庫。

  4. 選取 [入門管線] 範本。

  5. 默認管線會包含執行echo命令的腳稿。 這些並非必要專案,因此我們可以將其刪除。

  6. 新增 AzureKeyVault 工作,將佔位元取代為您稍早建立的服務連線名稱和金鑰保存庫名稱。 您的 YAML 檔案應該類似下列代碼段:

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      displayName: Azure Key Vault
      inputs:
        azureSubscription: 'SERVICE_CONNECTION_NAME'
        KeyVaultName: 'KEY_VAULT_NAME'
        SecretsFilter: '*'
        RunAsPreJob: false
    
  7. 讓我們新增下列工作來複製和發佈我們的秘密。 此範例僅供示範之用,不應在生產環境中實作。

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      displayName: Azure Key Vault
      inputs:
        azureSubscription: 'SERVICE_CONNECTION_NAME'
        KeyVaultName: 'KEY_VAULT_NAME'
        SecretsFilter: '*'
        RunAsPreJob: false
    
    - task: CmdLine@2
      displayName: Create file
      inputs:
        script: 'echo $(SECRET_NAME) > secret.txt'
    
    - task: CopyFiles@2
      displayName: Copy file
      inputs:
        Contents: secret.txt
        targetFolder: '$(Build.ArtifactStagingDirectory)'
    
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'
    
  8. 選取 [ 儲存並執行],然後再次選取它來認可變更並觸發管線。 如果系統提示您選取 [允許],系統可能會要求您允許管線存取 Azure 資源。 您只需要核准管線一次。

  9. 選取 CmdLine 工作以檢視記錄。

    顯示命令行工作記錄的螢幕快照。

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

    顯示摘要索引標籤中已發行成品的螢幕快照。

  11. 選取 [卸除>secret.txt以下載它。

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

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

警告

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

清除資源

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

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

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

    az group delete --name <YOUR_RESOURCE_GROUP_NAME>
    

常見問題集

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

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

az account set --subscription <YOUR_SUBSCRIPTION_ID>

az login

$spnObjectId = az ad sp show --id <YOUR_SERVICE_PRINCIPAL_ID>

az keyvault set-policy --name <YOUR_KEY_VAULT_NAME> --object-id $spnObjectId --secret-permissions get list