练习 - 管理 ARM 模板中的机密

已完成

在上一个练习中,你运行了用于预配 Linux 虚拟机的基本 Azure 资源管理器 (ARM) 模板。 在本部分中,你会遵循类似的过程。

这次,将密码存储在 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. Key Vault 名称:$KVNAME 的值,例如 tailwind-secrets5978564。
  8. 选择“查看 + 创建”。

  9. 选择“创建” 。 此过程可能需要一分钟左右。 创建资源后,选择“转到资源”。

  10. 选择“设置”下的“访问配置”。 启用选项“用于模板部署的 Azure 资源管理器”,然后选择“应用”。

  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 的名称、管理员用户名以及对 Key Vault 中的 VM 密码的引用。

可以从命令行将参数传递给模板。 请记住,参数文件是在部署期间将参数传递给 ARM 模板的一种替代方法。 使用参数文件,可以从模板访问 Key Vault 机密。

  1. 运行以下 Get-AzKeyVault 命令以打印 Key Vault ID:

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

    输出如下所示:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/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 模板。 这次,提供引用 Key Vault 中的 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. 从 SSH 与 VM 的连接中,运行 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 资源管理器 (ARM) 模板从密钥保管库检索机密。

  3. 运行以下 az keyvault secret set 命令,在密钥保管库中创建机密。 机密名为 vmPassword,其值为 insecurepassword123!

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

创建参数文件

在这里,你将创建一个参数文件,其中包含 VM 的名称、管理员用户名以及对 Key Vault 中的 VM 密码的引用。

可以从命令行将参数传递给模板。 请记住,参数文件是在部署期间将参数传递给 ARM 模板的一种替代方法。 使用参数文件,可以从模板访问 Key Vault 机密。

  1. 运行以下 az keyvault show 命令以打印 Key Vault ID:

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

    输出如下所示:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/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 模板。 这次,提供引用 Key Vault 中的 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. 从 SSH 与 VM 的连接中,运行 hostname 以打印 VM 的主机名:

    hostname
    

    你会看到 VM 的内部主机名 vm2

    vm2
    
  3. 运行 exit 以离开 SSH 会话。

    exit
    

非常好! 已将部署扩展为包括用于从 Key Vault 读取机密信息的参数文件。