练习 - 管理 ARM 模板中的机密
在上一个练习中,你运行了用于预配 Linux 虚拟机的基本 Azure 资源管理器 (ARM) 模板。 在本部分中,你会遵循类似的过程。
这次,将密码存储在 Azure Key Vault 中,而不是将密码作为参数传递。 若要启用 ARM 模板以访问密码,请在订阅中创建引用密钥保管库机密的参数文件。
部署 Azure Key Vault
注意
由于沙箱存在限制,因此需从 Azure 门户在 Azure Key Vault 中创建密钥保管库。 通常,可使用 New-AzKeyVault
cmdlet 从 Azure PowerShell 创建密钥保管库。
创建密钥保管库并允许在部署时访问。 为此,请执行以下操作:
创建保留密钥保管库名称的 PowerShell 变量:
$KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
运行
$KVNAME
以打印其值:$KVNAME
输出如下所示(你看到的数字将有所不同):
tailwind-secrets5978564
将值复制到便于执行下一步的位置。
使用激活沙盒时所用的同一帐户登录到 Azure 门户。
在 Azure 门户菜单上或在“主页”中,选择“创建资源”。
在搜索框中输入 Key Vault。
从列表中选择“Key Vault”,然后选择“创建”,开始配置密钥保管库。
在“创建”窗格中,指定以下值:
- 资源组:
资源组名称 。 - Key Vault 名称:
$KVNAME
的值,例如 tailwind-secrets5978564。
- 资源组:
选择“查看 + 创建”。
选择“创建” 。 此过程可能需要一分钟左右。 创建资源后,选择“转到资源”。
选择“设置”下的“访问配置”。 启用选项“用于模板部署的 Azure 资源管理器”,然后选择“应用”。
在 PowerShell 会话中,运行
ConvertTo-SecureString
cmdlet 并将结果分配给secretSecureString
变量:$secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
运行以下
Set-AzKeyVaultSecret
命令,在密钥保管库中创建机密。 机密名为vmPassword
,其值为insecurepassword123!
:$secret = Set-AzKeyVaultSecret -VaultName $KVNAME -Name vmPassword -SecretValue $secretSecureString
创建参数文件
在这里,你将创建一个参数文件,其中包含 VM 的名称、管理员用户名以及对 Key Vault 中的 VM 密码的引用。
可以从命令行将参数传递给模板。 请记住,参数文件是在部署期间将参数传递给 ARM 模板的一种替代方法。 使用参数文件,可以从模板访问 Key Vault 机密。
运行以下
Get-AzKeyVault
命令以打印 Key Vault ID: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
记录下一步的输出。
在 Visual Studio Code 中,在包含 azuredeploy.json 的同一目录中创建一个名为 azuredeploy.parameters.json 的文件。
将这些内容添加到 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" } } } }
将
id
的值(空字符串)替换为在上一步中复制的值。 然后保存文件。
部署 Linux VM
在这里,你将部署在上一个练习中部署的同一 ARM 模板。 这次,提供引用 Key Vault 中的 VM 密码的参数文件。
运行以下命令
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 进行连接。 为此,请执行以下操作:
运行
Invoke-Expression
命令以通过 SSH 连接到 VM:Invoke-Expression (Get-AzResourceGroupDeployment -Name azuredeploy -ResourceGroupName <rgn>your resource group</rgn>).outputs.sshCommand.value
出现提示时,输入
yes
继续连接。 然后输入管理员密码insecurepassword123!
。重要
在实践中,请确保密码安全。 也可以使用公钥身份验证,这通常比使用密码更安全。
从 SSH 与 VM 的连接中,运行
hostname
以打印 VM 的主机名:hostname
你会看到 VM 的内部主机名
vm1
:vm2
运行
exit
以离开 SSH 会话。exit
非常好! 已将部署扩展为包括用于从 Key Vault 读取机密信息的参数文件。
部署 Azure Key Vault
在 Azure Key Vault 中,创建密钥保管库,并将 VM 密码添加为安全机密。 为此,请执行以下操作:
创建保留密钥保管库名称的 Bash 变量。
KVNAME=tailwind-secrets$RANDOM
密钥保管库名称必须唯一。
$RANDOM
部分可确保密钥保管库名称以一系列随机数字结束。运行以下
az keyvault create
命令以创建密钥保管库:az keyvault create \ --name $KVNAME \ --enabled-for-template-deployment true
--enabled-for-template-deployment
参数允许 Azure 资源管理器 (ARM) 模板从密钥保管库检索机密。运行以下
az keyvault secret set
命令,在密钥保管库中创建机密。 机密名为vmPassword
,其值为insecurepassword123!
:az keyvault secret set \ --vault-name $KVNAME \ --name vmPassword \ --value 'insecurepassword123!'
创建参数文件
在这里,你将创建一个参数文件,其中包含 VM 的名称、管理员用户名以及对 Key Vault 中的 VM 密码的引用。
可以从命令行将参数传递给模板。 请记住,参数文件是在部署期间将参数传递给 ARM 模板的一种替代方法。 使用参数文件,可以从模板访问 Key Vault 机密。
运行以下
az keyvault show
命令以打印 Key Vault ID: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
记录下一步的输出。
在 Visual Studio Code 中,在包含 azuredeploy.json 的同一目录中创建一个名为 azuredeploy.parameters.json 的文件。
将这些内容添加到 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" } } } }
将
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 进行连接。 为简洁起见,这次你将跳过一些中间步骤。
运行以下步骤,通过 SSH 连接到 VM:
$(az deployment group show \ --name azuredeploy \ --query properties.outputs.sshCommand.value \ --output tsv)
出现提示时,输入
yes
继续连接。 然后输入管理员密码insecurepassword123!
。从 SSH 与 VM 的连接中,运行
hostname
以打印 VM 的主机名:hostname
你会看到 VM 的内部主机名
vm2
:vm2
运行
exit
以离开 SSH 会话。exit
非常好! 已将部署扩展为包括用于从 Key Vault 读取机密信息的参数文件。