Enterprise Identity Architecture with Microsoft Entra ID
Enterprise-Scale Multi-Region Identity Architecture
Design and implement a multi-region Entra ID architecture that mirrors Fortune 500 identity infrastructure. Master Conditional Access, Privileged Identity Management, and hybrid identity scenarios.
This project teaches the exact skills used by identity architects at Fortune 500 companies:
| Enterprise Requirement | What You'll Implement | Consulting Value |
|---|---|---|
| Multi-Tenant Design | Entra ID Tenant + Resource Groups | $150K+ projects |
| Conditional Access | 10+ Risk-Based Policies | Zero Trust compliance |
| Privileged Identity Management | JIT Admin Access | SOX/PCI compliance |
| Hybrid Identity | Azure AD Connect Setup | M&A integration |
| Access Reviews | Automated Certification | Audit readiness |
| Week | Focus Area | Time |
|---|---|---|
| Week 1 | Tenant Setup + User Provisioning | 8 hours |
| Week 2-3 | App Registrations + Conditional Access | 12 hours |
| Week 4 | Hybrid Identity + AD Connect | 16 hours |
| Week 5-6 | PIM + Access Reviews | 20 hours |
| Week 7-8 | Production Hardening + Disaster Recovery | 12 hours |
Total: 6-8 weeks (68 hours)
Understanding Microsoft Entra ID Architecture
Microsoft Entra ID (formerly Azure AD) is the backbone of Microsoft's cloud identity platform
| Tier | Key Features | Lab Access |
|---|---|---|
| Entra ID Free | Basic SSO, user management | ✅ Always free |
| Entra ID P1 | Conditional Access, Group-based licensing | ✅ M365 Dev Program |
| Entra ID P2 | PIM, Identity Protection, Access Reviews | ✅ M365 Dev Program |
The Microsoft 365 Developer Program gives you free E5 licenses which include Entra ID P2 - giving you access to PIM, Identity Protection, and Access Reviews!
| Lesson | Why It Matters | Prevention |
|---|---|---|
| Conditional Access policies create decision paths | 5+ policies can create complex interactions | Start with 2-3 policies, document interactions |
| Service accounts are targets | Every integration uses a service account | Rotate credentials monthly, use managed identities |
| Audit logging is critical | Compliance (SOX, GDPR) requires 1-year retention | Budget storage; set retention policy immediately |
| Group nesting creates loops | Nested groups can cause access delays | Limit nesting to 3 levels |
What you need before starting
This project uses free Microsoft resources - no credit card required!
| Account | Purpose | Link |
|---|---|---|
| Microsoft 365 Developer Program | Free E5 licenses (includes Entra ID P2) | Join Here → |
| Azure Free Account | $200 credit + always-free services | Sign Up → |
| GitHub Account | Store scripts and configurations | Sign Up → |
This program gives you a free E5 sandbox with 25 user licenses renewable every 90 days. It includes Entra ID P2 which costs $9/user/month in production!
# ============================================
# INSTALL REQUIRED TOOLS (Windows/PowerShell)
# ============================================
# Install Azure CLI
winget install Microsoft.AzureCLI
# Install PowerShell 7 (if not installed)
winget install Microsoft.PowerShell
# Open PowerShell 7 and install Microsoft Graph SDK
Install-Module Microsoft.Graph -Scope CurrentUser
# Install Azure AD module (legacy, but still useful)
Install-Module AzureAD -Scope CurrentUser
# Verify installations
az --version
Get-Module -ListAvailable Microsoft.Graph
| Area | Level Needed | Learning Resource |
|---|---|---|
| Active Directory | Basic understanding | Your existing PAM experience covers this |
| OAuth 2.0 / OIDC | Conceptual understanding | Project A covers this |
| PowerShell | Basic scripting | Microsoft Learn free courses |
| JSON | Read/understand | Any online tutorial |
Creating your Entra ID tenant and resource structure
We'll set up a tenant that mirrors how Fortune 500 companies organize their cloud identity.
Your admin account will be: admin@yourname.onmicrosoft.com
This is your Global Administrator account for the lab.
Sign into Azure with the SAME account as your M365 Developer Program. This ensures your Azure subscription is linked to the same Entra ID tenant.
Create 4 resource groups to simulate a multi-region enterprise:
# ============================================
# CREATE MULTI-REGION RESOURCE GROUPS
# Simulates global enterprise structure
# ============================================
# Login to Azure CLI
az login
# Set your subscription (if you have multiple)
az account set --subscription "Azure subscription 1"
# Create Europe region resource group
az group create \
--name "rg-identity-europe" \
--location "uksouth" \
--tags Environment=Lab Region=Europe Purpose=Identity
# Create Americas region resource group
az group create \
--name "rg-identity-americas" \
--location "eastus" \
--tags Environment=Lab Region=Americas Purpose=Identity
# Create Asia Pacific region resource group
az group create \
--name "rg-identity-apac" \
--location "southeastasia" \
--tags Environment=Lab Region=APAC Purpose=Identity
# Create Central governance resource group
az group create \
--name "rg-identity-central" \
--location "westeurope" \
--tags Environment=Lab Region=Global Purpose=Governance
# Verify all groups created
az group list --output table
| Users can register applications | No |
| Restrict non-admin users from creating tenants | Yes |
| Users can consent to apps | No |
Creating 500+ test users with PowerShell automation
Automate the creation of realistic test users across multiple departments and regions
# ============================================
# CONNECT TO MICROSOFT GRAPH
# Required for user and group management
# ============================================
# Import the Microsoft Graph module
Import-Module Microsoft.Graph
# Connect with required scopes
Connect-MgGraph -Scopes @(
"User.ReadWrite.All",
"Group.ReadWrite.All",
"Directory.ReadWrite.All",
"RoleManagement.ReadWrite.Directory"
)
# Verify connection
Get-MgContext
# Should show your tenant and account info
# ============================================
# CREATE DEPARTMENT GROUPS
# Mirrors enterprise organizational structure
# ============================================
# Define departments
$departments = @(
@{Name="SG-IT-Admins"; Desc="IT Administrators"},
@{Name="SG-IT-HelpDesk"; Desc="IT Help Desk Staff"},
@{Name="SG-Engineering"; Desc="Software Engineers"},
@{Name="SG-Finance"; Desc="Finance Department"},
@{Name="SG-HR"; Desc="Human Resources"},
@{Name="SG-Sales"; Desc="Sales Team"},
@{Name="SG-Executives"; Desc="Executive Leadership"}
)
# Create each department group
foreach ($dept in $departments) {
$params = @{
DisplayName = $dept.Name
Description = $dept.Desc
MailEnabled = $false
MailNickname = $dept.Name.ToLower()
SecurityEnabled = $true
}
New-MgGroup @params
Write-Host "Created group: $($dept.Name)"
}
# Create region groups
$regions = @("SG-Region-Europe", "SG-Region-Americas", "SG-Region-APAC")
foreach ($region in $regions) {
New-MgGroup -DisplayName $region `
-MailEnabled:$false `
-MailNickname $region.ToLower() `
-SecurityEnabled
}
# ============================================
# BULK CREATE 500 TEST USERS
# Creates realistic users across departments
# ============================================
# Get your tenant domain
$tenantDomain = (Get-MgOrganization).VerifiedDomains |
Where-Object {$_.IsDefault} |
Select-Object -ExpandProperty Name
# Sample first and last names
$firstNames = @("James","Mary","John","Patricia","Robert","Jennifer","Michael","Linda","David","Elizabeth","William","Barbara","Richard","Susan","Joseph","Jessica","Thomas","Sarah","Charles","Karen")
$lastNames = @("Smith","Johnson","Williams","Brown","Jones","Garcia","Miller","Davis","Rodriguez","Martinez","Hernandez","Lopez","Gonzalez","Wilson","Anderson")
# Department distribution (weighted)
$deptWeights = @{
"Engineering" = 150
"Sales" = 100
"Finance" = 75
"HR" = 50
"IT" = 100
"Executives" = 25
}
# Default password for test users
$passwordProfile = @{
Password = "TestP@ssw0rd123!"
ForceChangePasswordNextSignIn = $true
}
# Create users
$userCount = 0
foreach ($dept in $deptWeights.Keys) {
for ($i = 1; $i -le $deptWeights[$dept]; $i++) {
$firstName = $firstNames | Get-Random
$lastName = $lastNames | Get-Random
$upn = "$firstName.$lastName$i@$tenantDomain"
$userParams = @{
DisplayName = "$firstName $lastName"
UserPrincipalName = $upn
MailNickname = "$firstName$lastName$i"
AccountEnabled = $true
PasswordProfile = $passwordProfile
Department = $dept
JobTitle = "$dept Specialist"
UsageLocation = "US"
}
try {
New-MgUser @userParams
$userCount++
Write-Progress -Activity "Creating Users" -Status "$userCount / 500"
} catch {
Write-Warning "Failed: $upn"
}
}
}
Write-Host "Created $userCount users!" -ForegroundColor Green
This scale lets you test: bulk operations, group dynamics, license management, and conditional access at near-enterprise levels. Single-digit users won't reveal scaling issues.
Implementing Zero Trust access controls
Conditional Access is the foundation of Microsoft's Zero Trust model - never trust, always verify
| Name | CA001: Block Legacy Authentication |
| Users | All users |
| Cloud apps | All cloud apps |
| Conditions → Client apps | ☑️ Legacy authentication clients |
| Grant | Block access |
| Enable policy | Report-only (first), then On |
Enable new policies in "Report-only" mode first. Check sign-in logs for 24-48 hours before enabling. This prevents accidentally locking out users!
| Name | CA002: Require MFA - All Users |
| Users | All users Exclude: Break-glass accounts |
| Cloud apps | All cloud apps |
| Conditions | None (apply always) |
| Grant | Require multi-factor authentication |
First, create a Named Location for allowed countries:
| Name | CA003: Block Foreign Access |
| Users | All users |
| Cloud apps | All cloud apps |
| Conditions → Locations | Exclude: Allowed Countries |
| Grant | Block access |
Just-in-time admin access with approval workflows
PIM eliminates permanent admin access. Users activate roles on-demand with time limits and approval.
| Maximum activation duration | 4 hours |
| Require justification | Yes |
| Require approval | Yes |
| Require MFA | Yes |
| Send notification on activation | Yes |
Eligible means users CAN activate the role when needed.
Active means the role is always on (avoid for privileged roles).
All admin roles should be Eligible only with 4-hour maximum activation.
Connecting on-premises AD with Entra ID
Azure AD Connect synchronizes your on-premises Active Directory with Entra ID
If you completed Project I (Hybrid Identity SSO Bridge with Samba AD), you can connect that environment to this Entra ID tenant using Azure AD Connect!
| Method | How It Works | When to Use |
|---|---|---|
| Password Hash Sync (PHS) | Hash of password copied to cloud | Simplest option, works if on-prem AD is down |
| Pass-Through Auth (PTA) | Cloud validates against on-prem AD live | Security requirement: passwords never leave on-prem |
| Federation (AD FS) | On-prem AD FS issues tokens | Complex enterprise requirements, smart cards |
Initial sync can take 30 minutes to several hours depending on user count. Subsequent delta syncs occur every 30 minutes.
Verify your enterprise identity architecture
Validate each component of your multi-region identity architecture
After completing this project, you can implement similar architectures for clients:
| Service | Typical Engagement |
|---|---|
| Entra ID Assessment & Roadmap | $15K - $30K |
| Conditional Access Implementation | $25K - $50K |
| PIM Deployment & Training | $20K - $40K |
| Hybrid Identity Migration | $50K - $150K |