Lab Metadata
Core technologies
Scenario and Description
Lab 03 enforced MFA for everyone at Northgate. That defeats the commonest attacks, but it does not defeat the most dangerous one aimed at privileged staff: adversary-in-the-middle phishing. A tool such as a reverse-proxy phishing kit sits between the user and the real Microsoft sign-in page, captures the password, relays the MFA prompt, and steals the resulting session token. App push, SMS and one-time codes are all phishable this way, because the user is tricked into completing a genuine challenge on the attacker's behalf.
Phishing-resistant methods break this. FIDO2 security keys and Windows Hello for Business use public-key cryptography bound to the real sign-in origin. The credential will not release a signature to a look-alike domain, so a proxy has nothing to relay. There is no shared secret to capture. This is why the brief calls for deploying "enhanced robust authentication, such as YubiKeys, for operational support accounts", these are the accounts an attacker most wants and most targets.
You will enable FIDO2 and Temporary Access Pass in the Authentication Methods policy, issue a Temporary Access Pass so a support engineer can bootstrap a security key with no password at all, register and verify a FIDO2 key, optionally restrict which key models are permitted, and then upgrade the CA002 admin policy from "require MFA" to "require phishing-resistant authentication strength". Finally you set up Windows Hello for Business for standard corporate devices.
Prerequisites
Prior labs
Labs 01, 02 and 03 are required. This lab upgrades the CA002 admin policy created in Lab 03 and relies on the break-glass accounts from Lab 03 staying excluded. The Authentication Methods policy from Lab 02 is where FIDO2 and TAP are enabled.
Hardware note
Graph scopes introduced
| Scope | Why it is needed |
|---|---|
Policy.ReadWrite.AuthenticationMethod | Enable FIDO2 and Temporary Access Pass in the policy |
UserAuthenticationMethod.ReadWrite.All | Issue a Temporary Access Pass and read registered FIDO2 methods |
Policy.ReadWrite.ConditionalAccess | Upgrade CA002 to an authentication strength |
Real-World Problem Statement
Privileged and operational support accounts are the highest-value targets in any tenant. Protecting them with a phishable factor leaves the crown jewels one convincing email away from compromise. The problem is not only choosing a phishing-resistant method, it is onboarding people onto it without a password bootstrap that reintroduces the weakness.
| Dimension | Why this matters |
|---|---|
| Risk | Adversary-in-the-middle phishing defeats app and SMS MFA. Only origin-bound cryptographic credentials stop it. |
| Compliance | Phishing-resistant MFA for privileged access is an explicit expectation in modern Zero Trust and government guidance. |
| Productivity | Temporary Access Pass lets support staff onboard a key in minutes without a helpdesk password reset, and passwordless sign-in is faster day to day. |
| Security posture | Moving admins to keys removes the single most impactful attack path against the tenant. |
Concrete scenario: Northgate has 30 operational support engineers with standing access to sensitive systems. The CISO wants every one of them on a hardware security key within a fortnight, onboarded without emailing passwords around, and wants the admin Conditional Access policy to reject anything less than a phishing-resistant credential.
Skills Mapped to Production Solutions
| Skill learned in this lab | Real-world enterprise application |
|---|---|
| Enabling and restricting FIDO2 in the policy | Rolling out hardware keys and allowlisting approved models by AAGUID |
| Issuing Temporary Access Pass | Passwordless onboarding and secure account recovery for support teams |
| Applying an authentication strength in Conditional Access | Demanding phishing-resistant credentials for privileged access |
| Verifying registered methods via Graph | Auditing which admins actually hold hardware-backed credentials |
| Configuring Windows Hello for Business | Passwordless sign-in on corporate Windows estates at scale |
Architecture Overview
The flow has two halves. Onboarding: a Temporary Access Pass lets a passwordless user register a FIDO2 key. Enforcement: Conditional Access requires an authentication strength that only phishing-resistant methods satisfy.
Step-by-Step Implementation
Phase A - Enable the phishing-resistant methods
1Enable FIDO2 and Temporary Access Pass in the policy
Purpose: make hardware keys and a passwordless onboarding pass available before you onboard anyone.
Context: a Temporary Access Pass (TAP) is a time-limited code an administrator issues so a user can sign in and register a strong credential without ever using a password. It is the standard way to bootstrap passwordless.
Enable FIDO2 (with attestation) and TAP
Connect-MgGraph -Scopes 'Policy.ReadWrite.AuthenticationMethod', 'UserAuthenticationMethod.ReadWrite.All','Policy.ReadWrite.ConditionalAccess' -NoWelcome # --- FIDO2 security keys --- $fido2Body = @{ '@odata.type' = '#microsoft.graph.fido2AuthenticationMethodConfiguration' state = 'enabled' isSelfServiceRegistrationAllowed = $true isAttestationEnforced = $true # require the key to prove its make and model includeTargets = @(@{ targetType='group'; id='all_users' }) } Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration ` -AuthenticationMethodConfigurationId 'Fido2' -BodyParameter $fido2Body # --- Temporary Access Pass --- $tapBody = @{ '@odata.type' = '#microsoft.graph.temporaryAccessPassAuthenticationMethodConfiguration' state = 'enabled' defaultLifetimeInMinutes = 60 defaultLength = 8 isUsableOnce = $true # one-time use is the safer default for onboarding minimumLifetimeInMinutes = 10 maximumLifetimeInMinutes = 480 includeTargets = @(@{ targetType='group'; id='all_users' }) } Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration ` -AuthenticationMethodConfigurationId 'TemporaryAccessPass' -BodyParameter $tapBody
'Fido2','TemporaryAccessPass' | ForEach-Object {
(Get-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
-AuthenticationMethodConfigurationId $_) | Select-Object Id,State }
# Expected: both show State = enabled
What just happened? The tenant now permits hardware keys and can issue passwordless onboarding passes. Attestation enforcement means Entra will record the make and model of every registered key, which you use next to restrict to approved models.
Phase B - Onboard a support engineer passwordless
2Issue a Temporary Access Pass to lokafor
Purpose: let the support engineer sign in and register a key without a password.
Create an operational-support group and issue a TAP
$domain = (Get-MgOrganization).VerifiedDomains | Where-Object IsDefault | Select-Object -ExpandProperty Name # Group to hold operational support accounts (used for targeting later). $ops = New-MgGroup -DisplayName 'Ops-Support-PhishResistant' -MailEnabled:$false ` -MailNickname 'ops-support-pr' -SecurityEnabled:$true $lokafor = Get-MgUser -Filter "userPrincipalName eq 'lokafor@$domain'" New-MgGroupMember -GroupId $ops.Id -DirectoryObjectId $lokafor.Id # Issue a one-time TAP valid for 60 minutes. $tap = New-MgUserAuthenticationTemporaryAccessPassMethod -UserId $lokafor.Id ` -BodyParameter @{ isUsableOnce = $true; lifetimeInMinutes = 60 } Write-Host "TAP for lokafor: $($tap.TemporaryAccessPass)" -ForegroundColor Yellow Write-Host "Valid until: $($tap.StartDateTime.AddMinutes(60))"
What just happened? lokafor can now go to the sign-in page, enter the TAP instead of a password, and reach the security-info page to add a key. No password ever changes hands, which removes the weakest link in a passwordless rollout.
3Register the FIDO2 key and verify it via Graph
Purpose: bind an origin-bound credential to the account and confirm it landed.
User ceremony, then administrator verification
# USER STEP (lokafor, in a browser): # 1. Go to https://aka.ms/mysecurityinfo and sign in using the TAP. # 2. Add sign-in method > Security key (or Passkey), follow the prompts, # touch the key when asked, and give it a name such as 'YubiKey-lokafor'. # ADMIN VERIFICATION (Graph): read the registered FIDO2 methods. Get-MgUserAuthenticationFido2Method -UserId $lokafor.Id | Select-Object DisplayName, Model, AaGuid, CreatedDateTime
AaGuid. Record that AAGUID, you use it in the optional restriction step below. An empty result means the ceremony did not complete, retry the registration.
4Optional: restrict to approved key models by AAGUID
Purpose: permit only the security-key models your organisation has vetted and purchased.
Context: an AAGUID is a 128-bit identifier for a specific authenticator make and model. Allowlisting AAGUIDs stops staff registering unknown or low-assurance keys.
Enforce an AAGUID allowlist on the FIDO2 configuration
# Populate with the AAGUIDs of models you approve. Yubico publishes these, # and you can read one from a registered key with Get-MgUserAuthenticationFido2Method. $approvedAaGuids = @( '<yubikey-5-series-aaguid>', '<yubikey-5-nfc-aaguid>' ) $restrictBody = @{ '@odata.type' = '#microsoft.graph.fido2AuthenticationMethodConfiguration' state = 'enabled' isAttestationEnforced = $true keyRestrictions = @{ isEnforced = $true enforcementType = 'allow' # only these AAGUIDs may register; use 'block' to deny specific ones aaGuids = $approvedAaGuids } includeTargets = @(@{ targetType='group'; id='all_users' }) } Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration ` -AuthenticationMethodConfigurationId 'Fido2' -BodyParameter $restrictBody
Phase C - Demand phishing-resistant strength for admins
5Upgrade CA002 to require a phishing-resistant authentication strength
Purpose: make the admin Conditional Access policy reject any factor weaker than a phishing-resistant credential.
Context: an "authentication strength" is a named set of allowed methods. Entra ships three built-ins: multi-factor, passwordless MFA, and phishing-resistant MFA. You point CA002 at the phishing-resistant built-in, whose fixed id is 00000000-0000-0000-0000-000000000004.
Swap the MFA control for the phishing-resistant strength
$ca002 = Get-MgIdentityConditionalAccessPolicy ` -Filter "displayName eq 'CA002 - Require MFA for admin roles'" $prStrengthId = '00000000-0000-0000-0000-000000000004' # built-in: Phishing-resistant MFA $update = @{ grantControls = @{ operator = 'OR' builtInControls = @() 'authenticationStrength@odata.bind' = "https://graph.microsoft.com/v1.0/policies/authenticationStrengthPolicies/$prStrengthId" } # Keep it report-only first if you want to preview, then set to enabled. state = 'enabledForReportingButNotEnforced' } Update-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId $ca002.Id -BodyParameter $update
enabled until every targeted admin has a registered FIDO2 key or Windows Hello for Business. An admin without a phishing-resistant method will be blocked from all apps the moment this enforces. Validate in report-only, confirm each admin is key-registered, then flip to enabled. Your break-glass accounts remain excluded and are your recovery path.
reportOnlyFailure (the strength is not met). Sign in with the registered key, the result should be reportOnlySuccess. That contrast is the whole point of the control.
What just happened? The admin policy now measures the quality of the credential, not merely that some second factor happened. App push, which a proxy can relay, no longer satisfies it. Only a key or Windows Hello does.
Phase D - Windows Hello for Business
6Enable Windows Hello for Business for corporate devices
Purpose: give standard staff on managed Windows devices a phishing-resistant, passwordless sign-in without carrying a separate key.
Context: Windows Hello for Business (WHfB) provisions a device-bound biometric or PIN credential backed by the device TPM. It is configured on the device through Intune (or Group Policy), and the recommended hybrid model is cloud Kerberos trust, which lets the WHfB credential reach on-premises resources without a certificate infrastructure.
Enablement path (Intune) and what it produces
# WHfB is device-provisioned, not a single Graph call. The enablement path: # # 1. Microsoft Intune admin center > Devices > Enrollment > # Windows Hello for Business. Set 'Configure Windows Hello for Business' = Enabled. # 2. Set PIN policy (length, complexity) and enable biometric use. # 3. For hybrid access to on-prem resources, deploy 'cloud Kerberos trust': # run the Entra Kerberos server object setup on a domain controller # (Set-AzureADKerberosServer via the AzureADHybridAuthenticationManagement module). # # Result: on an enrolled Windows device, the user provisions a PIN or face/fingerprint, # which becomes a phishing-resistant credential that satisfies the same authentication # strength you applied to CA002.
Testing and Validation
- TAP onboarding: sign in as lokafor using the issued TAP, confirm you reach the security-info page without a password.
- Key registration: register a key, then confirm it via
Get-MgUserAuthenticationFido2Method. - Strength enforcement (report-only): as jpatel, app push yields
reportOnlyFailureon CA002, the key yieldsreportOnlySuccess. - Break-glass safety: confirm CA002 still shows
notAppliedfor break-glass before you enforce.
| Symptom | Cause | Resolution |
|---|---|---|
| TAP rejected at sign-in | Expired, already used, or TAP method disabled | Confirm TAP config is enabled, issue a fresh one-time pass |
| Key registration blocked | AAGUID allowlist excludes the key, or attestation failed | Add the key's AAGUID to the allowlist, or relax attestation for the pilot |
| Admin blocked after enforcing CA002 | Admin had no phishing-resistant method registered | Sign in via break-glass, set CA002 to report-only, register the admin's key, re-enforce |
authenticationStrength@odata.bind error | Malformed bind URL or wrong strength id | Use the exact built-in id and the v1.0 authenticationStrengthPolicies path |
Security Analysis
What makes this sound
- Origin binding: FIDO2 and WHfB credentials refuse to sign for a look-alike domain, defeating adversary-in-the-middle phishing that beats app and SMS MFA.
- Passwordless bootstrap: Temporary Access Pass removes the password from onboarding, so there is no weak credential to phish during rollout.
- Quality-based enforcement: authentication strengths let Conditional Access demand a specific credential class for privileged access, not merely any second factor.
Intentionally simplified for the lab
- The AAGUID allowlist uses placeholders. Production populates it from your approved hardware catalogue.
- WHfB is described at the enablement and architecture level, its full device rollout is an Intune workstream in its own right.
- TAP delivery is manual. At scale, integrate issuance into a governed onboarding or recovery workflow.
Production hardening
- Enforce attestation and an AAGUID allowlist so only vetted keys can register.
- Apply the phishing-resistant strength to all privileged roles and to access to your most sensitive applications, not admins alone.
- Monitor for any downgrade of an admin policy from a phishing-resistant strength to plain MFA as a tamper signal.
Cleanup Instructions
Revert CA002 to plain MFA and remove the ops group
$ca002 = Get-MgIdentityConditionalAccessPolicy -Filter "displayName eq 'CA002 - Require MFA for admin roles'"
Update-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId $ca002.Id -BodyParameter @{
grantControls = @{ operator='OR'; builtInControls=@('mfa'); 'authenticationStrength@odata.bind'=$null } }
$g = Get-MgGroup -Filter "displayName eq 'Ops-Support-PhishResistant'"
if ($g) { Remove-MgGroup -GroupId $g.Id }
# Remove a test FIDO2 method if you want a clean slate:
# Get-MgUserAuthenticationFido2Method -UserId $lokafor.Id | ForEach-Object {
# Remove-MgUserAuthenticationFido2Method -UserId $lokafor.Id -Fido2AuthenticationMethodId $_.Id }
Disconnect-MgGraph
Recommended Learning Links
Key Takeaways and Next Lab
- App and SMS MFA are phishable by real-time proxies. FIDO2 and Windows Hello are not, because credentials are bound to the real origin.
- Temporary Access Pass onboards users to passwordless with no password in the loop.
- Authentication strengths let Conditional Access demand a credential class, protecting privileged access specifically.
- Confirm every targeted admin holds a phishing-resistant method before enforcing, break-glass remains the safety net.
Identity Bytes // IB-ENTRA-SEC Track // Lab 04 of 12. British English. For lab and training use against a disposable tenant only.