Endpoint Management: App Protection Policies Als Primaire Gegevensschil

💼 Management Samenvatting

App Protection Policies (APP) zijn de dunste maar meest kritische beveiligingsschil rond productiviteitsapps op endpoints. Ze zorgen ervoor dat gevoelige dossiers, noodplannen en persoonsgegevens die via Microsoft 365 worden geopend nooit onversleuteld buiten de applicatiecontainer terechtkomen, ook niet wanneer medewerkers op een privétoestel, een gemeentelijke leenlaptop of een crisislocatie werken. Binnen de Nederlandse Baseline voor Veilige Cloud vormt APP het bewijs dat Zero Trust echt doordringt tot het applicatieniveau.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
280u (tech: 120u)
Van toepassing op:
iOS/iPadOS
Android Enterprise
Windows 11
macOS
Microsoft 365 Apps
Microsoft Intune

Zonder APP blijft elke vorm van BYOD of gedeeld device een gok. De BIO eist dat data op mobiele apparaten aantoonbaar is beschermd en de AVG verwacht dat organisaties kunnen uitleggen hoe ze verlies, diefstal en misbruik voorkomen. Inspecties door de Autoriteit Persoonsgegevens en de Algemene Rekenkamer tonen aan dat juist apps als Outlook, Teams en OneDrive het grootste datalekrisico vormen omdat gebruikers data kopiëren naar persoonlijke opslag of screenshots delen. App Protection Policies brengen daar verandering in door encryptie, conditional launch en uitgefaseerde gegevensoverdracht te orkestreren via Intune en Microsoft Graph, terwijl audittrajecten precies kunnen aanwijzen welke maatregel op welk toestel stond ingeschakeld.

PowerShell Modules Vereist
Primary API: Microsoft Graph DeviceAppManagement API
Connection: Connect-MgGraph -Scopes DeviceManagementApps.Read.All, DeviceManagementApps.ReadWrite.All
Required Modules: Microsoft.Graph.Authentication, Microsoft.Graph.DeviceAppManagement, Microsoft.Graph.Beta.DeviceAppManagement

Implementatie

Dit artikel beschrijft hoe je APP als integraal onderdeel van endpointmanagement kunt verankeren. We behandelen de bestuurlijke afspraken, de technische architectuur, de operationele monitoring en de auditbestendigheid. Bij iedere stap leveren we concrete aanwijzingen, inclusief een PowerShell-script dat lokale debugtests ondersteunt, Graph-rapportages maakt en remediatie uitvoert. Het doel is dat CISO’s, werkplekbeheerders en beleidsmakers in één document vinden hoe ze beleid ontwerpen, het uitrollen naar duizenden endpoints sturen en tegelijk aantonen dat alle maatregelen voldoen aan de Nederlandse Baseline voor Veilige Cloud.

Governance, besluitvorming en ketenafspraken

Een volwassen APP-programma begint met bestuurlijke regie. De CIO en het CISO-office leggen in het informatiebeveiligingsbeleid vast dat elk device dat toegang heeft tot Microsoft 365-data een goedgekeurd APP-profiel moet ontvangen, ongeacht eigendom of locatie. Dit besluit staat niet op zichzelf; het wordt gekoppeld aan de centrale risicoanalyse en aan de Nederlandse Baseline voor Veilige Cloud zodat de board begrijpt welke dreigingen worden afgedekt. Tijdens het besluitvormingsproces wordt een APP-governanceboard ingericht waarin werkplekbeheer, het SOC, privacy officers, juridische adviseurs en communicatieprofessionals vertegenwoordigd zijn. Zij bewaken dat beleidswijzigingen via een formeel CAB-proces verlopen, bepalen welke uitzonderingen acceptabel zijn en zorgen dat het beleid synchroon loopt met andere maatregelen zoals Conditional Access en Purview DLP.

Omdat Nederlandse overheden intensief samenwerken met ketenpartners moeten contracten, verwerkersovereenkomsten en convenanten dezelfde eisen reflecteren. In iedere inkoop- of uitbestedingsovereenkomst wordt opgenomen dat leveranciers alleen verbinding mogen maken via devices met APP en dat zij logging zeven jaar beschikbaar houden. Het privacyteam definieert welke gegevens in auditlogs mogen worden opgeslagen en beschrijft hoe burgers worden geïnformeerd wanneer selectieve wipe-acties plaatsvinden op een BYOD-toestel. Ook wordt vastgelegd hoe uitzonderingen worden aangevraagd: een proceseigenaar beschrijft het risico, een CISO-deputy beoordeelt compenserende maatregelen en het governanceboard bepaalt de maximale looptijd. Door deze governanceketen ontstaat een aantoonbaar spoor van besluiten, waardoor bestuurders precies weten welke maatregelen zijn getroffen op dienstreizen, verkiezingsavonden of crisislocaties.

Financiële zekerheid en organisatorische capaciteit zijn cruciaal om beleid niet te laten stranden. Begrotingen reserveren structureel middelen voor Intune-licenties, Graph-automatisering, training en servicedeskondersteuning. Er wordt een centraal roadmapdocument bijgehouden waarin elke wijziging aan APP-configuraties wordt afgezet tegen lopende programma’s zoals hybride werken, generatieve AI of sectorale ketenprojecten. Hierdoor kunnen CIO-staven prioriteit geven aan APP-verbeteringen wanneer dreigingsniveaus oplopen of wetgeving verandert. Tegelijk wordt aandacht besteed aan adoptie: communicatieafdelingen ontwikkelen standaardcampagnes voor gebruikers, leggen uit waarom clipboardbeperkingen of biometrische PIN’s nodig zijn en zorgen dat bestuurders consistent dezelfde boodschap uitdragen. Governance stopt dus niet bij een beleidsdocument maar omvat besluitvorming, contractering, budgettering en stakeholdermanagement in één sluitende cyclus.

Tenslotte organiseert governance een expliciete link tussen APP en andere controles. De board bepaalt hoe Purview-labels worden vertaald naar APP-instellingen, welke Conditional Access policies APP-registratie afdwingen en hoe SOC-playbooks reageren op niet-conforme apparaten. Door deze relaties vast te leggen in het ISMS ontstaat een netwerk van maatregelen dat tijdens audits eenvoudig is te volgen. Dezelfde documentatie dient als input voor jaarlijkse directieverklaringen, waardoor bestuurders overtuigend kunnen aantonen dat zij zorgplicht hebben ingevuld.

Architectuur, ontwerp en configuratiepatronen

Gebruik PowerShell-script app-protection-policies.ps1 (functie Invoke-EndpointAppProtectionAssessment) – Voert lokale debugtests uit, leest APP-configuraties via Microsoft Graph en controleert of encryptie, conditional launch, data transfer-beperkingen en platformassignments overeenkomen met de Nederlandse Baseline..

De architectuur start met een datacentrisch model. Iedere dataclassificatie uit het informatiebeveiligingsbeleid krijgt een eigen APP-profiel met unieke instellingen voor encryptie, conditional launch, clipboardgedrag, opslaglocaties en offline toegang. Deze profielen worden per platform verfijnd: iOS- en Android-profielen benutten het volledige Intune SDK-spectrum, terwijl Windows en macOS profiteren van Windows Information Protection of Defender for Endpoint App Control. Architecten beschrijven een standaard lifecycle waarin nieuwe apps eerst in een LocalDebug-tenant worden getest, daarna in een pilotring met zogenaamde blauwe gebruikersgroepen en pas na positieve evaluatie in productie worden uitgerold. Op die manier blijven instellingen consistent en reproduceerbaar.

Voor toewijzing van beleid worden dynamische Entra ID-groepen, Intune filters en device-tags gecombineerd. Een device dat is geregistreerd voor crisismanagement krijgt automatisch het strengste profiel inclusief blokkade van lokale opslag en verplichte biometrische verificatie. BYOD-apparaten ontvangen selectieve wipe-instellingen en time-outs wanneer het apparaat langer dan 30 minuten offline is. Architectuurdocumenten schrijven ook voor hoe verbonden apps zoals Azure Virtual Desktop, Teams Rooms en third-party field service apps in dezelfde container terechtkomen. Hierdoor ontstaan geen schaduwapplicaties of dubbele standaarden.

Integratie met andere beveiligingslagen is essentieel. Architecten koppelen APP-signalen aan Microsoft Sentinel zodat een plotselinge toename van niet-conforme apparaten direct een incident veroorzaakt. Tevens wordt beschreven hoe Purview DLP acties triggert wanneer een gebruiker probeert geclassificeerde gegevens buiten de APP-container te exporteren. Power Apps, SharePoint-synchronisatie en Viva Connections krijgen duidelijke richtlijnen voor welke componenten binnen of buiten de container mogen draaien. De architectuur benoemt bovendien hoe offline scenario’s, apparaten van ketenpartners en gedeelde tablets in publieksbalies worden ondersteund zonder het beleid te verzwakken.

Tot slot legt het ontwerp vast hoe configuratiebeheer wordt geautomatiseerd. Alle APP-profielen worden als JSON opgeslagen in een Git-repository, waar het PowerShell-script bij elke wijziging een hash berekent en de payload valideert voordat deze via Graph wordt gepubliceerd. Feature-flags en staged deployments zorgen ervoor dat wijzigingen eerst naar een beperkt aantal gebruikers gaan. Rollback-stappen staan letterlijk in het runbook, inclusief wie contact opneemt met communicatie en welke compenserende maatregelen het SOC toepast wanneer een configuratie fout loopt. Hiermee beweegt endpointmanagement weg van handmatige klikwerk en groeit het uit tot een herhaalbaar DevSecOps-proces.

Operaties, monitoring en respons

Gebruik PowerShell-script app-protection-policies.ps1 (functie Invoke-EndpointAppProtectionOperations) – Produceert dagrapporten, exporteert compliancegegevens naar CSV of JSON en kan optioneel remediatieacties uitvoeren voor apparaten die niet aan APP-vereisten voldoen..

Operations draait om zichtbaarheid. Het script verzamelt gegevens uit managedAppRegistrations, managedAppStatuses en policyDeviceStateSummary en vergelijkt de uitkomsten met de baseline. Resultaten worden verrijkt met device-tags, dataclassificaties en risicoscores waarna Power BI dashboards laten zien welke organisatieonderdelen achterlopen, hoeveel selectieve wipes zijn uitgevoerd en waar gebruikers structureel fouten maken tijdens inschrijving. SOC-analisten ontvangen dezelfde data via Sentinel zodat dashboards en detectieregels naadloos aansluiten.

Responsprocessen zijn vooraf uitgewerkt. Wanneer het script detecteert dat een beleidsinstelling ontbreekt, start automatisch een Azure Automation runbook dat het profiel opnieuw publiceert. Voor niet-conforme apparaten genereert het script een ITSM-ticket met apparaatnaam, laatst geziene activiteit en aanbevolen remediatie, terwijl het servicedesk-team een kant-en-klaar communicatiepakket krijgt om de gebruiker te begeleiden. Incidenten waarbij data toch buiten de container dreigt te komen worden gekoppeld aan Purview DLP, zodat blokkade, notificatie en forensische logging gelijk op lopen. Hierdoor blijft de responstijd binnen de eisen van de BIO en NIS2.

Capaciteitsplanning en leveranciersmanagement zijn eveneens onderdeel van operations. Elke maand bespreekt het APP-team met softwareleveranciers de roadmap van SDK’s, identificeert men breaking changes in mobiele besturingssystemen en plant men geautomatiseerde testscripts om regressies vroeg te detecteren. KPI’s zoals gemiddelde onboardingduur, aantal devices zonder recente check-in en hoeveelheid escalaties naar het SOC worden geanalyseerd zodat verbeteracties direct kunnen worden toegewezen. Deze aanpak voorkomt dat APP een statische configuratie blijft; het wordt een levende dienst die meebeweegt met technologische vernieuwing en veranderende dreigingsniveaus.

Gebruikerscommunicatie vormt de laatste laag. Zodra monitoring laat zien dat een grote groep gebruikers dezelfde foutmelding tegenkomt, lanceert het operations-team automatisch een gerichte campagne via Teams, e-mail en intranet waarin precies wordt uitgelegd hoe zij compliant raken. Trainingsmateriaal wordt up-to-date gehouden in het adoptieportaal en iedere wijziging aan beleid bevat duidelijke screenshots, tijdlijnen en servicedeskreferenties. Daardoor ervaren medewerkers APP niet als blokkade maar als onderdeel van hun digitale gereedschapskist.

Audittrail, bewijsvoering en continue verbetering

Auditbestendigheid betekent dat elke stap herleidbaar is. Het script slaat assessment-resultaten op in een append-only map met retentiebeleid, inclusief SHA256-hash en verwijzing naar de gebruikte Graph-eindpunten. CAB-notulen, uitzonderingsbesluiten en communicatie naar gebruikers worden gekoppeld aan hetzelfde dossier zodat auditors in één keer zien hoe beleid, uitvoering en adoptie samenkomen. Tijdens interne controles worden steekproeven genomen op drie willekeurige maanden, waarbij het team laat zien welk APP-profiel gold, welke logging is opgeslagen en welke remediatieacties zijn uitgevoerd. Zo ontstaat een sluitend verhaal richting Rekenkamer, toezichthouders en gemeenteraad.

Continue verbetering volgt het Plan-Do-Check-Act-principe. Na iedere releasecyclus evalueert het team telemetrie, servicedeskcases en security-incidenten. Bevindingen worden vertaald naar user stories met eigenaar, budget en deadline en krijgen een plek in de brede securityroadmap van de organisatie. Het programma koppelt KPI’s over APP aan enterprise-riskrapportages zodat bestuurders zien hoe de maatregel bijdraagt aan strategische doelstellingen zoals digitale soevereiniteit en cyberweerbaarheid. Door verbeteracties structureel te financieren en te documenteren blijft het programma volwassen, zelfs wanneer teams wisselen of leveranciers veranderen.

Tot slot wordt kennisdeling georganiseerd binnen de community van de Nederlandse Baseline voor Veilige Cloud. Organisaties publiceren referentieconfiguraties, lessons learned en incidentcases in het gezamenlijke kennisportaal, terwijl kwartaalwebinars zorgen dat nieuwe dreigingen of Microsoft-updates snel worden vertaald naar concrete APP-aanpassingen. Deze open samenwerking verlaagt de implementatiedruk voor kleinere gemeenten en waterschappen en zorgt voor een uniforme aanpak richting leveranciers en auditors.

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 Controleert en bewaakt Microsoft Intune App Protection Policies voor endpointmanagement. .DESCRIPTION Dit script inventariseert App Protection Policies (APP) voor iOS/iPadOS, Android, Windows en macOS, vergelijkt de configuratie met de Nederlandse Baseline voor Veilige Cloud en genereert rapportages. In LocalDebug-modus wordt voorbeelddata gebruikt zodat het script veilig lokaal kan worden getest zonder verbinding te maken met Microsoft Graph. Optioneel kan een remediatiepakket worden gemaakt dat ontbrekende beleidsprofielen beschrijft voor verdere implementatie. .NOTES Filename: app-protection-policies.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-27 Last Modified: 2025-11-27 Version: 1.0 Related JSON: content/m365/endpoint-management/app-protection-policies.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\app-protection-policies.ps1 -Assessment -LocalDebug Voert een volledige check uit met voorbeelddata zodat je lokaal kunt debuggen binnen 15 seconden. .EXAMPLE .\app-protection-policies.ps1 -Monitoring -OutputPath .\reports\app-protection-status.json Voert een monitoringrun uit, schrijft de resultaten weg naar JSON en kan worden gebruikt voor dashboards. .EXAMPLE .\app-protection-policies.ps1 -Remediation -OutputPath .\artifacts\app-protection-remediation.json Genereert een remediatiepakket met ontbrekende profielen en aanbevolen instellingen. #> #Requires -Version 5.1 [CmdletBinding()] param( [switch]$Assessment, [switch]$Monitoring, [switch]$Remediation, [string]$OutputPath, [switch]$WhatIf, [switch]$LocalDebug ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $ScriptName = 'app-protection-policies.ps1' $GraphScopes = @( 'DeviceManagementApps.Read.All', 'DeviceManagementApps.ReadWrite.All' ) if (-not ($Assessment -or $Monitoring -or $Remediation)) { $Assessment = $true } function Get-AppProtectionBaseline { <# .SYNOPSIS Geeft baseline-eisen terug voor APP. #> [CmdletBinding()] param() return [PSCustomObject]@{ RequiredPlatforms = @('Android', 'iOS', 'Windows', 'macOS') MaxPolicyAgeDays = 90 MinAssignmentCount = 1 RequireEncryption = $true RequireConditionalLaunch = $true } } function Connect-GraphIfNeeded { [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "LocalDebug actief: Graph-verbinding wordt overgeslagen." return } if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication)) { throw "Module Microsoft.Graph.Authentication is niet geïnstalleerd. Installeer deze module of gebruik -LocalDebug." } Import-Module Microsoft.Graph.Authentication -ErrorAction Stop $context = Get-MgContext if (-not $context -or (@($GraphScopes | Where-Object { $context.Scopes -notcontains $_ })).Count -gt 0) { Write-Verbose "Verbinding maken met Microsoft Graph..." Connect-MgGraph -Scopes $GraphScopes | Out-Null } } function Get-AppProtectionStatus { <# .SYNOPSIS Haalt APP-statistieken uit Graph of gebruikt debugdata. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "Voorbeelddata wordt geladen voor LocalDebug." return @( [PSCustomObject]@{ Platform = 'Android' DisplayName = 'NL - Android Highly Confidential' LastModified = (Get-Date).AddDays(-14) Assignments = 2 EncryptionEnabled = $true ConditionalLaunch = $true DataTransferProtected = $true DeviceCheckins = 1854 Issues = @() }, [PSCustomObject]@{ Platform = 'iOS' DisplayName = 'NL - iOS Shared Devices' LastModified = (Get-Date).AddDays(-122) Assignments = 0 EncryptionEnabled = $true ConditionalLaunch = $false DataTransferProtected = $true DeviceCheckins = 642 Issues = @("Geen assignments geconfigureerd", "Conditional launch ontbreekt") }, [PSCustomObject]@{ Platform = 'Windows' DisplayName = 'NL - Windows WIP Baseline' LastModified = (Get-Date).AddDays(-8) Assignments = 5 EncryptionEnabled = $true ConditionalLaunch = $true DataTransferProtected = $false DeviceCheckins = 921 Issues = @("Geen blokkade op naar persoonlijke opslag") } ) } Connect-GraphIfNeeded $endpoints = @( @{ Uri = 'deviceAppManagement/androidManagedAppProtections'; Platform = 'Android' }, @{ Uri = 'deviceAppManagement/iosManagedAppProtections'; Platform = 'iOS' }, @{ Uri = 'deviceAppManagement/windowsManagedAppProtections'; Platform = 'Windows' }, @{ Uri = 'deviceAppManagement/targetedManagedAppConfigurations'; Platform = 'macOS' } ) $results = @() foreach ($endpoint in $endpoints) { try { $uri = "https://graph.microsoft.com/beta/$($endpoint.Uri)?`$expand=assignments" Write-Verbose "Ophalen van $uri" $response = Invoke-MgGraphRequest -Uri $uri -Method GET if (-not $response.value) { continue } foreach ($policy in $response.value) { $assignments = if ($policy.assignments) { $policy.assignments.Count } else { 0 } $encryptionEnabled = $false if ($policy.appDataEncryptionType) { $encryptionEnabled = $policy.appDataEncryptionType -ne 'notConfigured' } elseif ($policy.encryptAppData -ne $null) { $encryptionEnabled = [bool]$policy.encryptAppData } $conditionalLaunch = $false if ($policy.conditionalLaunchRules -and $policy.conditionalLaunchRules.Count -gt 0) { $conditionalLaunch = $true } $dataTransferProtected = $false if ($policy.allowedOutboundClipboardSharingLevel) { $dataTransferProtected = $policy.allowedOutboundClipboardSharingLevel -ne 'allApps' } elseif ($policy.allowedOutboundDataTransferDestinations) { $dataTransferProtected = $policy.allowedOutboundDataTransferDestinations -ne 'allApps' } $deviceSummary = 0 if ($policy.deviceComplianceScriptDeviceStateSummary.totalSucceeded -ge 0) { $deviceSummary = $policy.deviceComplianceScriptDeviceStateSummary.totalSucceeded } $results += [PSCustomObject]@{ Platform = $endpoint.Platform DisplayName = $policy.displayName LastModified = [datetime]$policy.lastModifiedDateTime Assignments = $assignments EncryptionEnabled = $encryptionEnabled ConditionalLaunch = $conditionalLaunch DataTransferProtected = $dataTransferProtected DeviceCheckins = $deviceSummary Issues = @() } } } catch { Write-Warning "Kon policies voor $($endpoint.Platform) niet ophalen: $_" } } return $results } function Invoke-EndpointAppProtectionAssessment { <# .SYNOPSIS Voert een compliancecheck uit op APP-configuraties. #> [CmdletBinding()] param() $baseline = Get-AppProtectionBaseline $policies = Get-AppProtectionStatus $summary = [PSCustomObject]@{ ScriptName = $ScriptName CheckedAt = Get-Date TotalPolicies = $policies.Count PlatformsMissing = @() PoliciesOutdated = @() PoliciesWithoutAssignments = @() EncryptionGaps = @() ConditionalLaunchGaps = @() DataTransferGaps = @() IsCompliant = $true } foreach ($platform in $baseline.RequiredPlatforms) { if (-not ($policies | Where-Object { $_.Platform -eq $platform })) { $summary.PlatformsMissing += $platform } } foreach ($policy in $policies) { $age = (New-TimeSpan -Start $policy.LastModified -End (Get-Date)).Days if ($age -gt $baseline.MaxPolicyAgeDays) { $summary.PoliciesOutdated += "$($policy.DisplayName) ($age dagen oud)" } if ($policy.Assignments -lt $baseline.MinAssignmentCount) { $summary.PoliciesWithoutAssignments += "$($policy.DisplayName) ($($policy.Platform))" } if ($baseline.RequireEncryption -and -not $policy.EncryptionEnabled) { $summary.EncryptionGaps += "$($policy.DisplayName)" } if ($baseline.RequireConditionalLaunch -and -not $policy.ConditionalLaunch) { $summary.ConditionalLaunchGaps += "$($policy.DisplayName)" } if (-not $policy.DataTransferProtected) { $summary.DataTransferGaps += "$($policy.DisplayName)" } } if ($summary.PlatformsMissing.Count -gt 0 -or $summary.PoliciesOutdated.Count -gt 0 -or $summary.PoliciesWithoutAssignments.Count -gt 0 -or $summary.EncryptionGaps.Count -gt 0 -or $summary.ConditionalLaunchGaps.Count -gt 0 -or $summary.DataTransferGaps.Count -gt 0) { $summary.IsCompliant = $false } return $summary } function Invoke-EndpointAppProtectionOperations { <# .SYNOPSIS Genereert monitoringuitvoer en optionele bestanden. #> [CmdletBinding()] param( [Parameter(Mandatory)] [pscustomobject]$AssessmentResult ) $output = @{ Summary = $AssessmentResult Details = Get-AppProtectionStatus } if ($OutputPath) { $folder = Split-Path -Path $OutputPath -Parent if ($folder -and -not (Test-Path $folder)) { New-Item -ItemType Directory -Path $folder -Force | Out-Null } $output | ConvertTo-Json -Depth 6 | Out-File -FilePath $OutputPath -Encoding UTF8 Write-Host "Monitoringrapport opgeslagen: $OutputPath" -ForegroundColor Green } else { Write-Host "" Write-Host "Overzicht per platform" -ForegroundColor Cyan $output.Details | Sort-Object Platform | Format-Table Platform, DisplayName, Assignments, EncryptionEnabled, ConditionalLaunch, DataTransferProtected } } function Invoke-EndpointAppProtectionRemediation { <# .SYNOPSIS Genereert een remediatiepakket op basis van hiaten. #> [CmdletBinding()] param( [Parameter(Mandatory)] [pscustomobject]$AssessmentResult ) if ($WhatIf) { Write-Host "[WhatIf] Remediatiepakket zou worden aangemaakt op $OutputPath" -ForegroundColor Yellow return } $baseline = Get-AppProtectionBaseline $remediation = [PSCustomObject]@{ GeneratedAt = Get-Date Script = $ScriptName MissingPlatforms = $AssessmentResult.PlatformsMissing OutdatedPolicies = $AssessmentResult.PoliciesOutdated AssignmentIssues = $AssessmentResult.PoliciesWithoutAssignments EncryptionIssues = $AssessmentResult.EncryptionGaps ConditionalLaunchIssues = $AssessmentResult.ConditionalLaunchGaps DataTransferIssues = $AssessmentResult.DataTransferGaps RecommendedActions = @( "Maak of update APP-profielen voor ontbrekende platforms: $($AssessmentResult.PlatformsMissing -join ', ')", "Werk policies ouder dan $($baseline.MaxPolicyAgeDays) dagen bij en documenteer CAB-goedkeuring.", "Controleer assignments in Intune en koppel minimaal één dynamische Entra ID-groep.", "Schakel encryptie en conditional launch regels in conform baseline.", "Beperk clipboard- en datatransfers tot beheerde apps." ) } if (-not $OutputPath) { $OutputPath = Join-Path -Path $PSScriptRoot -ChildPath 'app-protection-remediation.json' } $folder = Split-Path -Path $OutputPath -Parent if ($folder -and -not (Test-Path $folder)) { New-Item -ItemType Directory -Path $folder -Force | Out-Null } $remediation | ConvertTo-Json -Depth 6 | Out-File -FilePath $OutputPath -Encoding UTF8 Write-Host "Remediatiepakket aangemaakt: $OutputPath" -ForegroundColor Green } try { Write-Host "" Write-Host "========================================" -ForegroundColor Cyan Write-Host "App Protection Policies Assessment" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan $assessmentResult = Invoke-EndpointAppProtectionAssessment if ($Assessment) { if ($assessmentResult.IsCompliant) { Write-Host "`n✅ Alle gecontroleerde policies voldoen aan de baseline." -ForegroundColor Green } else { Write-Host "`n❌ Er zijn afwijkingen gevonden ten opzichte van de baseline:" -ForegroundColor Red foreach ($property in 'PlatformsMissing','PoliciesOutdated','PoliciesWithoutAssignments','EncryptionGaps','ConditionalLaunchGaps','DataTransferGaps') { $values = $assessmentResult.$property if ($values -and $values.Count -gt 0) { Write-Host (" - {0}: {1}" -f $property, ($values -join '; ')) -ForegroundColor Yellow } } } } if ($Monitoring) { Invoke-EndpointAppProtectionOperations -AssessmentResult $assessmentResult } if ($Remediation) { Invoke-EndpointAppProtectionRemediation -AssessmentResult $assessmentResult } if (-not ($Assessment -or $Monitoring -or $Remediation)) { Write-Host "`nGebruik -Assessment, -Monitoring of -Remediation om een modus te kiezen." -ForegroundColor Yellow } } catch { Write-Error "Fout in ${ScriptName}: $_" exit 1 } finally { Write-Host "" Write-Host "========================================" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder APP ontbreekt elke controle over data die via mobiele apps wordt geopend. Een enkel gecompromitteerd toestel kan vertrouwelijke besluiten of persoonsgegevens lekken, waardoor AVG-boetes, NIS2-sancties en politieke schade vrijwel onvermijdelijk zijn.

Management Samenvatting

Veranker App Protection Policies als standaard voor alle endpoints, automatiseer configuraties via Microsoft Graph en gebruik het bijgeleverde script voor assessments, monitoring en remediatie zodat audits direct bewijs zien en gebruikers veilig blijven werken.