8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

株式会社船井総研デジタルAdvent Calendar 2022

Day 11

Node.jsでAzure Key Vaultに格納されたシークレットを取得してみる(超簡単)

Last updated at Posted at 2022-12-10

はじめに

従来のソフトウェア開発において、本番環境でのパスワードや暗号鍵、デジタル証明書、APIキーなどといったシークレットは環境変数に保管してアプリケーションからアクセスします。しかしクラウドサービスを利用したモダンなソフトウェア開発においては、アプリケーションは様々な実行環境に分散していて、それぞれ個別に設定ファイルを用意し、環境変数を設定する必要があります。Azure Key Vaultを利用すると、そのようなシークレットをクラウド上で一元管理することができ、それらの情報に対するアクセスをAzure ADによる認証で保護することができます。今回の記事では、Node.jsを用いて、Azure Key Vault上に保存されているシークレットにアクセスする方法をまとめていきたいと思います。

Azure Key Vault リソースを作成する

Azure Key Vault リソースをAzure CLI を使用して作成していきます。

Azure Portal を使用したAzure Key Vault リソースの作成方法は以下の公式の記事を参考にしてください。

以下のスクリプトは、Azure上に、リソースグループ、Azure Key Vaultリソースを作成して、最後にAzure Key Vaultの名前を.envファイルとして、生成してくれます。.envファイルはNode.jsから環境変数として読み込まれます。

#!/bin/bash

let randomIdentifier=$RANDOM*$RANDOM

# resource group
readonly AZ_RESOURCE_GROUP="myTestingRG${randomIdentifier}"
readonly AZ_RESOURCE_GROUP_LOCATION="japaneast"
# key vault
readonly AZ_KEY_VAULT_NAME="nicekeyvault${randomIdentifier}"
readonly AZ_KEY_VAULT_LOCATION="japaneast"

echo "Creating Resource Group..."
az group create \
    --name ${AZ_RESOURCE_GROUP} \
    --location ${AZ_RESOURCE_GROUP_LOCATION}
echo "Done! ${AZ_RESOURCE_GROUP} has been created."

echo "Creating Azure Key Vault resource..."
az keyvault create \
    --name ${AZ_KEY_VAULT_NAME} \
    --resource-group ${AZ_RESOURCE_GROUP} \
    --location ${AZ_KEY_VAULT_LOCATION}
echo "Done! ${AZ_KEY_VAULT_NAME} has been created."

out=$(
    cat <<EOF
    AZ_KEY_VAULT_NAME=${AZ_KEY_VAULT_NAME}
EOF
)
echo ${out} >.env
echo "Done! All required resources have just been successfully created!"

shell scriptファイルを作成して、実行権限を付与します。

touch init.sh && chmod +x init.sh

あとは、上記のshell scriptの内容をコピペして、以下のように実行してください。

./init.sh

Azure Key Vault にシークレットを追加する

データベース接続のための認証情報や、3rdパーティー製のAPI キーなどは開発者以外に、非技術者の管理者が直接管理することが多々あるので、今回はAzure Portalからシークレットを追加します。もちろんCLIやコードからのシークレットの追加もできます。

Screen Shot 2022-12-01 at 13.44.26.png
Screen Shot 2022-12-01 at 13.45.03.png
Screen Shot 2022-12-01 at 13.45.39.png
Screen Shot 2022-12-01 at 13.46.03.png
Screen Shot 2022-12-01 at 13.47.19.png
Screen Shot 2022-12-01 at 13.47.58.png

Node.jsプロジェクトの作成

proj=try-azure-key-vault
mkdir ${proj} && cd ${proj}
npm init -y

以下のpackage.jsonをコピペしてください。

package.json
{
  "name": "try-azure-key-vault",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node src/index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@azure/identity": "3.1.1",
    "@azure/keyvault-secrets": "4.6.0",
    "dotenv": "16.0.3"
  }
}

package.jsonファイルに基づいて、ライブラリーをインストールします。

インストールするライブラリは以下の通りです。

  • @azure/identityはAure ADに対して認証を行うために使用します。Azure Key VaultはAzure ADによって保護されています。
  • @azure/keyvault-secrets はAzure Key Vaultとやり取りをするために使用します。このライブラリーを使用すれば、とてもシンプルなAPIを通して、シークレットの取得ができます。
  • dotnevは.envファイルから環境変数の読み込みを行うために使用します。
npm i
mkdir src && touch src/index.js

src/index.jsに以下のコードをコピペしてください。

src/index.js
const { SecretClient } = require("@azure/keyvault-secrets");
const { DefaultAzureCredential } = require("@azure/identity");

const dotenv = require("dotenv");
// azure CLIのスクリプト実行後に生成された.envファイルを読み込む
dotenv.config();

async function main() {
  // 現在Azure CLIでログインしているユーザーを元に認証オブジェクトを生成する
  const credential = new DefaultAzureCredential();
  const keyVaultName = process.env.AZ_KEY_VAULT_NAME;
  // Azure Key VaultにアクセスするためのURL
  const keyVaultURL = `https://${keyVaultName}.vault.azure.net`;

  const secretName = "testSecret";

  // Azure Key VaultのURLとAzure AD認証のためのオブジェクトからクライアントを生成
  const client = new SecretClient(keyVaultURL, credential);

  // シークレットと紐付けたキーを使用して、シーレットの値を取得する
  const secret = await client.getSecret(secretName);
  console.log({ secret });
}

main().catch((error) => {
  console.error(error);
  process.exit(1);
});

package.jsonstart scriptを実行します。

npm run start

成功すると、以下のようにsecretオブジェクトが取得できます。このオブジェクトのvalueセクションにシークレットの値が格納されています。

> try-azure-key-vault@1.0.0 start
> node src/index.js

{
  secret: {
    value: 'helloFromKeyVault',
    name: 'testSecret',
    properties: {
      expiresOn: undefined,
      createdOn: 2022-12-06T05:56:10.000Z,
      updatedOn: 2022-12-06T05:56:10.000Z,
      enabled: true,
      notBefore: undefined,
      recoverableDays: 90,
      recoveryLevel: 'Recoverable+Purgeable',
      id: 'https://nicekeyvault200341674.vault.azure.net/secrets/testSecret/1f7dbe8362e24e25a526d136cc19dc67',
      contentType: undefined,
      tags: {},
      managed: undefined,
      vaultUrl: 'https://nicekeyvault200341674.vault.azure.net',
      version: '1f7dbe8362e24e25a526d136cc19dc67',
      name: 'testSecret',
      certificateKeyId: undefined
    }
  }
}

おわりに

Azure Key Vaultを使用すれば、安全にAzure AD認証に保護されたシークレット管理を実現できます。Azure Key Vaultにアクセスするための、SDKはC#, Java, Node.jsなど様々な言語に対応しており、比較的簡単にシークレットをコードから所得できます。クラウドを用いたモダンなシステム開発において、必須のサービスだと言えると思います。

8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?