練習 - 管理 ARM 範本中的祕密

已完成

在上一個練習中,您已執行基本的 Azure Resource Manager (ARM) 範本來佈建 Linux 虛擬機器。 在此單元中,您將遵循類似程序。

這次,不將密碼當作參數來傳遞,而是將密碼儲存於 Azure Key Vault 中。 為了啟用 ARM 範本來存取密碼,您可以建立參數檔案來參考您訂用帳戶中的金鑰保存庫祕密。

部署 Azure Key Vault

注意

由於沙箱的限制,在這裡,您會從 Azure 入口網站在 Azure Key Vault 中建立金鑰保存庫。 一般來說,您會使用 New-AzKeyVault Cmdlet 從 Azure PowerShell 建立金鑰保存庫。

建立金鑰保存庫並允許部署期間存取。 若要這麼做︰

  1. 建立 PowerShell 變數來保存金鑰保存庫名稱:

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. 執行 $KVNAME 以列印其值:

    $KVNAME
    

    您的輸出與下列內容類似 (您看到的數字將有所不同):

    tailwind-secrets5978564
    

    將值複製到方便進行下一個步驟的位置。

  3. 使用啟用沙箱時所用的相同帳戶來登入 Azure 入口網站

  4. 從 Azure 入口網站功能表或 [首頁] 頁面,選取 [建立資源]。

  5. 在 [搜尋] 方塊中輸入 Key Vault

  6. 從清單選取 [Key Vault],然後選取 [建立] 以開始設定金鑰保存庫。

  7. 在建立窗格中,指定下列值:

    1. 資源群組資源群組名稱
    2. 金鑰保存庫名稱: 您 $KVNAME 的值,例如 tailwind-secrets5978564
  8. 選取 [檢閱 + 建立]。

  9. 選取 建立。 這應該需要一分鐘左右的時間。 建立資源之後,選取 [前往資源]

  10. 選取 [設定] 底下的 [存取設定]。 啟用 [用於範本部署的 Azure Resource Manager] 選項,然後選取 [套用]。

  11. 從您的 PowerShell 工作階段執行 ConvertTo-SecureString Cmdlet,並將結果指派給 secretSecureString 變數:

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. 執行下列 Set-AzKeyVaultSecret 命令以在金鑰保存庫中建立祕密。 祕密的名稱為 vmPassword,值為 insecurepassword123!

    $secret = Set-AzKeyVaultSecret -VaultName $KVNAME -Name vmPassword -SecretValue $secretSecureString
    

建立參數檔案

在這裡,您會建立參數檔案,其中包含 VM 的名稱、管理員使用者名稱,以及對金鑰保存庫中 VM 密碼的參考。

您可以從命令列將參數傳遞給範本。 回想一下,參數檔案是在部署期間,將參數傳遞給 ARM 範本的替代方式。 參數檔案可讓您從範本中存取金鑰保存庫祕密。

  1. 執行下列 Get-AzKeyVault 命令,以列印您的金鑰保存庫識別碼:

    Get-AzKeyVault -VaultName $KVNAME | Select-Object -ExpandProperty ResourceId
    

    輸出看起來會像這樣:

    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    請注意下一個步驟的輸出。

  2. 在 Visual Studio Code 中,於包含 azuredeploy.json 的相同目錄中,建立名為 azuredeploy.parameters.json 的檔案。

  3. 將這些內容新增到 azuredeploy.parameters.json

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. 以您在上一個步驟中複製的值取代 id 的值 (空字串)。 然後儲存檔案。

部署 Linux VM

在這裡,您會部署您在上一個練習中部署的相同 ARM 範本。 這次,您提供參數檔案來參考金鑰保存庫中的 VM 密碼。

  1. 執行下列 New-AzResourceGroupDeployment 命令:

    New-AzResourceGroupDeployment `
      -TemplateFile "./azuredeploy.json" `
      -TemplateParameterFile "./azuredeploy.parameters.json" `
      -dnsLabelPrefix ("vm2-" + (Get-Random -Count 1 -Maximum 9999999))
    

    在上一個練習中,您已直接從命令列提供每個機碼/值組。 在這裡,您指定 "./azuredeploy.parameters.json" 來提供參數檔案。

    dnsLabelPrefix 會設定為 vm2-,後面接一個隨機數字。 為了確保 DNS 名稱與您在上一個練習中所使用的 DNS 名稱不同,這是必要的。

驗證部署

驗證 VM 已佈建且可透過 SSH 連線。 若要這麼做︰

  1. 執行 Invoke-Expression 命令以透過 SSH 連線到 VM:

    Invoke-Expression (Get-AzResourceGroupDeployment -Name azuredeploy -ResourceGroupName <rgn>your resource group</rgn>).outputs.sshCommand.value
    

    出現提示時,輸入 yes 以繼續連線。 然後輸入系統管理員密碼,insecurepassword123!

    重要

    實際上,請妥善保管密碼。 您也可以使用公開金鑰驗證,這通常比使用密碼更安全。

  2. 從您與 VM 的 SSH 連線,執行 hostname 以列印 VM 的主機名稱:

    hostname
    

    您會看到 VM 的內部主機名稱,vm1:

    vm2
    
  3. 執行 exit 以離開您的 SSH 工作階段。

    exit
    

做得好! 您已擴充部署,以包含可從 Key Vault 讀取祕密資訊的參數檔案。

部署 Azure Key Vault

在 Azure Key Vault 中,建立金鑰保存庫並新增 VM 密碼作為安全的祕密。 若要這麼做︰

  1. 建立 Bash 變數來保存金鑰保存庫名稱。

    KVNAME=tailwind-secrets$RANDOM
    

    金鑰保存庫名稱必須是唯一的。 $RANDOM 組件可確保金鑰保存庫名稱會以隨機的數字序列結束。

  2. 執行下列 az keyvault create 命令以建立金鑰保存庫:

    az keyvault create \
      --name $KVNAME \
      --enabled-for-template-deployment true
    

    --enabled-for-template-deployment 引數可允許 Azure Resource Manager (ARM) 範本從金鑰保存庫擷取祕密。

  3. 執行下列 az keyvault secret set 命令以在金鑰保存庫中建立祕密。 祕密的名稱為 vmPassword,值為 insecurepassword123!

    az keyvault secret set \
      --vault-name $KVNAME \
      --name vmPassword \
      --value 'insecurepassword123!'
    

建立參數檔案

在這裡,您會建立參數檔案,其中包含 VM 的名稱、管理員使用者名稱,以及對金鑰保存庫中 VM 密碼的參考。

您可以從命令列將參數傳遞給範本。 回想一下,參數檔案是在部署期間,將參數傳遞給 ARM 範本的替代方式。 參數檔案可讓您從範本中存取金鑰保存庫祕密。

  1. 執行下列 az keyvault show 命令,以列印您的金鑰保存庫識別碼:

    az keyvault show \
      --name $KVNAME \
      --query id \
      --output tsv
    

    輸出看起來會像這樣:

    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    請注意下一個步驟的輸出。

  2. 在 Visual Studio Code 中,於包含 azuredeploy.json 的相同目錄中,建立名為 azuredeploy.parameters.json 的檔案。

  3. 將這些內容新增到 azuredeploy.parameters.json

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. 以您在上一個步驟中複製的值取代 id 的值 (空字串)。 然後儲存檔案。

部署 Linux VM

在這裡,您會部署您在上一個練習中部署的相同 ARM 範本。 這次,您提供參數檔案來參考金鑰保存庫中的 VM 密碼。

執行下列 az deployment group create 命令以部署範本:

az deployment group create \
  --template-file azuredeploy.json \
  --parameters @azuredeploy.parameters.json dnsLabelPrefix="vm2-$RANDOM"

在上一個練習中,您已在 --parameters 引數中提供每個機碼/值組。 在這裡,您指定 @azuredeploy.parameters.json 來提供參數檔案。

dnsLabelPrefix 會設定為 vm2-,後面接一個隨機數字。 為了確保 DNS 名稱與您在上一個練習中所使用的 DNS 名稱不同,這是必要的。

檢查部署

如同您在上一個練習中所做的,驗證 VM 已佈建且可透過 SSH 連線。 為求簡潔,這次您將略過某些中繼步驟。

  1. 執行下列程式碼,以透過 SSH 連線到您的 VM:

    $(az deployment group show \
      --name azuredeploy \
      --query properties.outputs.sshCommand.value \
      --output tsv)
    

    出現提示時,輸入 yes 以繼續連線。 然後輸入系統管理員密碼,insecurepassword123!

  2. 從您與 VM 的 SSH 連線,執行 hostname 以列印 VM 的主機名稱:

    hostname
    

    您會看到 VM 的內部主機名稱,vm2:

    vm2
    
  3. 執行 exit 以離開您的 SSH 工作階段。

    exit
    

做得好! 您已擴充部署,以包含可從 Key Vault 讀取祕密資訊的參數檔案。