tf/keyvault.tf (91 lines of code) (raw):

resource "time_sleep" "delay_create" { depends_on = [azurerm_key_vault_access_policy.admin] # As policies are created in the same deployment add some delays to propagate create_duration = "20s" } resource "azurerm_key_vault" "azhop" { name = local.key_vault_name location = local.create_rg ? azurerm_resource_group.rg[0].location : data.azurerm_resource_group.rg[0].location resource_group_name = local.create_rg ? azurerm_resource_group.rg[0].name : data.azurerm_resource_group.rg[0].name enabled_for_disk_encryption = true enabled_for_deployment = true enabled_for_template_deployment = true tenant_id = local.tenant_id # soft delete is enabled by default now (2021-8-25), with 90 days retention # soft_delete_enabled = true soft_delete_retention_days = 7 purge_protection_enabled = true # TODO => Add the option to enable VMs to keep secrets in KV sku_name = "standard" network_acls { default_action = local.locked_down_network ? "Deny" : "Allow" bypass = "AzureServices" ip_rules = local.grant_access_from virtual_network_subnet_ids = [local.create_admin_subnet ? azurerm_subnet.admin[0].id : data.azurerm_subnet.admin[0].id] } } resource "azurerm_key_vault_access_policy" "admin" { key_vault_id = azurerm_key_vault.azhop.id tenant_id = local.tenant_id object_id = local.logged_user_objectId secret_permissions = [ "Get", "Set", "List", "Delete", "Purge", "Recover", "Restore" ] } # Only create the reader access policy when the key_vault_reader is set resource "azurerm_key_vault_access_policy" "reader" { count = local.key_vault_readers != null ? 1 : 0 key_vault_id = azurerm_key_vault.azhop.id tenant_id = local.tenant_id object_id = local.key_vault_readers != null ? local.key_vault_readers : local.logged_user_objectId secret_permissions = [ "Get", "List" ] } resource "azurerm_key_vault_secret" "admin_password" { depends_on = [time_sleep.delay_create, azurerm_key_vault_access_policy.admin] # As policies are created in the same deployment add some delays to propagate name = format("%s-password", local.admin_username) value = random_password.password.result key_vault_id = azurerm_key_vault.azhop.id lifecycle { ignore_changes = [ value ] } } #adding a domain join user secret. If the customer doesn't bring their own AD then this will be the same as the admin password. resource "azurerm_key_vault_secret" "domain_join_password" { count = local.use_existing_ad ? 1 : 0 depends_on = [time_sleep.delay_create, azurerm_key_vault_access_policy.admin] # As policies are created in the same deployment add some delays to propagate name = format("%s-password", local.domain_join_user) value = local.create_ad ? random_password.password.result : local.domain_join_password key_vault_id = azurerm_key_vault.azhop.id lifecycle { ignore_changes = [ value ] } } resource "azurerm_key_vault_secret" "admin_ssh_private" { depends_on = [time_sleep.delay_create, azurerm_key_vault_access_policy.admin] name = format("%s-private", local.admin_username) value = tls_private_key.internal.private_key_pem key_vault_id = azurerm_key_vault.azhop.id lifecycle { ignore_changes = [ value ] } } resource "azurerm_key_vault_secret" "admin_ssh_public" { depends_on = [time_sleep.delay_create, azurerm_key_vault_access_policy.admin] name = format("%s-public", local.admin_username) value = tls_private_key.internal.public_key_openssh key_vault_id = azurerm_key_vault.azhop.id lifecycle { ignore_changes = [ value ] } }