← Back
JML Monitor Lab
Detta projekt byggdes för att förstå Joiner / Mover / Leaver-processer,
gruppbaserad RBAC och hur access förändras över tid i Microsoft Entra ID.
Målet var också att förstå hur Microsoft Graph API fungerar i praktiken
och hur man kan upptäcka access drift och risker via automation.
Arkitektur
Entra ID → Microsoft Graph API → Python → State Comparison → JML Detection
Steg 1 — Skapa Entra-labb
Först skapades en testmiljö i Microsoft Entra ID.
Flera users skapades för att simulera olika typer av access:
- HR users
- IT users
- Admin users
- Production users
Sedan skapades grupper:
- HR
- Admin
- Production
- Technical administrator VM
- VNET TECH
Users placerades sedan i olika grupper för att simulera RBAC.
Steg 2 — Registrera app i Entra ID
För att kunna använda Microsoft Graph API skapades en App Registration.
- Entra ID
- App registrations
- New registration
Appen fick namnet:
JML-Monitor
Efter skapandet sparades:
Steg 3 — Skapa Client Secret
Sedan skapades en Client Secret för authentication mot Microsoft identity platform.
- Certificates & secrets
- New client secret
Secret-värdet sparades direkt eftersom det bara visas en gång.
Steg 4 — API Permissions
För att kunna läsa users, grupper och audit-data behövdes Microsoft Graph permissions.
- API permissions
- Add permission
- Microsoft Graph
Permissions:
- User.Read.All
- Group.Read.All
- Directory.Read.All
- AuditLog.Read.All
Efter detta gavs:
Grant admin consent
Steg 5 — Installera Python
För att bygga monitorn installerades:
Sedan installerades requests:
pip install requests
Steg 6 — Skapa Python-script
Ett Python-script skapades:
get_token.py
Scriptet skulle:
- Autentisera mot Entra ID
- Hämta users
- Hämta gruppmedlemskap
- Analysera access
Steg 7 — Authentication mot Entra
Scriptet började med authentication mot Microsoft identity platform.
Använde:
- tenant_id
- client_id
- client_secret
Token hämtades via:
https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token
Grant type:
client_credentials
Steg 8 — Hämta users från Graph API
Efter authentication hämtades users från Microsoft Graph API.
https://graph.microsoft.com/v1.0/users
Följande data hämtades:
- displayName
- userPrincipalName
- id
Steg 9 — Loopa users
Alla users loopades:
for user in users["value"]
För varje user hämtades:
Steg 10 — Hämta gruppmedlemskap
För varje user hämtades gruppmedlemskap via Graph API:
https://graph.microsoft.com/v1.0/users/{user_id}/memberOf
Sedan loopades grupperna:
for g in groups.get("value", [])
Gruppnamn sparades i:
user_groups = []
Steg 11 — Skapa JML-logik
Efter att users och grupper hämtats byggdes logik för att upptäcka risker och förändringar.
Exempel:
- Admin access
- HR + Admin (SoD-konflikt)
- Disabled konto med access
- Nya grupper
- Borttagen access
- Access som låg kvar
Steg 12 — Skapa state snapshot
För att kunna jämföra förändringar över tid skapades:
state.json
Den sparade:
Steg 13 — Jämföra historik
Vid nästa körning:
- Lästes tidigare state.json
- Ny data hämtades från Graph API
- Skillnader jämfördes
Exempel:
- Nya grupper
- Borttagna grupper
- Förändrad access
Steg 14 — Exempel på detektion
Monitorn kunde sedan visa:
⚠️ NY ACCESS
🚨 BORTTAGEN ACCESS
🚨 RISK: Admin access
🚨 RISK: SoD-konflikt
Steg 15 — Skydda secrets
Under projektet upptäcktes att secrets varit exponerade i script.
Detta åtgärdades genom att:
- Skapa nytt secret
- Flytta secrets till .env
Resultat
Monitorn kunde nu:
- Övervaka gruppförändringar
- Upptäcka access drift
- Visa mover/leaver-scenarion
- Analysera RBAC via grupper
- Jämföra historik över tid
Lärdomar
- RBAC blir tydligare via grupper
- Historik behövs för att upptäcka förändringar
- Access drift syns först vid jämförelse
- JML blir tydligt i praktiken
- Graph API ger mycket värdefull data
- Security handlar mycket om logik och struktur
Möjliga nästa steg
- Teams alerts
- Audit log monitor
- Sign-in detection
- Risk scoring
- Identity monitoring agent
- Conditional Access integration