workload/terraform/greenfield/zerotrust/keyvault.tf (128 lines of code) (raw):

resource "azurerm_key_vault" "kv" { name = local.keyvault_name tenant_id = data.azurerm_client_config.current.tenant_id location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku_name = "standard" purge_protection_enabled = true enabled_for_disk_encryption = true tags = local.tags enabled_for_deployment = true enable_rbac_authorization = true soft_delete_retention_days = 7 depends_on = [ azurerm_resource_group.rg, azurerm_virtual_desktop_host_pool.hostpool, azurerm_virtual_desktop_workspace.workspace, azurerm_virtual_desktop_application_group.dag ] lifecycle { ignore_changes = [access_policy, tags] } network_acls { default_action = "Deny" bypass = "AzureServices" ip_rules = local.allow_list_ip } } # Get Private DNS Zone for the Key Vault Private Endpoints data "azurerm_private_dns_zone" "pe-vaultdns-zone" { name = "privatelink.vaultcore.azure.net" resource_group_name = var.hub_dns_zone_rg provider = azurerm.hub } resource "azurerm_private_endpoint" "kvpe" { name = "pe-${local.keyvault_name}-vault" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name subnet_id = data.azurerm_subnet.subnet.id tags = local.tags lifecycle { ignore_changes = [tags] } private_service_connection { name = "psc-kv-${var.prefix}" private_connection_resource_id = azurerm_key_vault.kv.id is_manual_connection = false subresource_names = ["Vault"] } depends_on = [ azurerm_key_vault.kv, azurerm_key_vault_secret.localpassword, azurerm_private_endpoint.kvpe ] private_dns_zone_group { name = "dns-kv-${var.prefix}" private_dns_zone_ids = data.azurerm_private_dns_zone.pe-vaultdns-zone.*.id } } # Generate VM local password resource "random_password" "vmpass" { length = 20 special = true } # Create Key Vault Secret resource "azurerm_key_vault_secret" "localpassword" { name = "vmlocalpassword" value = random_password.vmpass.result key_vault_id = azurerm_key_vault.kv.id content_type = "Password" lifecycle { ignore_changes = [tags] } depends_on = [ azurerm_role_assignment.keystor ] } # Linking DNS Zone to the existing DNS Zone in the Hub VNET resource "azurerm_private_dns_zone_virtual_network_link" "vaultlink" { name = "keydnsvnet_link-${var.prefix}" resource_group_name = var.hub_dns_zone_rg private_dns_zone_name = data.azurerm_private_dns_zone.pe-vaultdns-zone.name virtual_network_id = data.azurerm_virtual_network.vnet.id provider = azurerm.hub lifecycle { ignore_changes = [tags] } } resource "time_sleep" "wait" { create_duration = "300s" } resource "azurerm_role_assignment" "keystor" { scope = azurerm_key_vault.kv.id role_definition_name = "Key Vault Administrator" principal_id = data.azurerm_client_config.current.object_id depends_on = [ time_sleep.wait ] } # Customer Managed Key for Storage Account resource "azurerm_storage_account_customer_managed_key" "cmky" { storage_account_id = azurerm_storage_account.storage.id key_vault_id = azurerm_key_vault.kv.id key_name = azurerm_key_vault_key.stkek.name user_assigned_identity_id = azurerm_user_assigned_identity.mi.id provider = azurerm.spoke depends_on = [ azurerm_storage_account.storage, azurerm_key_vault.kv, azurerm_role_assignment.encstor, azurerm_key_vault_key.stcmky, azurerm_user_assigned_identity.mi ] } # Storage Account Encryption Key resource "azurerm_key_vault_key" "stkek" { name = "af-key" key_vault_id = azurerm_key_vault.kv.id key_type = "RSA" key_size = 4096 key_opts = ["decrypt", "encrypt", "sign", "unwrapKey", "verify", "wrapKey"] depends_on = [ azurerm_role_assignment.encstor ] rotation_policy { automatic { time_before_expiry = "P30D" } expire_after = "P90D" notify_before_expiry = "P29D" } } # Customer Managed Key for Disk Encryption resource "azurerm_key_vault_key" "stcmky" { name = "stor-key" key_vault_id = azurerm_key_vault.kv.id key_type = "RSA" key_size = 4096 key_opts = ["decrypt", "encrypt", "sign", "unwrapKey", "verify", "wrapKey"] depends_on = [ azurerm_role_assignment.keystor ] rotation_policy { automatic { time_before_expiry = "P30D" } expire_after = "P90D" notify_before_expiry = "P29D" } }