在 Azure Pipelines 中使用 Azure 金鑰保存庫秘密

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

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

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

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

必要條件

建立 Azure Key Vault

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

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

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

    az config set defaults.location=<your_region>
    

    例如,此命令會選取 westus2 區域:

    az config set defaults.location=westus2
    
  3. 建立新的資源群組。 資源群組是存放 Azure 方案相關資源的容器。

    az group create --name <your-resource-group>
    
  4. 建立新的金鑰保存庫。

    az keyvault create \
      --name <your-key-vault> \
      --resource-group <your-resource-group>
    
  5. 在 Azure 金鑰保存庫中建立新的秘密。

    az keyvault secret set \
      --name "Password" \
      --value "mysecretpassword" \
      --vault-name <your-key-vault-name>
    

建立專案

  1. 登入您的 Azure DevOps 組織

  2. 如果您尚未在組織中有任何專案,請選取 [ 建立專案] 以開始使用。 否則,請選取右上角的 [ 新增專案 ]。

建立存放庫

我們將使用 YAML 來建立管線,但首先我們需要建立新的存放庫。

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

  2. 選取 [存放庫],然後選取 [初始化 ] 以使用讀我檔案初始化新的存放庫。

    顯示如何初始化存放庫的螢幕擷取畫面。

建立新管線

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

  2. 選取[Azure Repos Git (YAML) ]。

    顯示如何選取原始檔控制Azure Repos螢幕擷取畫面。

  3. 選取您在上一個步驟中建立的存放庫。

  4. 選取入門 管線 範本。

  5. 預設管線會包含幾個執行 echo 命令的腳本。 不需要這些專案,因此我們可以將其刪除。 您的新 YAML 檔案看起來應該像這樣:

    trigger:
    - main
    
    pool:
        vmImage: 'ubuntu-latest'
    
    steps:
    
  6. 選取[顯示助理] 以展開 [助理] 面板。 此面板提供方便且可搜尋的管線工作清單。

    顯示如何存取工作助理面板的螢幕擷取畫面。

  7. 搜尋保存庫並選取Azure 金鑰保存庫工作。

    顯示如何搜尋 Azure 金鑰保存庫工作的螢幕擷取畫面。

  8. 選取您的 Azure 訂用帳戶 ,然後選取 [ 授權]。 從下拉式功能表中選取 您的金鑰保存庫 ,然後選取 [ 新增 ] 將工作新增至 YAML 管線。

    顯示如何設定 Azure 金鑰保存庫工作的螢幕擷取畫面。

    注意

    Azure DevOps Server 2019 和 2020 不支援讓整個作業功能使用秘密

  9. 您的 YAML 檔案看起來應該如下所示:

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      inputs:
        azureSubscription: 'Your-Azure-Subscription'
        KeyVaultName: 'Your-Key-Vault-Name'
        SecretsFilter: '*'
        RunAsPreJob: false
    
    - task: CmdLine@2
      inputs:
        script: 'echo $(Your-Secret-Name) > secret.txt'
    
    - task: CopyFiles@2
      inputs:
        Contents: secret.txt
        targetFolder: '$(Build.ArtifactStagingDirectory)'
    
    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'
    

您尚未儲存或排入管線佇列。 我們必須先授與管線存取 Azure 金鑰保存庫的許可權。 將您的瀏覽器索引標籤保持開啟,我們將在設定金鑰保存庫許可權後繼續其餘步驟。

設定 Azure 金鑰保存庫存取原則

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

  1. 巡覽至 Azure 入口網站

  2. 使用搜尋列來搜尋您稍早建立的金鑰保存庫。

    顯示如何搜尋 Azure 金鑰保存庫的螢幕擷取畫面。

  3. [設定 ] 底下選取 [存取原則]。

  4. 選取 [新增存取原則 ] 以新增原則。

  5. 針對 [秘密權限],選取 [取得] 和 [清單]。

  6. 選取選項以選取服務主體,並搜尋您在本節開頭建立的服務主體。 安全性主體是物件,代表要求存取 Azure 資源的使用者、群組、服務或應用程式。

  7. 選取 [新增 ] 以建立存取原則,然後在完成時選取 [ 儲存 ]。

注意

不支援使用 Azure 角色型存取控制的 Azure Key Vault (Azure RBAC) 。

執行並檢閱管線

  1. 返回我們離開的上一個索引標籤。

  2. 選取 [ 儲存],然後再次選取 [ 儲存 ] 以認可您的變更並觸發管線。 如果系統提示您選取 [ 允許],系統可能會要求您允許管線存取 Azure 資源。 您只需要核准管線一次。

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

    顯示命令列工作記錄的螢幕擷取畫面。

  4. 返回管線摘要,然後選取已發佈的成品。

    顯示管線摘要和已發佈成品的螢幕擷取畫面。

  5. 選取 secret.txt 成品以開啟它。

    顯示如何開啟已發佈成品的螢幕擷取畫面。

  6. 文字檔應包含我們的秘密: mysecretpassword

警告

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

清除資源

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

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

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

    az group delete --name PipelinesKeyVaultResourceGroup
    

常見問題集

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

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

下一步