テンプレートでのシークレットの管理

完了

デプロイ時にセキュリティで保護された値 (パスワードなど) をパラメーターとして渡す場合は、Azure Key Vault から値を取得できます。

パラメーター ファイルの Key Vault とシークレットを参照します。

値の Key Vault ID のみを参照するため、値が公開されることはありません。

Key Vault は、デプロイ先のリソース グループとは別のサブスクリプションに存在することができます。

キー コンテナーとシークレットをデプロイする

Key Vault とシークレットを作成するには、Azure CLI または PowerShell のいずれかを使用します。

Resource Manager デプロイからこの Key Vault 内のシークレットにアクセスするには、Key Vault プロパティ enabledForTemplateDeploymenttrueである必要があります。

Azure CLI の使用

次のコード スニペットは、Azure CLI を使用して Key Vault とシークレットをデプロイする方法の例を示しています。

keyVaultName='{your-unique-vault-name}'
resourceGroupName='{your-resource-group-name}'
location='centralus'
userPrincipalName='{your-email-address-associated-with-your-subscription}'

# Create a resource group
az group create --name $resourceGroupName --location $location

# Create a Key Vault
az keyvault create \
  --name $keyVaultName \
  --resource-group $resourceGroupName \
  --location $location \
  --enabled-for-template-deployment true
az keyvault set-policy --upn $userPrincipalName --name $keyVaultName --secret-permissions set delete get list

# Create a secret with the name, vmAdminPassword
password=$(openssl rand -base64 32)
echo $password
az keyvault secret set --vault-name $keyVaultName --name 'vmAdminPassword' --value $password

シークレットへのアクセスの有効化

Key Vault のプロパティ enabledForTemplateDeploymenttrueに設定する以外に、テンプレートをデプロイするユーザーには、Key Vault のスコープに対する Microsoft.KeyVault/vaults/deploy/action アクセス許可が必要です。

また、リソース グループと Key Vault も含まれます。 このアクセスは、所有者ロールと共同作成者ロールが許可します。

Key Vault を作成すると、所有者になるので、本質的にアクセス許可があります。

ただし、Key Vault が別のサブスクリプションにある場合は、Key Vault の所有者がアクセス権を付与する必要があります。

固定 ID でのシークレットの参照

Key Vault は、テンプレートではなく、パラメーター ファイルで参照されます。

次の図は、パラメーター ファイルがシークレットを参照し、その値をテンプレートに渡すしくみを示しています。

Diagram showing the illustration of the flow of a secret during template deployment. The parameter file references the secret from the template and passes that value to the template.

次のテンプレートでは、管理者パスワードを含む SQL データベースがデプロイされます。

パスワード パラメーターは、セキュリティで保護された文字列に設定されます。 ただし、テンプレートにより、その値の取得元が指定されていません。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "adminLogin": {
      "type": "string"
    },
    "adminPassword": {
      "type": "securestring"
    },
    "sqlServerName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "name": "[parameters('sqlServerName')]",
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2015-05-01-preview",
      "location": "[resourceGroup().location]",
      "tags": {},
      "properties": {
        "administratorLogin": "[parameters('adminLogin')]",
        "administratorLoginPassword": "[parameters('adminPassword')]",
        "version": "12.0"
      }
    }
  ],
  "outputs": {
  }
}

これで、前のテンプレートのパラメーター ファイルを作成できるようになりました。 パラメーター ファイルで、テンプレートでのパラメーターの名前と一致するパラメーターを指定します。

パラメーター値として、Key Vault からシークレットを参照します。 シークレットを参照するには、Key Vault のリソース識別子とシークレットの名前を渡します。

Key Vault シークレットは、次のパラメーター ファイルに既に存在している必要があります。また、そのリソース ID に静的な値を指定します。

このファイルをローカルにコピーし、サブスクリプション ID、コンテナー名、SQL サーバー名を設定します。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "adminLogin": {
            "value": "exampleadmin"
        },
        "adminPassword": {
            "reference": {
              "keyVault": {
                "id": "/subscriptions/<subscription-id>/resourceGroups/examplegroup/providers/Microsoft.KeyVault/vaults/<vault-name>"
              },
              "secretName": "examplesecret"
            }
        },
        "sqlServerName": {
            "value": "<your-server-name>"
        }
    }
}

テンプレートをデプロイし、パラメーター ファイルをテンプレートに渡す必要があります。

詳細については、「デプロイ時に Azure Key Vault を使用して、セキュリティで保護されたパラメーター値を渡す」を参照してください。

この Web ページには、動的 ID を持つシークレットの参照に関する詳細も記載されています。