I was working on a task to encrypt the azure storage account using the customer managed keys using key vault.
attached arm template, change the parameter values
Parameters
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "keyName": { "type": "string", "defaultValue": "keyname" }, "keyvaultName": { "type": "string", "defaultValue": "key vault name" }, "keyVersion": { "type": "string", "defaultValue": "" }, "location": { "type": "string", "defaultValue": "[resourceGroup().location]" }, "strgacct": { "type": "string", "defaultValue": "storage account name" }, "attributes": { "type": "object", "defaultValue": {}, "metadata": { "description": "The attributes of a key managed by the key vault service." } } "crv": { "type": "string", "defaultValue": "", "allowedValues": [ "", "P-256", "P-256K", "P-384", "P-521" ], "metadata": { "description": "Elliptic curve name." } }, "key_ops": { "type": "array", "defaultValue": [], "metadata": { "description": "JSON web key operations. Operations include: 'encrypt', 'decrypt', 'sign', 'verify', 'wrapKey', 'unwrapKey'" } }, "key_size": { "type": "int", "defaultValue": 4096, "metadata": { "description": "The key size in bits. For example: 2048, 3072, or 4096 for RSA." } }, "kty": { "type": "string", "defaultValue": "RSA", "allowedValues": [ "EC", "EC-HSM", "RSA", "RSA-HSM" ], "metadata": { "description": "The type of key to create" } }, "tags": { "type": "object", "defaultValue": {}, "metadata": { "description": "Tags to be assigned to the Key." } } }, "resources": [] }
next we will start creating the resources we needed:
- Storage Account
- Key vault
- Keys
"resources": [ { "type": "Microsoft.Storage/storageAccounts", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "kind": "Storage", "name": "[parameters('strgacct')]", "apiVersion": "2019-06-01", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned" }, "properties": { "supportsHttpsTrafficOnly": false }, "dependsOn": [] }, { "type": "Microsoft.KeyVault/vaults", "name": "[parameters('keyvaultName')]", "apiVersion": "2016-10-01", "location": "[parameters('location')]", "properties": { "sku": { "family": "A", "name": "standard" }, "tenantId": "[subscription().tenantid]", "accessPolicies": [], "enabledForDeployment":false, "enabledForDiskEncryption":false, "enabledForTemplateDeployment":true, "enableSoftDelete":true, "enablePurgeProtection": true }, "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts', parameters('strgacct'))]" ] }, { "type": "Microsoft.KeyVault/vaults/keys", "apiVersion": "2019-09-01", "name": "[concat(parameters('keyvaultname'), '/', parameters('keyName'))]", "properties": { "attributes": "[parameters('attributes')]", "crv": "[parameters('crv')]", "kty": "[parameters('kty')]", "key_ops": "[parameters('key_ops')]", "key_size": "[parameters('key_size')]" }, "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts', parameters('strgacct'))]", "[resourceId('Microsoft.KeyVault/vaults/', parameters('keyvaultname'))]" ] } ]
after this we need to use Nested template to update storage account to encrypte storage using key vault keys
{ "type": "Microsoft.Resources/deployments", "apiVersion": "2019-07-01", "name": "updateStorageAccount", "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', parameters('keyvaultname'))]" ], "properties": { "mode": "Incremental", "template": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "0.1.0.0", "resources": [ { "type": "Microsoft.KeyVault/vaults/accessPolicies", "name": "[concat(parameters('keyvaultname'), '/add')]", "apiVersion": "2019-09-01", "properties": { "accessPolicies": [ { "tenantId": "[subscription().tenantid]", "objectId": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('strgacct')),'2019-06-01', 'full').identity.principalId]", "permissions": { "keys": [ "wrapkey", "unwrapkey", "get" ], "secrets": [], "certificates": [] } } ] } }, { "type": "Microsoft.Storage/storageAccounts", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "kind": "Storage", "name": "[parameters('strgacct')]", "apiVersion": "2019-06-01", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned" }, "properties": { "encryption": { "services": { "file": { "enabled": true }, "blob": { "enabled": true } }, "keySource": "Microsoft.Keyvault", "keyvaultproperties": { "keyvaulturi": "[reference(resourceId('Microsoft.KeyVault/vaults', parameters('keyvaultname')),'2016-10-01', 'full').properties.vaultUri]", "keyname": "[parameters('keyName')]", "keyversion": "[parameters('keyversion')]" } } }, "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults/accessPolicies', parameters('keyvaultname'), 'add')]" ] } ] } } }
and finally the complete arm template will look like this to encrypt storage account with key vault keys
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "keyName": { "type": "string", "defaultValue": "keyname" }, "keyvaultName": { "type": "string", "defaultValue": "key vault name" }, "keyVersion": { "type": "string", "defaultValue": "" }, "location": { "type": "string", "defaultValue": "[resourceGroup().location]" }, "strgacct": { "type": "string", "defaultValue": "storage account name" }, "attributes": { "type": "object", "defaultValue": {}, "metadata": { "description": "The attributes of a key managed by the key vault service." } } "crv": { "type": "string", "defaultValue": "", "allowedValues": [ "", "P-256", "P-256K", "P-384", "P-521" ], "metadata": { "description": "Elliptic curve name." } }, "key_ops": { "type": "array", "defaultValue": [], "metadata": { "description": "JSON web key operations. Operations include: 'encrypt', 'decrypt', 'sign', 'verify', 'wrapKey', 'unwrapKey'" } }, "key_size": { "type": "int", "defaultValue": 4096, "metadata": { "description": "The key size in bits. For example: 2048, 3072, or 4096 for RSA." } }, "kty": { "type": "string", "defaultValue": "RSA", "allowedValues": [ "EC", "EC-HSM", "RSA", "RSA-HSM" ], "metadata": { "description": "The type of key to create" } }, "tags": { "type": "object", "defaultValue": {}, "metadata": { "description": "Tags to be assigned to the Key." } } }, "variables": {}, "resources": [ { "type": "Microsoft.Storage/storageAccounts", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "kind": "Storage", "name": "[parameters('strgacct')]", "apiVersion": "2019-06-01", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned" }, "properties": { "supportsHttpsTrafficOnly": false }, "dependsOn": [] }, { "type": "Microsoft.KeyVault/vaults", "name": "[parameters('keyvaultName')]", "apiVersion": "2016-10-01", "location": "[parameters('location')]", "properties": { "sku": { "family": "A", "name": "standard" }, "tenantId": "[subscription().tenantid]", "accessPolicies": [], "enabledForDeployment":false, "enabledForDiskEncryption":false, "enabledForTemplateDeployment":true, "enableSoftDelete":true, "enablePurgeProtection": true }, "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts', parameters('strgacct'))]" ] }, { "type": "Microsoft.KeyVault/vaults/keys", "apiVersion": "2019-09-01", "name": "[concat(parameters('keyvaultname'), '/', parameters('keyName'))]", "properties": { "attributes": "[parameters('attributes')]", "crv": "[parameters('crv')]", "kty": "[parameters('kty')]", "key_ops": "[parameters('key_ops')]", "key_size": "[parameters('key_size')]" }, "dependsOn": [ "[resourceId('Microsoft.Storage/storageAccounts', parameters('strgacct'))]", "[resourceId('Microsoft.KeyVault/vaults/', parameters('keyvaultname'))]" ] }, { "type": "Microsoft.Resources/deployments", "apiVersion": "2019-07-01", "name": "updateStorageAccount", "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', parameters('keyvaultname'))]" ], "properties": { "mode": "Incremental", "template": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "0.1.0.0", "resources": [ { "type": "Microsoft.KeyVault/vaults/accessPolicies", "name": "[concat(parameters('keyvaultname'), '/add')]", "apiVersion": "2019-09-01", "properties": { "accessPolicies": [ { "tenantId": "[subscription().tenantid]", "objectId": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('strgacct')),'2019-06-01', 'full').identity.principalId]", "permissions": { "keys": [ "wrapkey", "unwrapkey", "get" ], "secrets": [], "certificates": [] } } ] } }, { "type": "Microsoft.Storage/storageAccounts", "sku": { "name": "Standard_LRS", "tier": "Standard" }, "kind": "Storage", "name": "[parameters('strgacct')]", "apiVersion": "2019-06-01", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned" }, "properties": { "encryption": { "services": { "file": { "enabled": true }, "blob": { "enabled": true } }, "keySource": "Microsoft.Keyvault", "keyvaultproperties": { "keyvaulturi": "[reference(resourceId('Microsoft.KeyVault/vaults', parameters('keyvaultname')),'2016-10-01', 'full').properties.vaultUri]", "keyname": "[parameters('keyName')]", "keyversion": "[parameters('keyversion')]" } } }, "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults/accessPolicies', parameters('keyvaultname'), 'add')]" ] } ] } } } ] }