你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:在 JavaScript 中将Azure 密钥保管库与虚拟机配合使用

Azure 密钥保管库有助于保护密钥、机密和证书,例如 API 密钥和数据库连接字符串。

在本教程中,你将设置一个 Node.js 应用程序,以便使用Azure资源的托管标识从Azure 密钥保管库读取信息。 你将学会如何:

  • 创建密钥保管库
  • 将机密存储在密钥保管库
  • 创建 Azure Linux 虚拟机
  • 为虚拟机启用托管标识
  • 授予控制台应用程序从密钥保管库读取数据所需的权限
  • 从密钥保管库检索机密

在开始之前,请阅读 密钥保管库 基本概念

如果没有Azure订阅,请创建一个 free 帐户

Prerequisites

对于 Windows、Mac 和 Linux:

  • Git
  • Azure CLI的当前版本。 运行 az --version 以检查已安装的版本。

登录到 Azure

使用Azure CLI登录到Azure:

az login

创建资源组和 Key Vault

本快速入门使用预先创建的Azure密钥保管库。 可以按照以下快速入门中的步骤创建密钥保管库:

或者,可以运行这些Azure CLI命令。

Important

每个密钥保管库必须具有唯一的名称。 在以下示例中,将 <vault-name> 替换为您的密钥保管库的名称。

az group create --name "myResourceGroup" -l "EastUS"

az keyvault create --name "<vault-name>" -g "myResourceGroup" --enable-rbac-authorization true

使用机密填充密钥保管库

让我们创建一个名为 mySecret 的机密,其值为 Success!。 机密可能是密码、SQL连接字符串或任何其他信息,您需要确保这些内容对应用程序既安全又可用。

若要将机密添加到新创建的密钥保管库,请使用以下命令:

az keyvault secret set --vault-name "<vault-name>" --name "mySecret" --value "Success!"

创建虚拟机

使用以下方法之一创建名为 myVM 的 VM:

Linux Windows
Azure CLI Azure CLI
PowerShell PowerShell
Azure 门户 Azure 门户

若要使用 Azure CLI创建 Linux VM,请使用 az vm create 命令。 以下示例添加名为 azureuser 的用户帐户。 该 --generate-ssh-keys 参数生成 SSH 密钥并将其存储在默认密钥位置(~/.ssh)。

az vm create \
  --resource-group <resource-group> \
  --name myVM \
  --image Ubuntu2204 \
  --admin-username azureuser \
  --generate-ssh-keys

请记录输出中 publicIpAddress 的值。

为 VM 分配标识

使用 az vm identity assign 命令为 VM 创建系统分配的托管标识:

az vm identity assign --name "myVM" --resource-group "<resource-group>"

请注意输出中的系统分配标识:

{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}

为 VM 标识分配权限

在密钥保管库上为 VM 的托管标识授予密钥保管库机密用户角色:

az role assignment create --role "Key Vault Secrets User" --assignee "<system-assigned-identity>" --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>

登录到 VM

若要登录到虚拟机,请按照 连接并登录到运行 Linux 的 Azure 虚拟机连接并登录到运行 Windows 的 Azure 虚拟机中的说明操作。

若要登录 Linux VM,请使用 创建虚拟机 步骤中的 <public-ip-address>ssh

ssh azureuser@<public-ip-address>

在 VM 上安装 Node.js 和 npm 库

在 VM 上安装示例脚本使用的两个 npm 库: @azure/keyvault-secrets@azure/identity

  1. 在 SSH 终端中,安装 Node.js 和 npm:

    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && \
        sudo apt-get install -y nodejs
    
  2. 创建应用目录并初始化 Node.js 包:

    mkdir app && cd app && npm init -y
    
  3. 使用以下命令安装Azure包npm

    npm install @azure/keyvault-secrets @azure/identity
    

创建和编辑示例 JavaScript 文件

  1. app 目录中的 VM 上,创建一个名为 index.js 的 JavaScript 文件:

    touch index.js
    
  2. 使用 Nano 文本编辑器打开该文件:

    nano index.js
    
  3. 将以下代码粘贴到编辑器中,将 <vault-name> 替换为你的密钥保管库名称:

    // index.js
    
    const { SecretClient } = require("@azure/keyvault-secrets");
    const { DefaultAzureCredential } = require("@azure/identity");
    
    // Your Azure Key Vault name and secret name
    const keyVaultName = "<vault-name>";
    const keyVaultUri = `https://${keyVaultName}.vault.azure.net`;
    const secretName = "mySecret";
    
    // Authenticate to Azure
    const credential = new DefaultAzureCredential();
    const client = new SecretClient(keyVaultUri, credential);
    
    // Get Secret with Azure SDK for JS
    const getSecret = async (secretName) => {
    
        return (await client.getSecret(secretName)).value;
    }
    
    getSecret(secretName).then(secretValue => {
        console.log(`The value of secret '${secretName}' in '${keyVaultName}' is: '${secretValue}'`);
    }).catch(err => {
        console.log(err);
    })
    
  4. 使用 Ctrl+X 保存文件。

  5. Save modified buffer? 提示符处,输入 y

  6. File Name to Write: index.js 提示符处,按 Enter 键。

运行示例 Node.js 应用

运行 index.js。 如果一切配置正确,应用将输出机密值:

node index.js

The value of secret 'mySecret' in '<vault-name>' is: 'Success!'

清理资源

不再需要它们时,请删除 VM 和密钥保管库。 最快的方法是删除它们所属的资源组:

az group delete -g "myResourceGroup"

后续步骤

Azure 密钥保管库 REST API