Create an Azure Key Vault with RBAC role assignments using Terraform

Azure Key Vault is a Microsoft Azure resource that securely stores and manages sensitive data, including secrets, encryption keys, and certificates, it features soft deletion of secrets, renovation of certificates, and security features including Role-Based Access Control (RBAC) and private network access.

In this post, I will show you how to use Terraform to create an Azure Key Vault and populate it adding some secrets. Additionally, I will show you how to use Terraform to assign a user a role so that they can create secrets in Azure Key Vault.

Create an Azure Key Vault using Terraform

What do you need

  1. Your subscription_id, this is a GUID and you can get it using one of the following ways:

    • Using Azure CLI:

      az account subscription list
      
    • Using the Azure Portal.

  2. Your tenant_id, this is a GUID and you can get it using one of the following ways:

    • Using Azure CLI:

      az account tenant list
      
    • Using the Azure Portal in the column Directory ID.

      Azure Portal directories

Terraform files

main.tf

terraform {
  required_providers {
    azurerm: {
      source : "hashicorp/azurerm"
      version: "4.11.0"
    }
  }
}

provider "azurerm" {
  # Configuration options
  features {
    key_vault {
      purge_soft_delete_on_destroy   : true
      recover_soft_deleted_key_vaults: true
    }
  }

  subscription_id: "a838fdd3-56b8-4508-93db-9611367b3aee" # Put your 'subscription_id' here

  tenant_id: "c4421ca3-5bd8-472b-99c4-6b231540eac1" # Put your 'tenant_id' here
}

data "azurerm_client_config" "current" {}

In this file you declare the Terraform provider.

keyvault.tf

resource "azurerm_resource_group" "secrets_rg" {
  name    : "secrets"
  location: "westus3"
}

resource "azurerm_key_vault" "secrets_keyvault" {
  tenant_id          : data.azurerm_client_config.current.tenant_id
  resource_group_name: azurerm_resource_group.secrets_rg.name

  name    : "secrets"
  location: azurerm_resource_group.secrets_rg.location

  enable_rbac_authorization      : true
  enabled_for_deployment         : false
  enabled_for_disk_encryption    : false
  enabled_for_template_deployment: true
  public_network_access_enabled  : false
  purge_protection_enabled       : true
  soft_delete_retention_days     : 90

  sku_name: "standard"
}

You can customize the Azure Key Vault in this file.

secrets.tf

resource "azurerm_key_vault_secret" "db_development" {
  name        : "DbConnectionStringDevelopment"
  value       : "mysql://root:password123@db.example.com:3306/mydatabase"
  key_vault_id: azurerm_key_vault.secrets_keyvault.id
}

This file will store non-sensitive secrets, such as secrets for development or integration environments.

Role assignment using Terraform

Now we are assigning a user a role to access and manage secrets in the Azure Key Vault previously created.

Azure RBAC has some built-in roles that can be assigned to a user or group, allowing granular control over access to Azure Key Vault.

What do you need

  1. The principal_id of the user or group (also known as Object ID), this is a GUID and you can get it using one of the following ways:

    • Using Azure CLI:

      az ad user list --query "[].{Id:id, Name: displayName, Email: mail}" --output table
      
    • Using the Azure Portal.

  2. The role_definition_id of the role that you want to assign, this is a GUID and you can get it using one of the following ways:

    • Using Azure CLI:

      az role definition list --query "[?contains(roleName, 'Key Vault')].{Name:name, Description: description}" --output table
      
    • Using the Microsoft Docs in the column ID.

Terraform files

rbac.tf

resource "azurerm_role_assignment" "keyvault_secrets_officer_john" {
  scope: azurerm_key_vault.secrets_keyvault.id

  principal_id      : "8c4ab003-5dcd-49e2-86df-8f96b1f46a0d" # Put your 'principal_id' here
  role_definition_id: "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" # Put your 'role_definition_id' here
}

References