教學:在 JavaScript 中使用 Azure Key Vault 搭配虛擬機

Azure Key Vault 幫助你保護金鑰、秘密和憑證,例如 API 金鑰和資料庫連線字串。

在這個教學中,你要設定一個 Node.js 應用程式,透過管理身份來讀取Azure Key Vault Azure資源的資訊。 您將瞭解如何:

  • 建立金鑰保存庫
  • 將秘密存放在 金鑰保存庫 中
  • 建立一個 Azure Linux 虛擬機器
  • 啟用虛擬機器的受控識別
  • 授予主控台應用程式讀取 金鑰保存庫 資料所需的權限
  • 從 金鑰保存庫 取回秘密

開始前,先讀 金鑰保存庫基本概念。

如果你沒有Azure訂閱,請建立一個free帳號。

Prerequisites

針對 Windows、Mac 和 Linux:

  • Git
  • Azure CLI 的最新版本。 執行 az --version 以檢查已安裝的版本。

登入 Azure

使用 Azure CLI 登入 Azure:

az login

建立資源群組和金鑰保存庫

這個快速入門使用預先建立的 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 的虛擬機:

Linux Windows
Azure CLI Azure CLI
PowerShell PowerShell
Azure portal Azure portal

要使用 Azure CLI 建立 Linux 虛擬機,請使用 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 指令為虛擬機建立系統指派的管理身份:

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

請注意輸出中系統指派的身份:

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

對 VM 身分識別指派權限

將 金鑰保存庫 Secrets User 角色授與 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>

登入虛擬機

要登入虛擬機,請依照 Connect 中的指示登入運行 Linux 的 Azure 虛擬機,或是登入執行 Windows 的 Azure 虛擬機。

若要登入 Linux 虛擬機器,請使用 ssh 以及「建立虛擬機器」步驟中的 <public-ip-address>:

ssh azureuser@<public-ip-address>

在 VM 上安裝 Node.js 和 npm 程式庫

在虛擬機上安裝範例腳本使用的兩個 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. 使用 npm 安裝 Azure 套件:

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

建立和編輯 JavaScript 檔案範例

  1. 在目錄中的 app 虛擬機上,建立一個名為 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!'

清理資源

當你不再需要它們時,刪除虛擬機和金鑰庫。 最快的方法是刪除它們所屬的資源群組:

az group delete -g "myResourceGroup"

後續步驟

Azure Key Vault REST API