top of page

Kom i gang med Terraform og automatisert tilgangsstyring i Microsoft Entra ID

  • Writer: Bjørnar Aassveen
    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:

  1. Bruker søker tilgang til en Access Package

  2. Blir medlem av en Entra ID‑gruppe

  3. Gruppen gir eligible tilgang til flere Entra ID roller via PIM

  4. Bruker kan aktivere:

    • Global Reader – med godkjenning

    • Global Administrator – med godkjenning

    • Teams Administrator – uten godkjenning

    • SharePoint Administrator – uten godkjenning

  5. 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 terraform

Windows (winget)

winget install Hashicorp.Terraform

  1. Installer VS Code‑utvidelser

I VS Code (Extensions):

  • Terraform (HashiCorp)

  • Azure Resources

  • Azure CLI Tools 


  1. Opprett Terraform‑prosjekt i VS Code


  1. File → Open Folder

  2. Opprett eller velg en mappe, f.eks:

entra-terraform
  1. Opprett filene

I VS Code Explorer (venstre side):

Høyreklikk i mappen → New File, og opprett:

main.tf
providers.tf
variables.tf
terraform.tfvars

  1. Konfigurer 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
}
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 login

Hvis 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.


  1. Å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
}
  1. Å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"
}

  1. 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


bottom of page