クイック スタート: ARM テンプレートを使用してAzure Key Vaultからシークレットを設定および取得する

Azure Key Vault は、キー、パスワード、証明書、その他のシークレットなどのシークレットのセキュリティで保護されたストアを提供するクラウド サービスです。 このクイック スタートでは、Azure Resource Manager テンプレート (ARM テンプレート) をデプロイしてキー コンテナーとシークレットを作成するプロセスについて説明します。

Azure Resource Manager テンプレート は、プロジェクトのインフラストラクチャと構成を定義する JavaScript Object Notation (JSON) ファイルです。 このテンプレートでは、宣言型の構文が使用されています。 デプロイを作成するための一連のプログラミング コマンドを記述しなくても、意図したデプロイを記述できます。

環境が前提条件を満たし、ARM テンプレートの使用に慣れている場合は、 [Azure] ボタンを選択します。 テンプレートがAzure ポータルで開きます。

Resource Manager テンプレートを Azure に展開するボタン

[前提条件]

この記事を完了するには:

  • Azure サブスクリプションがない場合は、開始する前に free アカウントを作成します。

テンプレートを確認する

このクイック スタートで使用するテンプレートは、Azure クイック スタート テンプレートから取得します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.42.1.51946",
      "templateHash": "10998800669048245550"
    }
  },
  "parameters": {
    "keyVaultName": {
      "type": "string",
      "metadata": {
        "description": "Specifies the name of the key vault."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specifies the Azure location where the key vault should be created."
      }
    },
    "enabledForDeployment": {
      "type": "bool",
      "defaultValue": false,
      "metadata": {
        "description": "Specifies whether Azure Virtual Machines are permitted to retrieve certificates stored as secrets from the key vault."
      }
    },
    "enabledForDiskEncryption": {
      "type": "bool",
      "defaultValue": false,
      "metadata": {
        "description": "Specifies whether Azure Disk Encryption is permitted to retrieve secrets from the vault and unwrap keys."
      }
    },
    "enabledForTemplateDeployment": {
      "type": "bool",
      "defaultValue": false,
      "metadata": {
        "description": "Specifies whether Azure Resource Manager is permitted to retrieve secrets from the key vault."
      }
    },
    "tenantId": {
      "type": "string",
      "defaultValue": "[subscription().tenantId]",
      "metadata": {
        "description": "Specifies the Azure Active Directory tenant ID that should be used for authenticating requests to the key vault. Get it by using Get-AzSubscription cmdlet."
      }
    },
    "skuName": {
      "type": "string",
      "defaultValue": "standard",
      "allowedValues": [
        "standard",
        "premium"
      ],
      "metadata": {
        "description": "Specifies whether the key vault is a standard vault or a premium vault."
      }
    },
    "secretsObject": {
      "type": "secureObject",
      "metadata": {
        "description": "Specifies all secrets {\"secretName\":\"\",\"secretValue\":\"\"} wrapped in a secure object."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.KeyVault/vaults",
      "apiVersion": "2023-07-01",
      "name": "[parameters('keyVaultName')]",
      "location": "[parameters('location')]",
      "properties": {
        "enabledForDeployment": "[parameters('enabledForDeployment')]",
        "enabledForTemplateDeployment": "[parameters('enabledForTemplateDeployment')]",
        "enabledForDiskEncryption": "[parameters('enabledForDiskEncryption')]",
        "enableRbacAuthorization": true,
        "tenantId": "[parameters('tenantId')]",
        "enableSoftDelete": true,
        "softDeleteRetentionInDays": 90,
        "enablePurgeProtection": true,
        "sku": {
          "name": "[parameters('skuName')]",
          "family": "A"
        },
        "networkAcls": {
          "defaultAction": "Allow",
          "bypass": "AzureServices"
        }
      }
    },
    {
      "copy": {
        "name": "secrets",
        "count": "[length(parameters('secretsObject').secrets)]"
      },
      "type": "Microsoft.KeyVault/vaults/secrets",
      "apiVersion": "2023-07-01",
      "name": "[format('{0}/{1}', parameters('keyVaultName'), parameters('secretsObject').secrets[copyIndex()].secretName)]",
      "properties": {
        "value": "[parameters('secretsObject').secrets[copyIndex()].secretValue]"
      },
      "dependsOn": [
        "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
      ]
    }
  ],
  "outputs": {
    "location": {
      "type": "string",
      "value": "[parameters('location')]"
    },
    "name": {
      "type": "string",
      "value": "[parameters('keyVaultName')]"
    },
    "resourceGroupName": {
      "type": "string",
      "value": "[resourceGroup().name]"
    },
    "resourceId": {
      "type": "string",
      "value": "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
    }
  }
}

テンプレートには、次の 2 つのAzure リソースが定義されています。

  • Microsoft.KeyVault/vaults: Azure RBAC 認可 (enableRbacAuthorization: true)、ソフト削除、およびパージ保護が有効な Azure キー コンテナーを作成します。
  • Microsoft。KeyVault/vaults/secrets: テンプレートに渡された secretsObject.secrets 配列を反復処理して、1 つ以上のキー コンテナー シークレットを作成します。

Key Vault ではデータ プレーンの認可に Azure RBAC を使用するため、アクセス ポリシーを構成するのではなく、Azure ロールを割り当てることでシークレットへのアクセス権を付与します。

その他Azure Key Vaultテンプレートのサンプルについては、Azure クイック スタート テンプレートを参照してください。

テンプレートをデプロイする

  1. 次の画像を選択し、Azure にサインインしてテンプレートを開きます。 このテンプレートでは、キー コンテナーとシークレットが作成されます。

    Resource Manager テンプレートを Azure に展開するボタン

  2. 次の値を選択または入力します。 指定されていない限り、既定値を使用します。

    • Subscription: Azure サブスクリプションを選択します。

    • リソース グループ: [ 新規作成] を選択し、リソース グループの一意の名前を入力して、[ OK] を選択します

    • リージョン: 場所を選択します。 たとえば [米国中部] です。

    • Key Vault Name: key vaultの名前を入力します。これは、vault.azure.net 名前空間内でグローバルに一意である必要があります。 この名前は、次のセクションでデプロイを検証するときに必要になります。

    • SKU 名: Standard または Premium を選択します。 既定値は 標準です

    • Secrets オブジェクト: secrets 配列を含む JSON オブジェクトとして作成するシークレットを提供します。 例えば次が挙げられます。

      {
        "secrets": [
          {
            "secretName": "adminpassword",
            "secretValue": "<your-secret-value>"
          }
        ]
      }
      

      Secrets オブジェクトsecureObject パラメーターであるため、その値はデプロイ後にログに記録されたりエコーバックされたりすることはありません。

  3. [ 確認と作成] を選択し、[ 作成] を選択します。 キー ボールトとシークレットが正常にデプロイされると、通知が表示されます。

Azure PowerShell、Azure CLI、または REST API を使用してテンプレートをデプロイすることもできます。 他のデプロイ方法については、「テンプレートのデプロイ」を参照してください。

Key Vault RBAC ロールを割り当てる

このテンプレートによって作成されたキー コンテナーでは、承認に Azure RBAC が使用されます。 データ プレーンを介してシークレットにアクセスするには (たとえば、Azure CLIまたはAzure PowerShellを使用して)、適切なロールを自分自身に割り当てる必要があります。

  1. Microsoft Entraユーザー オブジェクト ID を取得します。

    az ad signed-in-user show --query id -o tsv
    
  2. キー コンテナー上で、自身に キー コンテナーのシークレット オフィサーのロールを割り当てます:

    echo "Enter your key vault name:" &&
    read keyVaultName &&
    az role assignment create --role "Key Vault Secrets Officer" \
        --assignee-object-id $(az ad signed-in-user show --query id -o tsv) \
        --scope $(az keyvault show --name $keyVaultName --query id -o tsv)
    

    Note

    ロールの割り当てが反映されるまでに 1 ~ 2 分かかる場合があります。

デプロイされているリソースを確認する

Azure ポータルを使用してキー コンテナーとシークレットを確認するか、次のAzure CLIまたはAzure PowerShellスクリプトを使用して作成されたシークレットを一覧表示できます。

echo "Enter your key vault name:" &&
read keyVaultName &&
az keyvault secret list --vault-name $keyVaultName &&
echo "Press [ENTER] to continue ..."

リソースをクリーンアップする

その他のKey Vaultクイック スタートとチュートリアルは、このクイック スタートに基づいています。 後続のクイック スタートおよびチュートリアルを引き続き実行する場合は、これらのリソースをそのまま残しておくことをお勧めします。 不要になったら、リソース グループを削除し、Key Vaultおよび関連リソースを削除します。 Azure CLIまたはAzure PowerShellを使用してリソース グループを削除するには:

echo "Enter the Resource Group name:" &&
read resourceGroupName &&
az group delete --name $resourceGroupName &&
echo "Press [ENTER] to continue ..."

Note

リソース グループを削除するとキー コンテナーも削除されますが、キー コンテナーは論理削除状態となり、保持期間 (デフォルトでは 90 日間) 中は復元可能です。 ボールト名はその期間中グローバルで予約されたままとなり、さらに消去保護が有効になっているため、ボールトを早期に完全に削除することはできません。 標準のキー コンテナーの場合、論理削除されたコンテナーには料金は発生しません。 詳細については、「Key Vault ソフト削除の概要」を参照してください。

次のステップ

このクイック スタートでは、ARM テンプレートを使用してキー コンテナーとシークレットを作成し、デプロイを検証しました。 Key VaultとAzure Resource Managerの詳細については、以下の記事に進んでください。