Mobile Threat Defense Voor Microsoft 365 En Intune

💼 Management Samenvatting

Mobiele apparaten zijn de meest gebruikte toegangspoort tot Microsoft 365 en tegelijkertijd de kwetsbaarste schakel in Nederlandse overheidsomgevingen. Een volwassen Mobile Threat Defense-strategie combineert Intune, Microsoft Defender voor Endpoint en beleidsgestuurde automatisering om aanvallen te detecteren voordat ze gevoelige gegevens bereiken.

Aanbeveling
PLAN_EN_IMPLEMENTEER
Risico zonder
High
Risk Score
8/10
Implementatie
140u (tech: 80u)
Van toepassing op:
Microsoft Intune
Microsoft Defender voor Endpoint
BYOD-programma’s
Overheidsorganisaties

De dreiging rond mobiele platformen is verschoven van opportunistische malware naar geavanceerde ketenaanvallen waarbij mobiele apparaten worden ingezet om tokens te stelen, accounts over te nemen of beheerdersportalen binnen te dringen. Overheidsorganisaties moeten kunnen aantonen dat zij moderne beveiliging toepassen, inclusief jailbreak-detectie, netwerkattestatie en integratie met voorwaardelijke toegang. Zonder Mobile Threat Defense is het onmogelijk om aan BIO, AVG en NIS2-uitbreidingen te laten zien dat mobiele toegang tot Microsoft 365 onder continu toezicht staat.

PowerShell Modules Vereist
Primary API: Microsoft Intune admin center, Microsoft 365 Defender portal
Connection: Browser voor beleidsconfiguratie en PowerShell (Microsoft Graph) voor geautomatiseerde controles en rapportage
Required Modules: Microsoft.Graph.Authentication

Implementatie

Dit artikel beschrijft hoe u Mobile Threat Defense strategisch verankert, hoe de architectuur er uitziet wanneer Defender voor Endpoint, Intune en externe signalen samenwerken, en hoe u de status van connectors, beleidsregels en responsprocessen meetbaar maakt via een PowerShell-script. De nadruk ligt op uitvoerbare maatregelen die direct toepasbaar zijn binnen het Nederlandse publieke domein.

Strategische urgentie en risicobeeld van mobiele bedreigingen

Mobiele toegang tot Microsoft 365 is voor Nederlandse ministeries, uitvoeringsorganisaties en gemeenten de standaard geworden doordat hybride werken en buitenlocaties structureel zijn verankerd. Daarmee verschuift het aanvalsoppervlak naar smartphones en tablets die vaak een mix van privé- en zakelijke apps bevatten en die in wisselende netwerken actief zijn. Moderne aanvallers richten zich op kwetsbaarheden in mobiele besturingssystemen, misbruiken smishing en push-bombing om MFA te omzeilen en gebruiken mobiele browsers om tokens of cookies te kapen. Zodra een aanvaller controle heeft over een mobiel apparaat met een geregistreerde Intune-identiteit, kan hij laterale beweging maken naar Exchange Online, SharePoint of zelfs Azure-beheerhulpmiddelen. De organisatie moet daarom het mobiele apparaat behandelen als volwaardig endpoint dat dezelfde mate van inzicht, telemetrie en responsmechanismen vereist als een laptop.

Het risicobeeld voor mobiele apparaten in de Nederlandse publieke sector wordt versterkt door de diversiteit aan gebruikersprofielen. Rijksinspecteurs, wijkteams, crisiscoördinatoren en beleidsadviseurs wisselen regelmatig bestanden uit met vertrouwelijke persoonsgegevens of staatsgevoelige analyses via mobiele apps. Tegelijkertijd worden apparaten vaak gedeeld of tijdelijk uitgeleend aan ketenpartners, waardoor het lastig is om traditionele eigendomslijnen te handhaven. Mobile Threat Defense (MTD) maakt het mogelijk om risico’s per apparaat en per context te beoordelen in plaats van generieke blokkades toe te passen. Het systeem detecteert afwijkend netwerkgedrag, ongeautoriseerde configuraties en exploitketens en koppelt die realtime terug aan Intune Conditional Access. Hierdoor kan een apparaat onmiddellijk worden geblokkeerd voor toegang tot Microsoft 365 zodra het risiconiveau het ingestelde drempeloverschrijdt, zelfs als de gebruiker fysiek buiten de organisatie aanwezig is.

NIS2 en de aankomende Wet beveiliging netwerk- en informatiesystemen 2 eisen dat essentiële en belangrijke entiteiten aantoonbaar passende technische en organisatorische maatregelen treffen voor alle digitale diensten. In auditgesprekken blijkt regelmatig dat mobiele apparaten onderbelicht zijn in risicoregisters en dat controles vooral gericht zijn op werkplekken en datacenters. Zonder gestructureerde MTD kan een auditor eenvoudig constateren dat de detectie- en responscapaciteit voor mobiele endpoints onvoldoende is gedocumenteerd, wat leidt tot afwijkingen op BIO-paragrafen 9.2 en 9.3 en ISO 27001-controles rond toegangsbeveiliging en monitoring. Een Mobile Threat Defense-programma zorgt voor traceerbare processen: welke bedreigingen zijn gedetecteerd, hoe snel is erop gereageerd, welke compensatiemaatregelen zijn afgedwongen en welke lessons learned zijn opgevolgd. Daarmee wordt beveiliging van mobiele toegang een vast onderdeel van de governancestructuur in plaats van een best effort-inspanning.

Een volwassen MTD-strategie vereist bovendien samenwerking tussen CISO’s, Intune-beheerders, SOC-analisten en leveranciersteams. Het programma moet een duidelijke product-roadmap volgen, bijvoorbeeld wanneer Defender voor Endpoint nieuwe beschermingsmechanismen introduceert of wanneer Apple en Google aanvullende beheer-API’s beschikbaar stellen. Door deze roadmap te koppelen aan het lifecyclemanagement van mobiele apparaten (aanbestedingen, vervangingsprogramma’s, contractuele eisen aan telecomproviders) ontstaat een duurzaam ecosysteem. Investeringen in mobiele beveiliging leveren dan niet alleen technische voordelen op, maar verminderen ook operationele verstoringen, beperkte toegangstijd en de kans dat crisisteams tijdens incidentrespons worden gehinderd door geblokkeerde apparaten. Strategisch gezien is Mobile Threat Defense dus een noodzakelijke poot van Zero Trust: vertrouwen wordt pas gegeven als het apparaat aantoonbaar gezond, up-to-date en vrij van actieve bedreigingen is.

Verder dwingt de toegenomen afhankelijkheid van ketenpartners tot een Mobile Threat Defense-aanpak waarbij juridische en contractuele verplichtingen worden vertaald naar meetbare controls. Veel rijksbrede programma’s werken met ingehuurde specialisten die eigen toestellen gebruiken of met leveranciers die beheer op afstand uitvoeren. Zonder duidelijke eisen rond MTD kan een leverancier verouderde versies van beheerde apps blijven inzetten of telemetriefiltering toepassen waardoor kritieke signalen nooit het SOC bereiken. Door in aanbestedingen en servicelevels vast te leggen dat apparaten moeten voldoen aan specifieke risicodrempels, dat Defender-signalen ongewijzigd worden doorgestuurd en dat incidentrapportages binnen vooraf bepaalde termijnen worden gedeeld, borgt de organisatie dat externe partijen dezelfde lat hanteren. Tegelijkertijd creëert u een prikkel voor gebruikers en leveranciers om verantwoord om te gaan met jailbreaks, sideloading en schaduw-apps, omdat de toegang tot Microsoft 365 automatisch wordt ingetrokken bij non-compliance en pas na aantoonbaar herstel weer wordt vrijgegeven.

Architectuur, integratie en automatisering van Mobile Threat Defense

Gebruik PowerShell-script mobile-threat-defense.ps1 (functie Invoke-MtdRemediation) – Maakt een referentieconfiguratie voor Mobile Threat Defense aan en legt device- en connectorprofielen vast zodat beheerders gericht verbeterplannen kunnen uitvoeren..

De technische architectuur voor Mobile Threat Defense bouwt voort op drie pijlers: Microsoft Intune als beleidsmotor, Microsoft Defender voor Endpoint als dreigingssensor en Conditional Access als beslislaag. Elk mobiel apparaat moet worden ingeschreven in Intune of via een Mobile Application Management-proces worden gecontroleerd, zodat basisgegevens zoals OS-versie, compliance-status en encryptie-instellingen beschikbaar zijn. Defender voor Endpoint levert aanvullende signalen over jailbreaks, verdachte netwerkverbindingen, misbruik van kwetsbaarheden of pogingen om root-certificaten te installeren. Intune combineert deze gegevens met andere bronnen, zoals risico-informatie van externe MTD-partners of een Secure Private Access-oplossing, en vertaalt dat naar een apparaatrisicoscore. Die score vormt de input voor Conditional Access, die op zijn beurt toegang tot Exchange Online, SharePoint, Teams en maatwerkapplicaties dynamisch kan toestaan, beperken of blokkeren. Hierdoor wordt de mobiele beveiligingsketen volledig geautomatiseerd en voortdurend gevoed met actuele dreigingsdata.

Een integratieplan moet expliciet beschrijven hoe apparaatcategorieën worden onderscheiden. Android Enterprise-apparaten kennen verschillende beheeropties (Work Profile, Dedicated, Fully Managed) met elk eigen beperkingen en vereisten, terwijl iOS en iPadOS afhankelijk zijn van User Enrollment, Device Enrollment of Automated Device Enrollment. Windows- en macOS-apparaten met mobiele workloads moeten hetzelfde MTD-proces doorlopen als tablets, omdat zij vaak via LTE of publiek wifi netwerktoegang krijgen. In de connectors van Defender voor Endpoint kunnen beheerders instellen welke platformen worden ondersteund, hoe vaak telemetrie wordt bijgewerkt en welke dreigingsniveaus tot een blokkade leiden. Het artikel benadrukt dat u per platform duidelijke fallback-scenario’s documenteert, bijvoorbeeld welke service desk de gebruiker begeleidt, welke beleidsregels tijdelijk kunnen worden versoepeld en hoe de organisatie communiceert naar ketenpartners wanneer apparaten worden geïsoleerd.

Automatisering vormt de brug tussen architectuur en dagelijkse operatie. Het bijbehorende PowerShell-script leest via de Microsoft Graph-API de status van Mobile Threat Defense-connectors, Intune compliance policies en de ingestelde risicodrempels uit. De gegevens worden opgeslagen in een configuratiebestand waarmee u trends kunt analyseren en snel kunt aantonen welke verbetermaatregelen zijn gepland. Bijvoorbeeld: zodra de scriptuitvoer laat zien dat Android-apparaten geen volledige jailbreak-detectie hebben omdat de Defender-connector uitgeschakeld staat, kan het team gericht een change aanvragen. Hetzelfde script genereert rapportages voor stuur- en auditdoeleinden zonder dat er screenshots of handmatige exports nodig zijn. Daarmee wordt aantoonbaarheid geborgd en kunnen wijzigingen in beleid binnen uren in plaats van weken worden gevalideerd.

Tot slot vraagt Mobile Threat Defense om integratie met bredere security- en complianceprocessen. Telemetrie uit Defender voor Endpoint moet beschikbaar zijn in het SOC, bijvoorbeeld via Microsoft Sentinel of een ander SIEM, zodat mobiele incidenten dezelfde prioriteit en opvolging krijgen als server- of werkplekincidenten. Gegevens over risicovolle apparaten kunnen tevens worden gedeeld met Identity Governance-processen, zodat accounts automatisch worden herbevestigd of tijdelijk worden ingeperkt. Documenteer bovendien welke juridische en privacy-implicaties spelen bij het analyseren van mobiele data: gebruikers moeten weten welke sensoren worden gelezen, hoe lang gegevens worden bewaard en hoe inspecties worden gelogd. Door deze randvoorwaarden in de architectuur op te nemen, voorkomt u discussies achteraf en houdt u regie op de balans tussen veiligheid, privacy en gebruiksgemak.

Een robuuste architectuur voorziet daarnaast in testbare uitwijkpaden. Scenario’s waarin Defender-signalen tijdelijk niet beschikbaar zijn door cloudstoringen of waarin bepaalde platformfabrikanten API-wijzigingen doorvoeren mogen niet leiden tot blinde vlekken. Leg daarom vast hoe u fallback-detectie inricht via netwerkgebaseerde sensoren, hoe u configuratieversies archiveert en hoe u snel kunt terugrollen naar een eerder beleidsprofiel als nieuwe instellingen onverwachte blokkades veroorzaken. Door architectuurdocumentatie te koppelen aan het configuratiebestand dat via het script wordt beheerd, kunnen teams aantonen welke versie van welk beleid actief was op het moment van een incident. Dit voorkomt discussie met auditors en maakt root-cause-analyses eenvoudiger omdat configuratie en telemetrie synchroon blijven.

Operationele borging, rapportage en continue verbetering

Gebruik PowerShell-script mobile-threat-defense.ps1 (functie Invoke-MtdMonitoring) – Leest meetgegevens van Mobile Threat Defense uit, genereert een rapport met connectorstatus en compliance-indicatoren en bewaart optioneel een auditlog..

Wanneer de architectuur staat, verschuift de aandacht naar operationele borging. Een Mobile Threat Defense-programma faalt zodra incidentrespons afhankelijk is van handmatige controles of losse spreadsheets. Daarom moet iedere wijziging in connectors, policies of conditional access-regels automatisch worden gelogd. Het PowerShell-script verzorgt een gestandaardiseerd rapport waarin voor elk platform is vastgelegd hoeveel apparaten in hoog, middel en laag risico vallen, welke policies een herbeoordeling nodig hebben en of alle vereiste Telemetry-signalen binnenkomen. SOC-analisten gebruiken dit rapport als startpunt voor week- of maandelijkse threat hunts, terwijl service managers het toevoegen aan capaciteitsvergaderingen om te bepalen of extra licenties, training of apparaten nodig zijn. Door het rapport in een centrale repository op te slaan, ontstaat een controleerbare lijn tussen beleidsbesluiten en feitelijke systeemconfiguraties.

Operationele excellentie vraagt ook om het inbedden van Mobile Threat Defense in bestaande processen zoals change management, problem management en leveranciersoverleg. Elke wijziging in mobiele OS-versies moet vooraf worden getoetst op compatibiliteit met Defender-functies, zeker wanneer leveranciers wijzigingen aanbrengen in kernel-extensies of netwerkstacks. Documenteer in runbooks hoe updates worden getest, welke testgroepen bestaan en hoe u terugvalt wanneer nieuwe firmware onverwacht beschermingslagen uitschakelt. Leg ook vast hoe u samenwerkt met externe MTD-leveranciers indien specifieke sectorale eisen, zoals vertrouwelijke informatie in de zorg of politie, extra sensoren vereisen. Het artikel benadrukt dat de organisatie looptijd en budget reserveert voor periodieke hercertificering, training van servicedesks en communicatie naar eindgebruikers over wat te verwachten is als een apparaat wordt geblokkeerd.

Continue verbetering betekent dat meetgegevens worden vertaald naar concrete KPI’s en stuurinformatie voor bestuurders. Voorbeelden zijn het percentage apparaten met actuele Defender-registratie, gemiddelde tijd tussen detectie en blokkade, en het aandeel incidenten dat via automatische policies is opgelost zonder menselijke interventie. Deze KPI’s worden opgenomen in de reguliere beveiligingsrapportage richting CIO, CISO en auditcomités. Door ze te koppelen aan BIO- en NIS2-controls kan de organisatie aantonen dat mobiele dreigingsdetectie niet alleen operationeel draait, maar ook strategisch wordt bestuurd. Wanneer KPI’s achterblijven, bijvoorbeeld doordat externe apps root-detectie blokkeren of omdat sommige gebruikers bewust jailbreaken, kan het bestuur gerichtere besluiten nemen over handhaving, juridische maatregelen of vervanging van diensten.

Tot slot hoort bij een volwassen Mobile Threat Defense-programma dat lessons learned worden vastgelegd en gedeeld binnen ketens en interbestuurlijke samenwerkingen. Nederlandse overheidsorganisaties wisselen vaak personeel en middelen uit tijdens crises, waardoor het zinvol is om standaarden en configuratieprofielen gezamenlijk te beheren. Het artikel adviseert om minimaal per kwartaal een review-sessie te organiseren waarin security-architecten, SOC-leads en Intune-beheerders het rapport uit het script vergelijken met actuele dreigingsinformatie van het NCSC en internationale partners. Op basis daarvan kunnen nieuwe detectieregels worden ontwikkeld, kan het beleid rond privacy en logging worden bijgesteld en kan men besluiten om aanvullende investeringen te doen in gebruikersbewustzijn of hardware. Door deze feedbacklus te institutionaliseren, wordt Mobile Threat Defense een continu verbeterproces dat meegroeit met technologische en geopolitieke ontwikkelingen.

Co-sourcing en samenwerking met gespecialiseerde dienstverleners verdient hierbij nadrukkelijk aandacht. Veel middelgrote gemeenten of samenwerkingsverbanden beschikken niet over een 24/7 SOC en vertrouwen op gedeelde diensten van bijvoorbeeld de IBD of commerciële partners. Spreek expliciet af welke partij Mobile Threat Defense-alerts opvolgt, hoe escalaties verlopen buiten kantooruren en hoe bewijs wordt veiliggesteld wanneer een apparaat mogelijk betrokken is bij strafrechtelijk onderzoek. Neem deze afspraken op in het configuratie- en rapportageproces zodat helder is welke organisatie aan zet is per type incident. Dit voorkomt vertraging tijdens crisissituaties en maakt duidelijk wie eindverantwoordelijk is richting toezichthouders wanneer er vragen worden gesteld over mobiele gegevenslekken.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# .SYNOPSIS Mobile Threat Defense assessment, remediatie en monitoring voor Microsoft 365. .DESCRIPTION Controleert de status van Mobile Threat Defense-connectors en Intune-compliancebeleid, genereert rapportages en beheert een configuratiebestand waarmee Nederlandse overheidsorganisaties aantoonbaar voldoen aan BIO- en NIS2-eisen voor mobiele apparaten. .NOTES Filename: mobile-threat-defense.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-27 Version: 1.0 Related JSON: content/m365/mobile/mobile-threat-defense.json Workload: m365 Category: mobile .EXAMPLE .\mobile-threat-defense.ps1 -Assessment -ReportPath .\mtd-assessment.json Voert een live-assessment uit en slaat het resultaat als JSON-bestand op. .EXAMPLE .\mobile-threat-defense.ps1 -Remediation -DebugMode Genereert op basis van voorbeelddata een configuratiebestand voor Mobile Threat Defense. .EXAMPLE .\mobile-threat-defense.ps1 -Monitoring -ReportPath .\rapporten\mtd-monitoring.json Combineert een actuele meting met het configuratiebestand en schrijft een auditrapport weg. #> #Requires -Version 5.1 [CmdletBinding()] param( [switch]$Assessment, [switch]$Remediation, [switch]$Monitoring, [string]$ReportPath, [switch]$DebugMode, [switch]$WhatIf ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Mobile Threat Defense Toolkit" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Get-MtdConfigPath { <# .SYNOPSIS Bepaalt het pad naar het configuratiebestand. #> [CmdletBinding()] param() $scriptDir = Split-Path -Parent $PSCommandPath return (Join-Path -Path $scriptDir -ChildPath "mobile-threat-defense.config.json") } function Test-RequiredModules { <# .SYNOPSIS Controleert of vereiste modules beschikbaar zijn. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string[]]$ModuleNames ) foreach ($moduleName in $ModuleNames) { if (-not (Get-Module -ListAvailable -Name $moduleName -ErrorAction SilentlyContinue)) { throw "Vereiste module '$moduleName' is niet gevonden. Installeer de module voordat u een live-assessment uitvoert." } } } function Ensure-GraphConnection { <# .SYNOPSIS Zorgt voor een geldige Microsoft Graph-verbinding. #> [CmdletBinding()] param() Test-RequiredModules -ModuleNames @('Microsoft.Graph.Authentication') Import-Module Microsoft.Graph.Authentication -ErrorAction Stop | Out-Null $context = Get-MgContext -ErrorAction SilentlyContinue $requiredScopes = @( 'DeviceManagementApps.Read.All', 'DeviceManagementConfiguration.Read.All', 'DeviceManagementServiceConfig.Read.All' ) $needsConnect = $true if ($context) { $scopeDifference = Compare-Object -ReferenceObject $requiredScopes -DifferenceObject $context.Scopes if ($scopeDifference.Count -eq 0 -and $context.ExpirationTime -gt (Get-Date)) { $needsConnect = $false } } if ($needsConnect) { Write-Host "Verbinding maken met Microsoft Graph..." -ForegroundColor Gray Connect-MgGraph -Scopes $requiredScopes -NoWelcome | Out-Null } try { Select-MgProfile -Name beta } catch { throw "Kan het Microsoft Graph-profiel 'beta' niet selecteren. Update de Microsoft.Graph-module." } } function Invoke-GraphPagedRequest { <# .SYNOPSIS Haalt alle pagina's van een Graph-request op. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$Uri ) $results = @() $nextLink = $Uri while ($nextLink) { $response = Invoke-MgGraphRequest -Method GET -Uri $nextLink -OutputType PSObject if ($response.value) { $results += $response.value } $nextLink = $response.'@odata.nextLink' } return $results } function Get-MtdConnectorSnapshot { <# .SYNOPSIS Bepaalt de status van alle Mobile Threat Defense-connectors. #> [CmdletBinding()] param( [switch]$DebugMode ) if ($DebugMode) { return @( [PSCustomObject]@{ ConnectorId = 'debug-android' Name = 'Microsoft Defender voor Endpoint' Platform = 'Android' IsEnabled = $true PartnerState = 'active' BlockOnMissingData = $true LastHeartbeat = (Get-Date).AddMinutes(-15) PartnerAppType = 'microsoftDefenderForEndpoint' }, [PSCustomObject]@{ ConnectorId = 'debug-ios' Name = 'Microsoft Defender voor Endpoint' Platform = 'iOS/iPadOS' IsEnabled = $true PartnerState = 'active' BlockOnMissingData = $true LastHeartbeat = (Get-Date).AddMinutes(-20) PartnerAppType = 'microsoftDefenderForEndpoint' }, [PSCustomObject]@{ ConnectorId = 'debug-windows' Name = 'Microsoft Defender voor Endpoint' Platform = 'Windows' IsEnabled = $true PartnerState = 'active' BlockOnMissingData = $true LastHeartbeat = (Get-Date).AddMinutes(-30) PartnerAppType = 'microsoftDefenderForEndpoint' } ) } Ensure-GraphConnection $rawConnectors = Invoke-GraphPagedRequest -Uri "https://graph.microsoft.com/beta/deviceManagement/mobileThreatDefenseConnectors" $records = @() foreach ($connector in $rawConnectors) { $platformMappings = @( @{ Platform = 'Android'; Enabled = $connector.androidEnabled; Block = $connector.androidDeviceBlockedOnMissingPartnerData }, @{ Platform = 'iOS/iPadOS'; Enabled = $connector.iosEnabled; Block = $connector.iosDeviceBlockedOnMissingPartnerData }, @{ Platform = 'Windows'; Enabled = $connector.windowsDeviceBlockedOnMissingPartnerData -ne $null; Block = $connector.windowsDeviceBlockedOnMissingPartnerData } ) foreach ($mapping in $platformMappings) { if ($mapping.Enabled -eq $null) { continue } $records += [PSCustomObject]@{ ConnectorId = $connector.id Name = $connector.displayName Platform = $mapping.Platform IsEnabled = [bool]$mapping.Enabled PartnerState = $connector.partnerState BlockOnMissingData = [bool]$mapping.Block LastHeartbeat = $connector.lastHeartbeatDateTime PartnerAppType = $connector.partnerAppType } } } return $records } function Get-CompliancePolicySnapshot { <# .SYNOPSIS Leest Intune-compliancebeleid en bepaalt of mobiele risicodrempels zijn ingesteld. #> [CmdletBinding()] param( [switch]$DebugMode ) if ($DebugMode) { return @( [PSCustomObject]@{ Platform = 'Android' PolicyCount = 3 LatestUpdate = (Get-Date).AddDays(-7) ThreatRequirement = 'high' }, [PSCustomObject]@{ Platform = 'iOS/iPadOS' PolicyCount = 2 LatestUpdate = (Get-Date).AddDays(-5) ThreatRequirement = 'medium' }, [PSCustomObject]@{ Platform = 'Windows' PolicyCount = 1 LatestUpdate = (Get-Date).AddDays(-12) ThreatRequirement = 'unavailable' } ) } Ensure-GraphConnection $uri = "https://graph.microsoft.com/beta/deviceManagement/deviceCompliancePolicies?`$select=id,displayName,platformType,lastModifiedDateTime,deviceThreatProtectionRequiredSecurityLevel" $policies = Invoke-GraphPagedRequest -Uri $uri $platformMap = @{ androidForWork = 'Android' android = 'Android' iOS = 'iOS/iPadOS' macOS = 'macOS' windows10AndLater = 'Windows' windows81AndLater = 'Windows' windowsPhone81 = 'Windows Phone' unknown = 'Onbekend' } $groups = $policies | Group-Object -Property platformType $snapshots = @() foreach ($group in $groups) { $friendlyName = $platformMap[$group.Name] if (-not $friendlyName) { $friendlyName = $group.Name } $latest = ($group.Group | Sort-Object -Property lastModifiedDateTime | Select-Object -Last 1).lastModifiedDateTime $threatLevels = $group.Group.deviceThreatProtectionRequiredSecurityLevel | Where-Object { $_ } $requirement = if ($threatLevels -and $threatLevels.Count -gt 0) { ($threatLevels | Select-Object -Last 1) } else { 'notConfigured' } $snapshots += [PSCustomObject]@{ Platform = $friendlyName PolicyCount = $group.Group.Count LatestUpdate = $latest ThreatRequirement = $requirement } } return $snapshots } function Invoke-MtdAssessment { <# .SYNOPSIS Voert een integrale Mobile Threat Defense-beoordeling uit. #> [CmdletBinding()] param( [switch]$DebugMode ) $connectors = Get-MtdConnectorSnapshot -DebugMode:$DebugMode $policies = Get-CompliancePolicySnapshot -DebugMode:$DebugMode $issues = [System.Collections.Generic.List[string]]::new() if (-not $connectors -or $connectors.Count -eq 0) { $issues.Add("Er zijn geen Mobile Threat Defense-connectors gevonden in Intune. Activeer minimaal Microsoft Defender voor Endpoint.") } else { foreach ($connector in $connectors) { if (-not $connector.IsEnabled) { $issues.Add("Connector '$($connector.Name)' is uitgeschakeld voor platform $($connector.Platform).") } if ($connector.PartnerState -notin @('active', 'available')) { $issues.Add("Connector '$($connector.Name)' meldt partnerstatus '$($connector.PartnerState)'.") } if ($connector.LastHeartbeat) { $heartbeatAge = (Get-Date) - [datetime]$connector.LastHeartbeat if ($heartbeatAge.TotalHours -gt 24) { $issues.Add("Connector '$($connector.Name)' heeft langer dan 24 uur geen heartbeat verzonden.") } } else { $issues.Add("Connector '$($connector.Name)' rapporteert geen heartbeat en kan niet worden vertrouwd.") } if (-not $connector.BlockOnMissingData) { $issues.Add("Connector '$($connector.Name)' blokkeert apparaten niet wanneer dreigingsdata ontbreekt.") } } } if (-not $policies -or $policies.Count -eq 0) { $issues.Add("Er zijn geen device compliance policies gevonden. Stel minimaal per platform een beleid in.") } else { foreach ($policy in $policies) { if ($policy.PolicyCount -eq 0) { $issues.Add("Platform $($policy.Platform) heeft geen compliancebeleid.") } if ($policy.ThreatRequirement -eq 'notConfigured' -or $policy.ThreatRequirement -eq 'unavailable') { $issues.Add("Platform $($policy.Platform) heeft geen dreigingsniveau-eis configured in het compliancebeleid.") } elseif ($policy.ThreatRequirement -eq 'low') { $issues.Add("Platform $($policy.Platform) staat apparaten toe met een laag beveiligingsniveau. Verhoog de drempel naar medium of high.") } } } $result = [PSCustomObject]@{ Script = 'mobile-threat-defense.ps1' Timestamp = Get-Date IsHealthy = ($issues.Count -eq 0) ConnectorCount = if ($connectors) { $connectors.Count } else { 0 } Connectors = $connectors CompliancePolicies = $policies Issues = $issues } return $result } function Initialize-MtdConfig { <# .SYNOPSIS Bouwt een basisconfiguratie op basis van de assessmentresultaten. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] $Assessment ) $config = [ordered]@{ version = "1.0" lastUpdated = (Get-Date).ToString("yyyy-MM-dd") owner = "Security & Device Management Board" remediationPlaybook = @( "Valideer dagelijks de heartbeat van alle Mobile Threat Defense-connectors.", "Escalatie naar het SOC binnen 15 minuten zodra apparaten een hoog risiconiveau bereiken.", "Communiceer blokkades rechtstreeks met gebruikers via Intune-notificaties en servicedeskprocessen." ) connectors = @() policies = @() } if ($Assessment.Connectors) { foreach ($connector in $Assessment.Connectors) { $config.connectors += [ordered]@{ id = $connector.ConnectorId name = $connector.Name platform = $connector.Platform partnerState = $connector.PartnerState blockOnMissingData = $connector.BlockOnMissingData action = if ($connector.IsEnabled) { "Monitoren en documenteren" } else { "Inschakelen en testen" } owner = "Intune-team" dueDate = (Get-Date).AddDays(30).ToString("yyyy-MM-dd") } } } else { $config.connectors += [ordered]@{ id = "n/a" name = "Placeholder" platform = "Onbekend" partnerState = "notConfigured" blockOnMissingData = $false action = "Configureer Microsoft Defender voor Endpoint connector." owner = "Intune-team" dueDate = (Get-Date).AddDays(14).ToString("yyyy-MM-dd") } } if ($Assessment.CompliancePolicies) { foreach ($policy in $Assessment.CompliancePolicies) { $config.policies += [ordered]@{ platform = $policy.Platform policyCount = $policy.PolicyCount threatRequirement = $policy.ThreatRequirement nextReview = (Get-Date).AddDays(45).ToString("yyyy-MM-dd") } } } return $config } function Invoke-MtdRemediation { <# .SYNOPSIS Maakt of actualiseert het Mobile Threat Defense-configuratiebestand. #> [CmdletBinding()] param( [switch]$DebugMode ) $assessment = Invoke-MtdAssessment -DebugMode:$DebugMode $config = Initialize-MtdConfig -Assessment $assessment $configPath = Get-MtdConfigPath if ($WhatIf) { Write-Host "[WhatIf] Configuratie zou worden geschreven naar: $configPath" -ForegroundColor Yellow } else { $config | ConvertTo-Json -Depth 6 | Out-File -FilePath $configPath -Encoding UTF8 -Force Write-Host "[OK] Configuratiebestand opgeslagen: $configPath" -ForegroundColor Green } return $config } function Invoke-MtdMonitoring { <# .SYNOPSIS Combineert een actuele meting met het configuratiebestand. #> [CmdletBinding()] param( [switch]$DebugMode ) $assessment = Invoke-MtdAssessment -DebugMode:$DebugMode $configPath = Get-MtdConfigPath $config = $null if (Test-Path -Path $configPath) { $config = Get-Content -Path $configPath -Raw | ConvertFrom-Json } else { Write-Host "[WARN] Geen configuratiebestand gevonden op $configPath." -ForegroundColor Yellow } $monitoring = [PSCustomObject]@{ Script = 'mobile-threat-defense.ps1' Timestamp = Get-Date ConfigPath = $configPath ConfigDetected = [bool]$config ConfigVersion = if ($config) { $config.version } else { "not-found" } LastConfigUpdate = if ($config) { $config.lastUpdated } else { $null } Assessment = $assessment } return $monitoring } function Write-MtdReport { <# .SYNOPSIS Schrijft de resultaten naar een JSON-rapport. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] $Payload, [Parameter(Mandatory = $true)] [string]$Path ) if (-not $Path) { return } $directory = Split-Path -Parent $Path if ($directory -and -not (Test-Path -Path $directory)) { New-Item -ItemType Directory -Path $directory -Force | Out-Null } $Payload | ConvertTo-Json -Depth 6 | Out-File -FilePath $Path -Encoding UTF8 -Force Write-Host "[OK] Rapport opgeslagen: $Path" -ForegroundColor Green } $executed = $false if ($Remediation) { $config = Invoke-MtdRemediation -DebugMode:$DebugMode if ($ReportPath) { Write-MtdReport -Payload $config -Path $ReportPath } $executed = $true $config } if ($Assessment) { $result = Invoke-MtdAssessment -DebugMode:$DebugMode if ($ReportPath) { Write-MtdReport -Payload $result -Path $ReportPath } $executed = $true $result } if ($Monitoring) { $monitoringResult = Invoke-MtdMonitoring -DebugMode:$DebugMode if ($ReportPath) { Write-MtdReport -Payload $monitoringResult -Path $ReportPath } $executed = $true $monitoringResult } if (-not $executed) { Write-Host "Geen modus opgegeven. Gebruik minimaal een van de volgende schakelaars:" -ForegroundColor Yellow Write-Host " -Assessment Voer een Mobile Threat Defense-check uit." -ForegroundColor Yellow Write-Host " -Remediation Genereer of actualiseer het configuratiebestand." -ForegroundColor Yellow Write-Host " -Monitoring Combineer een meting met het configuratiebestand voor audits." -ForegroundColor Yellow Write-Host "Optioneel: -DebugMode voor lokale tests en -ReportPath voor JSON-rapportage." -ForegroundColor Yellow } Write-Host "`n========================================`n" -ForegroundColor Cyan

Risico zonder implementatie

Risico zonder implementatie
High: Zonder Mobile Threat Defense blijft mobiele toegang tot Microsoft 365 grotendeels onzichtbaar voor SOC’s, wat leidt tot hoge kans op misbruik van tokens, accountovernames en tekortkomingen bij audits op BIO en NIS2.

Management Samenvatting

Implementeer Mobile Threat Defense als integraal onderdeel van uw Zero Trust-architectuur door Intune, Defender voor Endpoint en Conditional Access te koppelen, meet de status continu met het aangeleverde PowerShell-script en leg governance vast zodat compliance-audits en operationele teams altijd zicht hebben op mobiele risico’s.