0.Core.Foundation/key.vault.tf (148 lines of code) (raw):
############################################################################
# Key Vault (https://learn.microsoft.com/azure/key-vault/general/overview) #
############################################################################
variable keyVault {
type = object({
name = string
type = string
enableForDeployment = bool
enableForDiskEncryption = bool
enableForTemplateDeployment = bool
enablePurgeProtection = bool
enableTrustedServices = bool
softDeleteRetentionDays = number
secrets = list(object({
name = string
value = string
}))
keys = list(object({
name = string
type = string
size = number
operations = list(string)
}))
certificates = list(object({
name = string
subject = string
issuerName = string
contentType = string
validMonths = number
key = object({
type = string
size = number
reusable = bool
exportable = bool
usage = list(string)
})
}))
})
}
locals {
keyVault = {
secretName = {
sshKeyPublic = "SSHKeyPublic"
sshKeyPrivate = "SSHKeyPrivate"
adminUsername = "AdminUsername"
adminPassword = "AdminPassword"
serviceUsername = "ServiceUsername"
servicePassword = "ServicePassword"
gatewayConnection = "GatewayConnection"
}
keyName = {
dataEncryption = "DataEncryption"
}
}
}
resource azurerm_role_assignment key_vault_reader {
role_definition_name = "Key Vault Reader" # https://learn.microsoft.com/azure/role-based-access-control/built-in-roles/security#key-vault-reader
principal_id = azurerm_user_assigned_identity.studio.principal_id
scope = azurerm_key_vault.studio.id
}
resource azurerm_role_assignment key_vault_crypto_service_encryption_user {
role_definition_name = "Key Vault Crypto Service Encryption User" # https://learn.microsoft.com/azure/role-based-access-control/built-in-roles/security#key-vault-crypto-service-encryption-user
principal_id = azurerm_user_assigned_identity.studio.principal_id
scope = azurerm_key_vault.studio.id
}
resource azurerm_key_vault studio {
name = var.keyVault.name
resource_group_name = azurerm_resource_group.studio.name
location = azurerm_resource_group.studio.location
tenant_id = data.azurerm_client_config.current.tenant_id
sku_name = var.keyVault.type
enabled_for_deployment = var.keyVault.enableForDeployment
enabled_for_disk_encryption = var.keyVault.enableForDiskEncryption
enabled_for_template_deployment = var.keyVault.enableForTemplateDeployment
purge_protection_enabled = var.keyVault.enablePurgeProtection
soft_delete_retention_days = var.keyVault.softDeleteRetentionDays
enable_rbac_authorization = true
network_acls {
bypass = var.keyVault.enableTrustedServices ? "AzureServices" : "None"
default_action = "Deny"
ip_rules = [
"${jsondecode(data.http.client_address.response_body).ip}/32"
]
}
}
resource azurerm_key_vault_secret studio {
for_each = {
for secret in var.keyVault.secrets : secret.name => secret
}
name = each.value.name
value = each.value.value
key_vault_id = azurerm_key_vault.studio.id
}
resource azurerm_key_vault_key studio {
for_each = {
for key in var.keyVault.keys : key.name => key
}
name = each.value.name
key_type = each.value.type
key_size = each.value.size
key_opts = each.value.operations
key_vault_id = azurerm_key_vault.studio.id
}
resource azurerm_key_vault_certificate studio {
for_each = {
for certificate in var.keyVault.certificates : certificate.name => certificate
}
name = each.value.name
key_vault_id = azurerm_key_vault.studio.id
certificate_policy {
x509_certificate_properties {
subject = each.value.subject
key_usage = each.value.key.usage
validity_in_months = each.value.validMonths
}
issuer_parameters {
name = each.value.issuerName
}
secret_properties {
content_type = each.value.contentType
}
key_properties {
key_type = each.value.key.type
key_size = each.value.key.size
reuse_key = each.value.key.reusable
exportable = each.value.key.exportable
}
}
}
data tls_public_key ssh_key {
private_key_pem = tls_private_key.ssh_key.private_key_pem
}
resource tls_private_key ssh_key {
algorithm = var.keyVault.keys[0].type
rsa_bits = var.keyVault.keys[0].size
}
resource azurerm_key_vault_secret ssh_key_private {
name = local.keyVault.secretName.sshKeyPrivate
value = tls_private_key.ssh_key.private_key_pem
key_vault_id = azurerm_key_vault.studio.id
}
resource azurerm_key_vault_secret ssh_key_public {
name = local.keyVault.secretName.sshKeyPublic
value = trimspace(data.tls_public_key.ssh_key.public_key_openssh)
key_vault_id = azurerm_key_vault.studio.id
}
output keyVault {
value = merge(local.keyVault, {
name = var.keyVault.name
})
}