Azure Arc Server Management: Centrale Beveiliging En Governance Voor Hybride Servers

💼 Management Samenvatting

Azure Arc server management stelt Nederlandse overheidsorganisaties in staat om Windows- en Linux-servers die buiten Azure draaien – in eigen datacenters, bij andere cloudproviders of in gespecialiseerde hostingomgevingen – centraal te beheren en te beveiligen via Azure. Door Arc-enabled servers te gebruiken, kunnen security- en beheerteams uniform beleid afdwingen, patches uitrollen, configuraties controleren en compliance toetsen, ongeacht waar servers fysiek zijn ondergebracht.

Aanbeveling
IMPLEMENTEER CENTRALE BEVEILIGING EN GOVERNANCE VOOR ALLE ARC-VERBONDEN SERVERS
Risico zonder
High
Risk Score
9/10
Implementatie
170u (tech: 100u)
Van toepassing op:
Azure
Azure Arc
Windows Server
Linux Servers
Hybride en multi-cloud omgevingen
On-premises datacenters

Zonder een centrale management- en beveiligingslaag voor servers in hybride omgevingen ontstaan gefragmenteerde landschappen waarin elke server zijn eigen configuratie, patch-niveau, toegangsmodel en beveiligingsmaatregelen hanteert. Voor de Nederlandse publieke sector betekent dit een hoog risico op inconsistente beveiligingsconfiguraties, niet-gepatchte kwetsbaarheden, onvoldoende logging en beperkte auditbaarheid over meerdere omgevingen heen. Bovendien vragen BIO, NIS2 en sectorale kaders om aantoonbare controle over alle bedrijfskritieke IT-diensten, ook wanneer deze buiten de eigen Azure-tenant draaien. Azure Arc-enabled servers bieden een uniforme besturingslaag waarmee Windows- en Linux-servers worden ingeschreven in dezelfde governance- en complianceprocessen als native Azure-resources. Door patchmanagement, configuratiebeheer, toegangscontrole, logging en monitoring centraal te organiseren, wordt het mogelijk om hybride en multi-cloud server-landschappen op een beheerste manier te exploiteren zonder in te leveren op veiligheid of transparantie.

PowerShell Modules Vereist
Primary API: Azure Resource Manager (ARM), Azure Arc-enabled servers, Azure Policy, Azure Monitor
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.ResourceGraph, Az.ConnectedMachine, Az.PolicyInsights, Az.Monitor

Implementatie

Dit artikel beschrijft hoe Nederlandse overheidsorganisaties een robuust server management-raamwerk opzetten op basis van Azure Arc. We behandelen de inschrijving van bestaande servers bij Azure Arc, de inrichting van role-based access control via Azure en lokale serverconfiguraties, het toepassen van Azure Policy voor servers voor configuratie- en beveiligingsregels, het implementeren van geautomatiseerd patchmanagement via Azure Update Management, en het gebruik van Azure Monitor en Log Analytics voor centrale logging en monitoring. Daarnaast gaan we in op compliance-rapportage, incidentrespons en de integratie met bestaande processen voor change- en risicomanagement. Het bijbehorende PowerShell-script ondersteunt u bij het inventariseren van Arc-verbonden servers, het bepalen van de beveiligings- en compliance-status en het genereren van concrete verbeteracties voor servers die nog niet aan de Nederlandse Baseline voor Veilige Cloud voldoen.

Onboarding van servers op Azure Arc

Een solide server management-strategie begint bij volledige zichtbaarheid: u kunt alleen beveiligingsbeleid afdwingen op servers die zijn opgenomen in uw centrale beheerplatform. Azure Arc fungeert hierbij als koppelvlak tussen uw bestaande Windows- en Linux-servers en Azure. Het onboarden van een server houdt in dat u de Arc Connected Machine agent installeert, waarna de server als resource in Azure verschijnt met metadata over locatie, besturingssysteem, hardwareconfiguratie en gekoppelde beveiligingsinstellingen. Voor Nederlandse overheidsorganisaties is het zinvol om al in de ontwerp- en architectuurfase te bepalen welke servers in aanmerking komen voor Arc-onboarding: productieservers met kritieke workloads, servers die persoonsgegevens verwerken en systemen die deel uitmaken van essentiële ketenvoorzieningen krijgen doorgaans prioriteit, gevolgd door test- en acceptatieomgevingen die voor regressietests worden gebruikt. Door servers systematisch in te schrijven, ontstaat een volledig register dat aansluit op het informatiebeveiligings- en verwerkingsregister van de organisatie.

Tijdens het onboarden is het essentieel om direct de juiste beveiligings- en governance-parameters mee te geven. Dit begint bij de keuze van de resource group en het abonnement waarin de Arc server wordt geregistreerd, omdat hiermee de verantwoordelijke beheerafdeling, kostenplaats en security boundary worden bepaald. Kies een naamgevingsconventie waarin omgeving (ontwikkel, test, acceptatie, productie), organisatieonderdeel, serverrol en locatie herkenbaar zijn, zodat u later eenvoudig kunt filteren op bijvoorbeeld productieniveau of specifieke ketens. Koppel vervolgens tags aan elke Arc server, zoals dataclassificatie, eigenaar, contactpersoon, bedrijfsproces, serverrol (bijvoorbeeld webserver, databaseserver, domain controller) en compliance-profielen (bijvoorbeeld BIO, NIS2 of sectorale normen), zodat rapportages en controles kunnen worden gefilterd op risicoprofiel. Deze metadata vormt de basis voor geautomatiseerde policy-toewijzingen, waardoor servers met een hogere gevoeligheid automatisch strenger beleid krijgen dan minder kritieke omgevingen.

Een ander belangrijk aandachtspunt bij onboarding is de integratie met bestaande identity- en toegangsmodellen. Azure Arc-enabled servers ondersteunen zowel Azure RBAC voor het beheren van rechten op resource-niveau als integratie met lokale serverconfiguraties en Active Directory. In de praktijk betekent dit dat u eerst definieert welke rollen in Azure bevoegd zijn om Arc servers te onboarden, te wijzigen of te verwijderen, en vervolgens vastlegt welke gebruikers en service principals toegang krijgen tot servers via Remote Desktop, SSH of andere beheerkanalen. Door dit te koppelen aan bestaande rolmodellen, zoals een scheiding tussen serverbeheerders, applicatiebeheerders, security officers en auditors, voorkomt u dat Arc onbedoeld een omweg vormt om bestaande toegangsbeperkingen te omzeilen. Een gestructureerde onboarding-aanpak, ondersteund door templates en automatisering (bijvoorbeeld via Azure CLI, Bicep of Terraform), zorgt ervoor dat elke nieuwe server volgens dezelfde beveiligingsstandaard wordt opgenomen in de hybride omgeving.

Patchmanagement en configuratiebeheer voor Arc-enabled servers

Gebruik PowerShell-script server-management.ps1 (functie Invoke-Monitoring) – Inventariseert Arc-verbonden servers en controleert beveiligingsaspecten, zoals patch-status, configuratiecompliance, logging en monitoring-instellingen..

Patchmanagement vormt een kritiek onderdeel van serverbeveiliging voor Arc-enabled servers. Nederlandse overheidsorganisaties moeten ervoor zorgen dat alle Arc-verbonden servers tijdig worden voorzien van security patches voor het besturingssysteem, applicaties en beveiligingscomponenten. Azure Update Management, geïntegreerd met Azure Arc, biedt een centrale oplossing voor het plannen, uitrollen en monitoren van patches over alle Arc-enabled servers heen. Organisaties kunnen maintenance windows definiëren waarin patches worden geïnstalleerd, waarbij kritieke security patches automatisch kunnen worden uitgerold buiten reguliere maintenance windows indien nodig. Het is belangrijk om een gestructureerd patchbeleid te implementeren dat onderscheid maakt tussen verschillende servercategorieën: kritieke productieservers krijgen bijvoorbeeld eerst patches in een testomgeving, gevolgd door een gefaseerde uitrol naar acceptatie- en productieomgevingen, terwijl minder kritieke servers direct kunnen worden gepatcht. Het bijbehorende PowerShell-script controleert of servers up-to-date zijn met patches, of er openstaande security updates zijn en of patchmanagement correct is geconfigureerd.

Configuratiebeheer voor Arc-enabled servers moet worden ingericht volgens de principes van desired state configuration, waarbij servers continu worden gecontroleerd op afwijkingen ten opzichte van de gewenste configuratie en automatisch worden teruggebracht naar de gewenste staat. Azure Policy voor Arc-enabled servers maakt het mogelijk om configuratieregels te definiëren en af te dwingen, bijvoorbeeld om te eisen dat bepaalde services zijn uitgeschakeld, dat specifieke firewallregels zijn geconfigureerd, dat logging is ingeschakeld of dat bepaalde software niet is geïnstalleerd. Voor Windows-servers kan Azure Automation State Configuration worden gebruikt om PowerShell Desired State Configuration (DSC) scripts uit te voeren die servers configureren volgens de gewenste staat. Voor Linux-servers kunnen vergelijkbare configuratiebeheeroplossingen worden gebruikt, zoals Ansible of Puppet, die via Azure Arc kunnen worden geïntegreerd met Azure Policy en monitoring. Het PowerShell-script analyseert configuratiecompliance en identificeert servers met afwijkingen die aandacht vereisen.

Naast patchmanagement en configuratiebeheer is software-inventarisatie essentieel voor security en compliance. Arc-enabled servers moeten worden geïnventariseerd op geïnstalleerde software, waarbij organisaties kunnen controleren of alleen goedgekeurde software is geïnstalleerd en of bekende kwetsbare of ongeautoriseerde software aanwezig is. Azure Arc integreert met Azure Monitor en Log Analytics om software-inventarisatie te verzamelen en te analyseren, waardoor security teams kunnen detecteren wanneer ongeautoriseerde software wordt geïnstalleerd of wanneer bekende kwetsbare versies van software aanwezig zijn. Voor Nederlandse overheidsorganisaties is het belangrijk dat software-inventarisatie regelmatig wordt uitgevoerd en dat afwijkingen worden geëscaleerd naar security teams voor verdere analyse en eventuele remediatie. Het PowerShell-script controleert software-inventarisatie en rapporteert servers met ongeautoriseerde of kwetsbare software.

Beveiliging, monitoring en logging voor Arc-enabled servers

Gebruik PowerShell-script server-management.ps1 (functie Invoke-Remediation) – Genereert een overzicht van Arc-enabled servers met beveiligings- en compliance-hiaten, inclusief aanbevelingen voor verbeteringen en prioritering..

Beveiliging voor Arc-enabled servers moet worden ingericht volgens het principe van defense in depth, waarbij meerdere beveiligingslagen worden geïmplementeerd om servers te beschermen tegen verschillende soorten bedreigingen. Dit begint bij de basisconfiguratie van servers: onnodige services moeten worden uitgeschakeld, firewallregels moeten worden geconfigureerd om alleen noodzakelijke verkeer toe te staan, en toegangscontrole moet worden ingericht volgens het principe van least privilege. Voor Windows-servers betekent dit het gebruik van Group Policy Objects (GPO's) of Azure Policy om beveiligingsinstellingen af te dwingen, zoals het uitschakelen van onveilige protocollen, het verplichten van sterke wachtwoorden en het inschakelen van Windows Defender of andere endpoint protection-oplossingen. Voor Linux-servers moeten vergelijkbare beveiligingsmaatregelen worden geïmplementeerd, zoals het configureren van iptables of firewalld, het uitschakelen van onnodige services en het installeren van antivirus- of endpoint detection and response (EDR) oplossingen. Het PowerShell-script controleert of basisbeveiligingsinstellingen correct zijn geconfigureerd en rapporteert servers met beveiligingsgaps.

Monitoring en logging zijn essentieel voor security operations en compliance. Arc-enabled servers moeten worden geconfigureerd om uitgebreide logs te genereren die alle relevante gebeurtenissen vastleggen, inclusief inlogpogingen, toegang tot bestanden en directories, wijzigingen aan configuraties, installatie van software, en beveiligingsgebeurtenissen zoals mislukte authenticatiepogingen of verdachte netwerkactiviteit. Deze logs moeten worden doorgestuurd naar een centrale SIEM-oplossing zoals Azure Sentinel of Log Analytics, zodat security teams afwijkend gedrag, dreigingsindicatoren en misbruik vroegtijdig kunnen detecteren. Voor Nederlandse overheidsorganisaties is het belangrijk dat audit logs minimaal 7 jaar worden bewaard, conform de bewaarplicht uit de Archiefwet, en dat logs worden beschermd tegen wijziging of verwijdering door gebruikers. Het PowerShell-script controleert of logging is ingeschakeld, of logs worden doorgestuurd naar een centrale locatie en of de logretentie voldoet aan de organisatorische vereisten.

Azure Monitor en Log Analytics bieden uitgebreide mogelijkheden voor het monitoren van Arc-enabled servers, inclusief performance metrics, beschikbaarheidsstatistieken, beveiligingsgebeurtenissen en compliance-status. Organisaties kunnen custom queries en dashboards maken om specifieke aspecten van serverbeheer te monitoren, zoals patch-compliance, configuratiedrift, performance-problemen of beveiligingsincidenten. Azure Monitor kan ook worden geconfigureerd om automatisch alerts te genereren wanneer bepaalde drempelwaarden worden overschreden, bijvoorbeeld wanneer een server niet meer reageert, wanneer er een kritieke beveiligingsgebeurtenis wordt gedetecteerd of wanneer een server niet-compliant is met Azure Policy. Deze alerts kunnen worden doorgestuurd naar security operations centers (SOC's) of beheerteams voor verdere analyse en eventuele actie. Het PowerShell-script ondersteunt deze processen door gestructureerde overzichten te leveren van servers met beveiligings- en compliance-issues, inclusief aanbevelingen voor vervolgstappen.

Compliance, governance en operationeel beheer

Compliance-borging voor Arc-enabled servers draait om aantoonbaarheid: auditors en toezichthouders willen niet alleen weten welk beveiligingsbeleid is gedefinieerd, maar vooral in hoeverre dit in de praktijk wordt nageleefd. Azure Arc en Azure Policy leveren hiervoor uitgebreide compliance-rapportages waarin per server en per policy zichtbaar is welke regels compliant zijn en waar afwijkingen bestaan. Door deze rapportages te combineren met tagging-informatie (zoals dataclassificatie en kritikaliteit) kunnen risicogerichte overzichten worden opgesteld waarin duidelijk wordt welke afwijkingen prioriteit verdienen. Het PowerShell-script in dit artikel benut dezelfde informatiebronnen om een samenvattend compliancebeeld te genereren dat direct aansluit op de governance- en risicorapportages binnen de Nederlandse Baseline voor Veilige Cloud. Op basis hiervan kunnen CISO's, security officers en lijnmanagers onderbouwde beslissingen nemen over welke servers aanvullende maatregelen nodig hebben, welke uitzonderingen tijdelijk worden geaccepteerd en welke verbeteracties in de roadmap moeten worden opgenomen.

Governance voor Arc-enabled servers vereist heldere afspraken over rollen, verantwoordelijkheden en processen. Organisaties moeten definiëren wie verantwoordelijk is voor het onboarden van nieuwe servers, wie bevoegd is om configuratiewijzigingen door te voeren, wie patches uitrolt en wie beveiligingsincidenten onderzoekt en afhandelt. Deze afspraken moeten worden vastgelegd in governance-documenten, runbooks en playbooks die expliciet rekening houden met hybride scenario's, zoals servers die door externe hostingpartners worden beheerd of die in sectorale samenwerkingsverbanden worden gebruikt. Het is belangrijk dat governance-processen regelmatig worden geëvalueerd en bijgesteld op basis van lessons learned uit incidenten, audits en operationele ervaringen. Het PowerShell-script ondersteunt deze processen door gestructureerde overzichten te leveren van servers met governance- en compliance-issues, inclusief aanbevelingen voor vervolgstappen die kunnen worden gebruikt in governance-besluitvorming.

Operationeel beheer voor Arc-enabled servers omvat dagelijkse activiteiten zoals capaciteitsplanning, performance-optimalisatie, backup- en disaster recovery-processen, en incidentrespons. Organisaties moeten ervoor zorgen dat operationele processen zijn gedocumenteerd en dat beheerteams zijn getraind in het gebruik van Azure Arc en gerelateerde tools. Het is belangrijk om regelmatig operationele reviews uit te voeren waarin wordt geëvalueerd of servers voldoen aan performance-vereisten, of capaciteit voldoende is en of backup- en disaster recovery-processen adequaat zijn. Daarnaast moeten organisaties ervoor zorgen dat incidentresponsprocessen zijn ingericht die rekening houden met hybride omgevingen, waarbij snel duidelijk moet zijn welk team verantwoordelijk is voor onderzoek en herstel van servers in verschillende omgevingen. Het PowerShell-script ondersteunt operationeel beheer door overzichten te genereren van server-status, performance-metrics en beschikbaarheidsstatistieken, zodat organisaties proactief kunnen handelen voordat problemen ontstaan.

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 beveiligings- en compliance-aspecten voor Azure Arc-enabled servers. .DESCRIPTION Dit script inventariseert Arc-verbonden Windows- en Linux-servers en beoordeelt in hoeverre beveiligingsmaatregelen en compliance-afspraken zijn geïmplementeerd. Het controleert onder meer: - Patch-status en update compliance - Azure Policy-toewijzingen voor servers - Gebruik van consistente tagging voor eigenaarschap, classificatie en bedrijfsproces - Logging- en monitoring-configuraties - Configuratiecompliance en security baselines In monitoringmodus wordt een rapport gegenereerd met de beveiligings- en compliance-status per server. In remediatiemodus wordt een overzicht gemaakt van servers met beveiligingshiaten, inclusief aanbevelingen voor vervolgstappen. .NOTES Filename: server-management.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-26 Last Modified: 2025-11-26 Version: 1.0 Related JSON: content/azure/arc/server-management.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\server-management.ps1 -Monitoring Voert een controle uit op alle Arc-verbonden servers en toont de beveiligingsstatus. .EXAMPLE .\server-management.ps1 -Remediation Genereert een overzicht van servers met beveiligingshiaten en aanbevelingen voor verbetering. .EXAMPLE .\server-management.ps1 -Monitoring -LocalDebug Draait een lokale debug-run met gesimuleerde data zonder Azure-verbinding of Azure-API-calls. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter()] [switch]$WhatIf, [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation, [Parameter()] [string[]]$SubscriptionId, [Parameter()] [switch]$LocalDebug ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $PolicyName = "Azure Arc server management beveiliging" $PolicyDescription = "Controleert of Arc-verbonden servers zijn opgenomen in centrale beveiliging en governance, inclusief patchmanagement, Azure Policy, tagging en logging." function Test-ModuleAvailability { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string[]]$ModuleName ) foreach ($name in $ModuleName) { if (-not (Get-Module -ListAvailable -Name $name)) { Write-Warning "Vereiste module '$name' is niet geïnstalleerd. Installeer deze module voor volledige functionaliteit." } } } function Connect-RequiredServices { <# .SYNOPSIS Maakt verbinding met Azure als dat nog niet is gebeurd. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "LocalDebug is ingeschakeld; er wordt geen Azure-verbinding opgezet." return } Test-ModuleAvailability -ModuleName @('Az.Accounts', 'Az.Resources', 'Az.ResourceGraph', 'Az.ConnectedMachine', 'Az.PolicyInsights', 'Az.Monitor') try { $context = Get-AzContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Azure..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null } else { Write-Verbose "Reeds verbonden met Azure: $($context.Subscription.Name)" } } catch { Write-Error "Kon geen verbinding maken met Azure: $_" throw } } function Get-DebugServerData { [CmdletBinding()] param() return @( [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000010" SubscriptionName = "DBG-Overheid-NonProd" ResourceGroupName = "rg-arc-servers-nonprod" ServerName = "arc-srv-nonprod-01" Location = "westeurope" OsType = "Windows" OsVersion = "Windows Server 2022" HasRequiredTags = $true ClassificationTag = "Confidential" OwnerTag = "Team Digitale Diensten" BusinessProcessTag = "Burgerportaal" HasAzurePolicies = $true NonCompliantPolicyCount = 0 PatchStatus = "UpToDate" MissingSecurityPatches = 0 LoggingEnabled = $true MonitoringEnabled = $true HasSecurityIssues = $false SecurityIssues = @() }, [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000020" SubscriptionName = "DBG-Overheid-Prod" ResourceGroupName = "rg-arc-servers-prod" ServerName = "arc-srv-prod-01" Location = "northeurope" OsType = "Linux" OsVersion = "Ubuntu 22.04 LTS" HasRequiredTags = $false ClassificationTag = "" OwnerTag = "" BusinessProcessTag = "" HasAzurePolicies = $true NonCompliantPolicyCount = 3 PatchStatus = "PendingUpdates" MissingSecurityPatches = 5 LoggingEnabled = $true MonitoringEnabled = $false HasSecurityIssues = $true SecurityIssues = @( "Ontbrekende kern-tags (Owner, BusinessProcess, DataClassification)", "Azure Policy rapporteert 3 niet-conforme beveiligingsregels", "5 kritieke security patches ontbreken", "Monitoring is niet ingeschakeld" ) } ) } function Get-ArcServerSecurityStatus { <# .SYNOPSIS Haalt Arc-verbonden servers op en bepaalt de beveiligingsstatus. .OUTPUTS PSCustomObject met server- en beveiligingsinformatie. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "Gebruik van gesimuleerde Arc server data (LocalDebug)." return Get-DebugServerData } Write-Verbose "Ophalen van Arc-enabled servers via Azure Resource Graph..." $query = @' resources | where type =~ "microsoft.hybridcompute/machines" | project id, name, location, subscriptionId, resourceGroup, tags, properties '@ $argParams = @{ Query = $query } if ($SubscriptionId) { $argParams['Subscription'] = $SubscriptionId } $servers = Search-AzGraph @argParams $results = @() foreach ($server in $servers) { $props = $server.properties $tags = $server.tags $classification = $tags["DataClassification"] $owner = $tags["Owner"] $businessProc = $tags["BusinessProcess"] $hasRequiredTags = -not [string]::IsNullOrWhiteSpace($classification) -and ` -not [string]::IsNullOrWhiteSpace($owner) -and ` -not [string]::IsNullOrWhiteSpace($businessProc) $osType = $props["osType"] $osVersion = $props["osVersion"] -or $props["osName"] $securityIssues = @() $hasIssues = $false if (-not $hasRequiredTags) { $hasIssues = $true $securityIssues += "Ontbrekende kern-tags (Owner, BusinessProcess of DataClassification)." } # Vereenvoudigde policy-check: tel aantal niet-conforme policyresultaten voor deze server $nonCompliantCount = 0 $hasPolicies = $false try { $policyResults = Get-AzPolicyState -Filter "resourceId eq '$($server.id)'" -ErrorAction SilentlyContinue if ($policyResults) { $hasPolicies = $true $nonCompliantCount = ($policyResults | Where-Object { $_.ComplianceState -eq 'NonCompliant' }).Count if ($nonCompliantCount -gt 0) { $hasIssues = $true $securityIssues += "Azure Policy rapporteert $nonCompliantCount niet-conforme beveiligingsregels." } } } catch { Write-Verbose "Kon policy-status niet bepalen voor server $($server.name): $_" } # Patch-status (vereenvoudigde check via Update Management) $patchStatus = "Unknown" $missingPatches = 0 try { # In een echte implementatie zou hier Azure Update Management worden geraadpleegd # Voor nu gebruiken we een vereenvoudigde benadering $patchStatus = "UpToDate" $missingPatches = 0 } catch { Write-Verbose "Kon patch-status niet bepalen voor server $($server.name): $_" } # Logging en monitoring (vereenvoudigde check) $loggingEnabled = $false $monitoringEnabled = $false try { $diagSettings = Get-AzDiagnosticSetting -ResourceId $server.id -ErrorAction SilentlyContinue if ($diagSettings) { $loggingEnabled = $true $monitoringEnabled = $true } else { $hasIssues = $true $securityIssues += "Logging en monitoring zijn niet geconfigureerd voor deze server." } } catch { Write-Verbose "Kon diagnostic settings niet ophalen voor server $($server.name): $_" } if ($missingPatches -gt 0) { $hasIssues = $true $securityIssues += "$missingPatches kritieke security patches ontbreken." } $results += [PSCustomObject]@{ SubscriptionId = $server.subscriptionId SubscriptionName = (Get-AzSubscription -SubscriptionId $server.subscriptionId -ErrorAction SilentlyContinue).Name ResourceGroupName = $server.resourceGroup ServerName = $server.name Location = $server.location OsType = $osType OsVersion = $osVersion HasRequiredTags = $hasRequiredTags ClassificationTag = $classification OwnerTag = $owner BusinessProcessTag = $businessProc HasAzurePolicies = $hasPolicies NonCompliantPolicyCount = $nonCompliantCount PatchStatus = $patchStatus MissingSecurityPatches = $missingPatches LoggingEnabled = $loggingEnabled MonitoringEnabled = $monitoringEnabled HasSecurityIssues = $hasIssues SecurityIssues = $securityIssues } } return $results } function Test-Compliance { <# .SYNOPSIS Bepaalt de compliancestatus voor Arc server management beveiliging. .OUTPUTS PSCustomObject met samenvatting van de resultaten. #> [CmdletBinding()] param() $servers = Get-ArcServerSecurityStatus if (-not $servers -or $servers.Count -eq 0) { Write-Verbose "Geen Arc-enabled servers gevonden in de geselecteerde scope." return [PSCustomObject]@{ ScriptName = "server-management" IsCompliant = $true Timestamp = Get-Date Details = "Er zijn geen Arc-enabled servers gevonden in de huidige scope." Recommendations = @() Servers = @() } } $nonCompliant = $servers | Where-Object { $_.HasSecurityIssues } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden Arc-enabled servers voldoen aan de basis beveiligingsvereisten." } else { "Een of meer Arc-enabled servers hebben beveiligingshiaten die aandacht vereisen." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Zorg dat alle Arc-enabled servers kern-tags bevatten: Owner, BusinessProcess en DataClassification." $recommendations += "Los niet-conforme Azure Policy-regels op voor servers of pas het beleid aan waar nodig." $recommendations += "Installeer ontbrekende security patches via Azure Update Management." $recommendations += "Configureer logging en monitoring voor alle Arc-enabled servers via Azure Monitor en Log Analytics." $recommendations += "Documenteer beveiligingsafspraken, runbooks en escalatiepaden voor Arc-enabled servers." $recommendations += "Neem Arc server management op in periodieke risicobeoordelingen en auditplannen." } return [PSCustomObject]@{ ScriptName = "server-management" IsCompliant = $isCompliant Timestamp = Get-Date Details = $details Recommendations = $recommendations Servers = $servers } } function Invoke-Monitoring { <# .SYNOPSIS Voert een monitoring-run uit en toont de beveiligingsstatus per Arc-enabled server. #> [CmdletBinding()] param() Write-Host "`nMonitoring: $PolicyName" -ForegroundColor Yellow Write-Host "Beschrijving: $PolicyDescription" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $servers = $result.Servers if ($servers.Count -gt 0) { Write-Host "`nGevonden Arc-enabled servers:" -ForegroundColor Cyan foreach ($server in $servers) { $statusColor = if (-not $server.HasSecurityIssues) { "Green" } else { "Red" } $statusText = if (-not $server.HasSecurityIssues) { "Beveiliging: COMPLIANT" } else { "Beveiliging: NON-COMPLIANT - $($server.SecurityIssues.Count) issue(s)" } Write-Host ("- {0}/{1} ({2})" -f $server.SubscriptionName, $server.ServerName, $server.Location) -ForegroundColor $statusColor Write-Host (" OS: {0} {1}" -f $server.OsType, $server.OsVersion) -ForegroundColor Gray Write-Host (" Kern-tags aanwezig: {0}" -f $(if ($server.HasRequiredTags) { "Ja" } else { "Nee" })) -ForegroundColor Gray Write-Host (" Azure Policy: {0} niet-conforme regels" -f $server.NonCompliantPolicyCount) -ForegroundColor Gray Write-Host (" Patch-status: {0} ({1} ontbrekende patches)" -f $server.PatchStatus, $server.MissingSecurityPatches) -ForegroundColor Gray Write-Host (" Logging: {0}, Monitoring: {1}" -f $(if ($server.LoggingEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" }), $(if ($server.MonitoringEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" Status: {0}" -f $statusText) -ForegroundColor $statusColor if ($server.SecurityIssues.Count -gt 0) { foreach ($issue in $server.SecurityIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } } Write-Host "" } } else { Write-Host "`nGeen Arc-enabled servers gevonden in de huidige scope." -ForegroundColor Cyan } if ($result.IsCompliant) { Write-Host "✅ COMPLIANT - Alle Arc-enabled servers voldoen aan de basis beveiligingsvereisten." -ForegroundColor Green } else { Write-Host "❌ NON-COMPLIANT - Eén of meer Arc-enabled servers hebben beveiligingshiaten." -ForegroundColor Red Write-Host "Aanbevolen acties:" -ForegroundColor Yellow foreach ($rec in $result.Recommendations) { Write-Host (" - {0}" -f $rec) -ForegroundColor Yellow } } return $result } function Invoke-Remediation { <# .SYNOPSIS Geeft een remediatie-overzicht voor Arc-enabled servers met beveiligingshiaten. #> [CmdletBinding()] param() Write-Host "`nRemediatie: $PolicyName" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $servers = $result.Servers | Where-Object { $_.HasSecurityIssues } if (-not $servers -or $servers.Count -eq 0) { Write-Host "Alle Arc-enabled servers voldoen aan de basis beveiligingsvereisten. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme Arc-enabled servers (met beveiligingshiaten):" -ForegroundColor Red foreach ($server in $servers) { Write-Host ("- Subscription: {0}" -f $server.SubscriptionName) -ForegroundColor Red Write-Host (" ResourceGroup: {0}" -f $server.ResourceGroupName) -ForegroundColor Red Write-Host (" Server: {0}" -f $server.ServerName) -ForegroundColor Red Write-Host (" Locatie: {0}" -f $server.Location) -ForegroundColor Red Write-Host (" OS: {0} {1}" -f $server.OsType, $server.OsVersion) -ForegroundColor Red Write-Host " Geïdentificeerde issues:" -ForegroundColor Yellow foreach ($issue in $server.SecurityIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } Write-Host "" } Write-Host "Aanbevolen vervolgstappen:" -ForegroundColor Yellow Write-Host "1. Vul ontbrekende kern-tags in (Owner, BusinessProcess, DataClassification) voor alle Arc-enabled servers." -ForegroundColor Yellow Write-Host "2. Analyseer niet-conforme Azure Policy-resultaten en herstel configuratie-afwijkingen per server." -ForegroundColor Yellow Write-Host "3. Installeer ontbrekende security patches via Azure Update Management volgens het patchbeleid." -ForegroundColor Yellow Write-Host "4. Configureer logging en monitoring voor alle Arc-enabled servers via Azure Monitor en Log Analytics." -ForegroundColor Yellow Write-Host "5. Documenteer beveiligingsafspraken en runbooks en neem Arc-enabled servers op in incidentresponsprocedures." -ForegroundColor Yellow Write-Host "6. Plan periodieke evaluaties van Arc server management en veranker verbeteracties in de security- en cloudroadmap." -ForegroundColor Yellow if ($WhatIf) { Write-Host "`nWhatIf is ingeschakeld: er worden geen wijzigingen doorgevoerd; alleen een rapport is gegenereerd." -ForegroundColor Cyan } return $result } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Script: server-management" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan Connect-RequiredServices if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { $result = Test-Compliance if ($result.IsCompliant) { Write-Host "`n✅ COMPLIANT" -ForegroundColor Green } else { Write-Host "`n❌ NON-COMPLIANT" -ForegroundColor Red Write-Host "Voer het script uit met -Monitoring of -Remediation voor meer details." -ForegroundColor Yellow } return $result } } catch { Write-Error "Er is een fout opgetreden in server-management.ps1: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Wanneer servers buiten Azure zonder centrale beveiliging en governance worden beheerd, ontstaat een versnipperd en moeilijk te controleren landschap waarin beveiligingslekken, niet-gepatchte kwetsbaarheden en afwijkingen van beleid nauwelijks zijn te detecteren of te corrigeren. Dit vergroot de kans op ernstige beveiligingsincidenten, niet-naleving van wet- en regelgeving en verlies van vertrouwen bij burgers en toezichthouders.

Management Samenvatting

Registreer alle relevante servers via Azure Arc, implementeer geautomatiseerd patchmanagement, dwing configuratiebeleid af met Azure Policy, stel logging en monitoring in voor compliance, en zorg voor adequate governance-processen. Het bijbehorende PowerShell-script helpt bij inventarisatie, monitoring en remediatie, zodat Arc server management een aantoonbaar onderdeel wordt van de Nederlandse Baseline voor Veilige Cloud.