Kom i gang med Terraform og automatisert tilgangsstyring i Microsoft Entra ID
- Bjørnar Aassveen

- Apr 1
- 4 min read
Terraform er et verktøy for Infrastructure as Code (IaC), også for identitet og tilgang i Microsoft Entra ID. I denne guiden går jeg gjennom hvordan du kan bruke Terraform (kanskje) til å:
Opprette Entra ID‑grupper
Eksponere gruppen via Access Packages
Sette opp PIM roller som aktiveres via gruppemedlemskap
Kreve (eller ikke kreve) godkjenning
Begrense varighet til 4 timer
La sluttbruker selv søke tilgang
Jeg hadde selv aldri brukt Terraform før, så dette er ment å være en praktisk "kom i gang" guide, det kan tenkes det finnes kortere og bedre veier til mål her.
Arkitektur – hva bygger vi?
Målbildet er følgende:
Bruker søker tilgang til en Access Package
Blir medlem av en Entra ID‑gruppe
Gruppen gir eligible tilgang til flere Entra ID roller via PIM
Bruker kan aktivere:
Global Reader – med godkjenning
Global Administrator – med godkjenning
Teams Administrator – uten godkjenning
SharePoint Administrator – uten godkjenning
Alle roller (Definert pr rolle i GUI, støttes ikke i TF. pt.)
Krever PIM aktivering
Maks varighet: 4 timer
Krever begrunnelse

Forutsetninger
Før du starter trenger du:
En Entra ID tenant med P2 lisens
Global Administrator
Terraform installert lokalt
Azure CLI eller Microsoft Graph basert autentisering
1. Installer Terraform
macOS
brew install terraformWindows (winget)
winget install Hashicorp.Terraform
Installer VS Code‑utvidelser
I VS Code (Extensions):
Terraform (HashiCorp)
Azure Resources
Azure CLI Tools

Opprett Terraform‑prosjekt i VS Code
File → Open Folder
Opprett eller velg en mappe, f.eks:
entra-terraformOpprett filene
I VS Code Explorer (venstre side):
Høyreklikk i mappen → New File, og opprett:
main.tf
providers.tf
variables.tf
terraform.tfvarsKonfigurer Terraform‑provider (providers.tf)
terraform {
required_providers {
azuread = {
source = "hashicorp/azuread"
version = "~> 2.50"
}
}
}
provider "azuread" {
tenant_id = var.tenant_id
}VS Code vil nå:
gjenkjenne Terraform‑syntaks
foreslå blokker og felter
vise feil direkte i editoren
6. Variabler (variables.tf + terraform.tfvars)
variable "tenant_id" {
description = "Entra ID Tenant ID"
type = string
}
terraform.tfvars
tenant_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"Nå er grunnmuren satt opp i VScode med terraform struktur.
7. Autentisering mot Entra ID
Åpne Terminal i VS Code:
az loginHvis du får az: The term 'az' is not recognized, betyr det at Azure CLI ikke er installert eller ikke er på PATH. Installer Azure CLI og start terminalen på nytt før du kjører az login.
Nå som grunnstrukturen, verktøyene og tilgangen er på plass kan vi begynne å sette opp terraform koden som bygger det vi ønsker å bygge.
Åpne main.tf og opprette tilgangsgruppen
resource "azuread_group" "privileged_access_group" {
display_name = "Privileged-Access-Users"
security_enabled = true
mail_enabled = false
assignable_to_role = true
}Åpne main.tf og hente Entra ID‑rollene
Først må vi referere til de innebygde Entra‑rollene. Terraform oppretter dem ikke, de finnes allerede i tenant.
# Global Reader
resource "azuread_directory_role" "global_reader" {
display_name = "Global Reader"
}
# Global Administrator
resource "azuread_directory_role" "global_admin" {
display_name = "Global Administrator"
}
# Teams Administrator
resource "azuread_directory_role" "teams_admin" {
display_name = "Teams Administrator"
}
# SharePoint Administrator
resource "azuread_directory_role" "sharepoint_admin" {
display_name = "SharePoint Administrator"
}Gjør gruppen eligible for Entra ID roller (PIM)
# Global Reader – Eligible
resource "azuread_directory_role_assignment" "global_reader_pim" {
role_id = azuread_directory_role.global_reader.id
principal_object_id = azuread_group.privileged_access_group.object_id
}
# Global Administrator – Eligible
resource "azuread_directory_role_assignment" "global_admin_pim" {
role_id = azuread_directory_role.global_admin.id
principal_object_id = azuread_group.privileged_access_group.object_id
}
# Teams Administrator – Eligible
resource "azuread_directory_role_assignment" "teams_admin_pim" {
role_id = azuread_directory_role.teams_admin.id
principal_object_id = azuread_group.privileged_access_group.object_id
}
# SharePoint Administrator – Eligible
resource "azuread_directory_role_assignment" "sharepoint_admin_pim" {
role_id = azuread_directory_role.sharepoint_admin.id
principal_object_id = azuread_group.privileged_access_group.object_id
}Eksponer tilgang via Access Packages
I de forrige stegene har vi:
Opprettet en Entra ID gruppe
Gitt gruppen eligible tilgang til flere privilegerte roller via PIM
Konfigurert PIM‑policy (4 timer, godkjenning / ikke godkjenning)
Nå gjenstår det viktigste for sluttbrukeropplevelsen:
Hvordan får brukere tilgang til gruppen, uten at IT må legge dem inn manuelt?
Svaret er Access Packages i Entra ID
Første gangen man oppretter en access package må det også opprettes en access package katalog, altså hvor hører pakken hjemme?
resource "azuread_access_package_catalog" "privileged_catalog" {
display_name = "Privileged Access - Aassveen IT admin"
description = "Tilgang til privilegerte Entra ID-roller via PIM"
}Så oppretter vi selve access packagen
resource "azuread_access_package" "privileged_roles" {
display_name = "Privileged Entra Roles - Aassveen IT admin"
description = "Gir tilgang til privilegert gruppe som brukes for PIM-roller"
catalog_id = azuread_access_package_catalog.privileged_catalog.id
}
Når det er gjort må gruppen linkes til access package
Støttes pt. ikke og må gjøres i GUI
Som siste steg må vi opprette en access package policy: hvem kan søke, og hvordan.
Vi oppretter en policy som styrer:
hvem som kan søke
om tilgang er tidsbegrenset
om det kreves godkjenning
I mitt tilfelle oppretter jeg en policy som ikke krever godkjenning
resource "azuread_access_package_assignment_policy" "self_service_policy" {
access_package_id = azuread_access_package.privileged_roles.id
display_name = "Privileged access – self service"
description = "Self-service tilgang til privilegert gruppe"
requestor_settings {
scope_type = "AllExistingDirectoryMemberUsers"
}
}
Da har vi definert oppsettet og er klare for å kjøre det ut i produksjon (test er vel for pingler.. eller?) 🐣
Fra terminal i VSCODE
terraform init
terraform plan
terraform apply


Nå som koden er kjørt er gruppen opprettet, gruppen har fått roller og tilgangspakken er publisert. Jeg måtte konfigurere tilknytning på tilgangspakken og varighet på PIM roller med godkjenning og/eller ikke godkjenning manuelt i GUI da dette ikke støttes pt.
For sluttbruker vil gangen da være:
Klikk på tilgangspakken og be om tilgang, her må jeg jukse litt da påskeharen har stukket av med lisensen min (Legger til min bruker i gruppa fra Entra ID)

Nå som brukeren min har fått tilgang til gruppa som igjen har tilgang til rollene via PIM kan jeg elevere meg via "mine roller" https://portal.azure.com/#view/Microsoft_Azure_PIMCommon/ActivationMenuBlade/~/aadmigratedroles
Til slutt står jeg igjen med en løsning som i stor grad er Infrastructure as Code, men med noen bevisste manuelle steg, særlig rundt PIM policyer, varighet og enkelte detaljer i Access Packages. Terraform gir oss struktur, forutsigbarhet og et solid rammeverk, mens de mest følsomme innstillingene settes en gang i portalen. Ikke perfekt, men langt bedre enn klikk‑klikk‑glemt‑hvorfor.
Og da az login, Graph og Identity Governance bestemte seg for å være vanskelige, endte jeg opp med å gjøre en klassisk Ingrid Espelid manøver: “litt mer av dette, så funker det", i form av å gi meg selv Identity Governance Administrator. Ikke nødvendigvis etter oppskriften, men middagen ble servert. Men som første møte med Terraform og Entra ID? Absolutt godkjent, og ganske lærerikt underveis. Dokumentasjon: Docs overview | hashicorp/azuread | Terraform | Terraform Registry
Bjørnar&AI



Comments