Post-Migration Hardening In Azure

💼 Management Samenvatting

Na het migreren van workloads naar Azure zijn de meeste organisaties primair gericht op het tot stand brengen van functionaliteit en het waarborgen van beschikbaarheid. Dit betekent echter vaak dat beveiligingsaspecten zoals least privilege, logging, monitoring en security baselines pas achteraf worden geïmplementeerd of zelfs worden overgeslagen. Post-migration hardening is een gestructureerd proces waarbij na een succesvolle migratie alle beveiligingsmaatregelen systematisch worden geïmplementeerd, geconfigureerd en gevalideerd om te waarborgen dat gemigreerde workloads voldoen aan dezelfde beveiligingsstandaarden als on-premises systemen en aan de eisen vanuit BIO, NIS2 en andere compliance frameworks.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
140u (tech: 80u)
Van toepassing op:
Azure abonnementen
Gemigreerde workloads
Hybride omgevingen
Kritieke infrastructuren
Overheidsorganisaties

Zonder post-migration hardening blijven gemigreerde workloads kwetsbaar voor aanvallen omdat veel standaard Azure-configuraties niet optimaal zijn voor productie-omgevingen en omdat migratietools, tijdelijke accounts en brede toegangsrechten vaak na de migratie actief blijven. Bovendien ontbreken vaak essentiële beveiligingscontroles zoals geavanceerde logging, netwerksegmentatie, encryptie op rest en in transit, en geautomatiseerde threat detection. Voor Nederlandse overheidsorganisaties is dit onacceptabel omdat dit kan leiden tot datalekken, compliance-schendingen en reputatieschade. Post-migration hardening voorkomt deze risico's door ervoor te zorgen dat alle beveiligingsmaatregelen correct zijn geïmplementeerd voordat workloads volledig in productie worden genomen.

PowerShell Modules Vereist
Primary API: Azure API
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.Security, Az.KeyVault, Az.Network, Az.Storage, Az.Monitor

Implementatie

Dit artikel beschrijft een gestructureerde aanpak voor post-migration hardening in Azure, specifiek gericht op Nederlandse overheidsorganisaties. Het raamwerk bestaat uit acht fundamentele pijlers: identiteits- en toegangsbeheer, netwerkbeveiliging, data-encryptie en key management, logging en monitoring, security baselines en compliance, vulnerability management, backup en disaster recovery, en verwijdering van migratie-artefacten. De eerste pijler betreft identiteits- en toegangsbeheer waarbij tijdelijke accounts worden verwijderd, least privilege wordt geïmplementeerd, multi-factor authenticatie wordt afgedwongen en Role-Based Access Control (RBAC) wordt geoptimaliseerd. De tweede pijler richt zich op netwerkbeveiliging met Network Security Groups, Azure Firewall, Private Endpoints en netwerksegmentatie. De derde pijler adresseert data-encryptie met Azure Key Vault, customer-managed keys en encryption-at-rest configuraties. De vierde pijler betreft logging en monitoring met Azure Monitor, Log Analytics, Azure Sentinel en security alerting. De vijfde pijler richt zich op security baselines en compliance met Azure Policy, Microsoft Defender for Cloud en compliance dashboards. De zesde pijler betreft vulnerability management met regelmatige scans, patchmanagement en security updates. De zevende pijler richt zich op backup en disaster recovery met Azure Backup, geo-redundantie en recovery testing. De achtste pijler betreft verwijdering van migratie-artefacten zoals tijdelijke storage accounts, test-resources en migratie-scripts. Het artikel beschrijft voor elke pijler concrete implementatiestappen, best practices, Azure-native services die kunnen worden ingezet, en hoe de pijlers onderling samenwerken om een robuuste post-migration security posture te creëren.

Vereisten

Een succesvolle post-migration hardening vereist een grondige voorbereiding op zowel technisch als organisatorisch vlak. De eerste vereiste is een volledige inventarisatie van alle gemigreerde resources, workloads, applicaties en services, inclusief hun beveiligingsconfiguraties, toegangsrechten, netwerkconnectiviteit en data-opslag. Zonder een compleet overzicht is het onmogelijk om te bepalen welke hardening-maatregelen nodig zijn en welke prioritering moet worden toegepast. Deze inventarisatie moet niet alleen technische details bevatten – zoals welke Azure-services worden gebruikt, welke RBAC-rollen zijn toegewezen, welke netwerkregels zijn geconfigureerd, en welke data wordt opgeslagen – maar ook functionele context: welke workloads zijn kritiek voor de dienstverlening, welke compliance-vereisten gelden per workload, en wat zijn de business impact-scenario's bij een beveiligingsincident.

Een tweede cruciale vereiste is het hebben van een duidelijk post-migration hardening beleid en proces dat specifiek is uitgewerkt voor Azure-omgevingen en dat aansluit bij de algemene beveiligingsstrategie van de organisatie. Dit beleid moet definiëren welke hardening-maatregelen worden toegepast, in welke volgorde, wie verantwoordelijk is voor implementatie en validatie, welke acceptatiecriteria gelden, en hoe hardening wordt gedocumenteerd en gemonitord. Binnen Nederlandse overheidsorganisaties moet dit beleid expliciet aansluiten bij het BIO-raamwerk, NIS2-verplichtingen en AVG-vereisten. Het beleid moet schriftelijk zijn vastgelegd, door het bestuur zijn goedgekeurd en regelmatig worden herzien op basis van nieuwe bedreigingen en best practices.

Technisch gezien vereist post-migration hardening de beschikbaarheid van de juiste Azure-licenties en services. Voor identiteits- en toegangsbeheer zijn Azure Active Directory Premium, Azure RBAC en Azure AD Privileged Identity Management nodig. Voor netwerkbeveiliging zijn Azure Firewall, Network Security Groups en Private Endpoints nodig. Voor data-encryptie zijn Azure Key Vault en Azure Storage encryption nodig. Voor logging en monitoring zijn Azure Monitor, Log Analytics, Azure Sentinel en Microsoft Defender for Cloud nodig. Voor security baselines zijn Azure Policy en Microsoft Defender for Cloud nodig. Voor vulnerability management zijn Microsoft Defender for Cloud en Azure Update Management nodig. Voor backup en disaster recovery zijn Azure Backup en geo-redundantie nodig. Organisaties moeten ervoor zorgen dat zij over de benodigde licenties beschikken voordat zij beginnen met post-migration hardening.

Daarnaast is er een duidelijke rol- en verantwoordelijkheidsverdeling nodig tussen verschillende teams en functies. De CISO of security officer is verantwoordelijk voor het opstellen van het post-migration hardening beleid en het toezicht op de implementatie, maar individuele teams blijven verantwoordelijk voor de concrete implementatie van hardening-maatregelen binnen hun eigen workloads. Security engineers zijn verantwoordelijk voor de technische implementatie van hardening-maatregelen zoals RBAC, netwerksegmentatie en encryptie. Security analysts zijn verantwoordelijk voor het configureren van logging, monitoring en security alerting. Compliance officers zijn verantwoordelijk voor het valideren dat hardening-maatregelen voldoen aan compliance-vereisten. Zonder deze duidelijke verdeling ontstaat verwarring over wie verantwoordelijk is voor welke aspecten, wat kan leiden tot gaten in de hardening of overlappende inspanningen.

Tot slot vereist post-migration hardening een volwassen proces voor validatie en acceptatie. Hardening-maatregelen moeten worden gevalideerd om te verifiëren dat zij correct zijn geïmplementeerd en dat zij geen negatieve impact hebben op functionaliteit of performance. Dit vereist testprocedures, acceptatiecriteria en goedkeuringsprocessen voordat workloads volledig in productie worden genomen. Daarnaast moeten er processen zijn voor continue monitoring en onderhoud van hardening-maatregelen, omdat beveiligingsconfiguraties kunnen veranderen door wijzigingen aan workloads of door automatische updates van Azure-services.

Implementatie

Gebruik PowerShell-script post-migration-hardening.ps1 (functie Invoke-Implementation) – Valideert en implementeert post-migration hardening controles.

De implementatie van post-migration hardening in Azure begint met het opstellen van een gedetailleerd implementatieplan dat alle acht beveiligingspijlers omvat en prioriteert op basis van risico en kritiekheid van workloads. Het plan moet per pijler beschrijven welke Azure-services worden ingezet, welke configuraties worden toegepast, welke resources worden beschermd en in welke volgorde de implementatie plaatsvindt. In de praktijk wordt vaak begonnen met de fundamenten – identiteits- en toegangsbeheer en netwerkbeveiliging – omdat deze pijlers de basis vormen voor alle andere beveiligingscontroles. Vervolgens worden data-encryptie en logging geïmplementeerd, gevolgd door security baselines, vulnerability management, backup en disaster recovery, en tot slot verwijdering van migratie-artefacten.

De eerste pijler – identiteits- en toegangsbeheer – wordt geïmplementeerd door alle tijdelijke accounts en service principals te identificeren en te verwijderen die tijdens de migratie zijn aangemaakt maar niet meer nodig zijn. Vervolgens wordt least privilege geïmplementeerd door RBAC-rollen te reviewen en te optimaliseren, zodat gebruikers en service principals alleen de minimale rechten hebben die nodig zijn voor hun functie. Multi-factor authenticatie wordt afgedwongen voor alle gebruikersaccounts, inclusief service accounts waar mogelijk. Azure AD Privileged Identity Management wordt geconfigureerd voor just-in-time toegang tot beheerrollen. Service principals en managed identities worden gebruikt in plaats van gebruikersaccounts voor automatiserings- en applicatietoegang. Deze pijler vormt de eerste verdedigingslinie tegen ongeautoriseerde toegang en is essentieel omdat zonder adequate toegangscontrole andere beveiligingsmaatregelen kunnen worden omzeild.

De tweede pijler – netwerkbeveiliging – wordt geïmplementeerd door Network Security Groups te configureren met minimale toegangsregels die alleen verkeer toestaan dat expliciet is toegestaan voor de werking van workloads. Azure Firewall wordt geïmplementeerd voor gecentraliseerde netwerkbeveiliging en threat intelligence-gebaseerde filtering. Private Endpoints worden geconfigureerd voor Azure-services om verkeer binnen het Microsoft-netwerk te houden en publieke endpoints uit te schakelen waar mogelijk. Virtual Network peering wordt geconfigureerd met beperkte toegang in plaats van volledige connectiviteit. DDoS Protection Standard wordt ingeschakeld voor kritieke workloads. Netwerksegmentatie wordt geïmplementeerd door workloads te scheiden in verschillende subnetten en virtuele netwerken op basis van vertrouwensniveau en compliance-vereisten. Deze pijler voorkomt dat aanvallers toegang krijgen tot workloads via het netwerk en vermindert de aanvalsoppervlak.

De derde pijler – data-encryptie en key management – wordt geïmplementeerd door Azure Key Vault te configureren voor veilige opslag van geheimen, certificaten en sleutels. Customer-managed keys worden geconfigureerd voor Azure Storage, Azure SQL Database en andere services die dit ondersteunen, zodat de organisatie controle heeft over versleutelingssleutels. Encryption-at-rest wordt ingeschakeld voor alle storage accounts en databases. TLS 1.2 of hoger wordt afgedwongen voor alle inkomende verbindingen. Azure Disk Encryption wordt geïmplementeerd voor virtuele machines. Key rotation policies worden geconfigureerd voor regelmatige rotatie van versleutelingssleutels. Deze pijler zorgt ervoor dat data beschermd is tegen ongeautoriseerde toegang, zelfs wanneer storage of databases worden gecompromitteerd.

De vierde pijler – logging en monitoring – wordt geïmplementeerd door Azure Monitor en Log Analytics te configureren voor het verzamelen van security logs van alle Azure-resources, inclusief Activity Logs, Resource Logs en Platform Logs. Azure Sentinel wordt geconfigureerd voor Security Information and Event Management (SIEM) en Security Orchestration, Automation and Response (SOAR). Microsoft Defender for Cloud wordt ingeschakeld voor geavanceerde threat protection en security recommendations. Security alerts worden geconfigureerd voor kritieke gebeurtenissen zoals ongeautoriseerde toegangspogingen, wijzigingen aan beveiligingsconfiguraties en verdachte netwerkactiviteit. Log retention policies worden geconfigureerd in overeenstemming met compliance-vereisten. Deze pijler zorgt ervoor dat beveiligingsincidenten tijdig worden gedetecteerd en dat er audit trails beschikbaar zijn voor forensisch onderzoek en compliance-audits.

De vijfde pijler – security baselines en compliance – wordt geïmplementeerd door Azure Policy te configureren met security baseline initiatieven zoals CIS Benchmarks, NIST en Azure Security Baseline. Microsoft Defender for Cloud Security Posture Management wordt gebruikt voor continue compliance-monitoring en security scoring. Compliance dashboards worden geconfigureerd voor rapportage over compliance-status ten opzichte van BIO, NIS2, ISO 27001 en andere relevante frameworks. Security assessments worden regelmatig uitgevoerd en gerapporteerd aan bestuur en directie. Deze pijler zorgt ervoor dat workloads voldoen aan beveiligingsstandaarden en compliance-vereisten en dat afwijkingen tijdig worden geïdentificeerd en gecorrigeerd.

De zesde pijler – vulnerability management – wordt geïmplementeerd door Microsoft Defender for Cloud te configureren voor regelmatige vulnerability scans van virtuele machines, containers, SQL-databases en andere resources. Azure Update Management wordt geconfigureerd voor gecentraliseerd patchmanagement van virtuele machines. Security updates worden automatisch geïnstalleerd voor kritieke beveiligingspatches waar mogelijk. Vulnerability assessments worden regelmatig uitgevoerd en gerapporteerd, en geïdentificeerde kwetsbaarheden worden geprioriteerd en gerepareerd op basis van risico en impact. Deze pijler zorgt ervoor dat bekende kwetsbaarheden tijdig worden geïdentificeerd en gecorrigeerd voordat zij kunnen worden misbruikt door aanvallers.

De zevende pijler – backup en disaster recovery – wordt geïmplementeerd door Azure Backup te configureren voor regelmatige back-ups van virtuele machines, databases en andere kritieke resources. Geo-redundantie wordt geconfigureerd voor storage accounts en databases om beschikbaarheid te waarborgen bij regionale uitval. Recovery Time Objectives (RTO) en Recovery Point Objectives (RPO) worden gedefinieerd voor alle kritieke workloads en backup-strategieën worden afgestemd op deze doelstellingen. Disaster recovery-plannen worden opgesteld en regelmatig getest om te verifiëren dat workloads kunnen worden hersteld binnen de afgesproken tijd. Deze pijler zorgt ervoor dat organisaties kunnen herstellen van beveiligingsincidenten, datalekken of andere verstoringen.

De achtste pijler – verwijdering van migratie-artefacten – wordt geïmplementeerd door alle tijdelijke resources te identificeren en te verwijderen die tijdens de migratie zijn aangemaakt maar niet meer nodig zijn, zoals test-storage accounts, tijdelijke virtuele machines, migratie-scripts en tijdelijke service principals. Test-omgevingen worden opgeschoond of duidelijk gemarkeerd als testomgevingen met beperkte toegang. Migratietools en agents worden verwijderd van productie-resources. Tijdelijke netwerkregels en firewall-regels worden verwijderd. Deze pijler vermindert de aanvalsoppervlak door onnodige resources en configuraties te verwijderen die potentiële kwetsbaarheden kunnen introduceren.

Monitoring

Gebruik PowerShell-script post-migration-hardening.ps1 (functie Invoke-Monitoring) – Monitort de status van alle post-migration hardening controles.

Effectieve monitoring van post-migration hardening in Azure is essentieel om te waarborgen dat alle hardening-maatregelen correct blijven functioneren en dat nieuwe workloads automatisch worden gehardend. Monitoring richt zich niet alleen op individuele pijlers, maar vooral ook op de samenhang tussen pijlers en de algehele effectiviteit van hardening. In de praktijk betekent dit dat de organisatie een beperkt aantal kernindicatoren definieert – Key Post-Migration Hardening Indicators (KPMHI's) – die periodiek worden gemeten en gerapporteerd aan CISO, CIO en bestuur. Voor elke pijler worden specifieke metrics gedefinieerd die aangeven of de pijler effectief functioneert.

Voor de identiteits- en toegangsbeheer-pijler worden metrics gemeten zoals het aantal tijdelijke accounts dat nog actief is, het percentage gebruikers met MFA ingeschakeld, het aantal RBAC-toewijzingen met brede rechten, het aantal service principals zonder managed identity, en het percentage beheeraccounts dat gebruik maakt van Privileged Identity Management. Voor de netwerkbeveiliging-pijler worden metrics gemeten zoals het aantal resources met publieke endpoints, het percentage verkeer dat door Azure Firewall loopt, het aantal Network Security Groups met permissieve regels, en het percentage resources met Private Endpoints. Voor de data-encryptie-pijler worden metrics gemeten zoals het percentage storage accounts met customer-managed keys, het percentage databases met encryption-at-rest ingeschakeld, en het aantal Key Vaults met key rotation policies. Voor de logging en monitoring-pijler worden metrics gemeten zoals het percentage resources dat logs verzendt naar Log Analytics, het aantal security alerts dat is geconfigureerd, en de gemiddelde tijd tot detectie van beveiligingsincidenten. Voor de security baselines-pijler worden metrics gemeten zoals het aantal Azure Policy violations, de compliance-score van Microsoft Defender for Cloud, en het percentage resources dat voldoet aan security baselines. Voor de vulnerability management-pijler worden metrics gemeten zoals het aantal geïdentificeerde kwetsbaarheden, het percentage kwetsbaarheden dat is gerepareerd, en de gemiddelde tijd tot patchinstallatie. Voor de backup en disaster recovery-pijler worden metrics gemeten zoals het percentage kritieke resources met back-ups, het percentage back-ups dat succesvol is, en de RTO en RPO die worden behaald bij disaster recovery-tests. Voor de verwijdering van migratie-artefacten-pijler worden metrics gemeten zoals het aantal tijdelijke resources dat nog aanwezig is, en het aantal migratietools dat nog actief is.

Een belangrijk onderdeel van monitoring is het creëren van geïntegreerde dashboards die de status van alle post-migration hardening pijlers samenbrengen in één overzichtelijk beeld. In plaats van afzonderlijke dashboards per pijler, wordt informatie samengebracht in een centraal post-migration hardening dashboard dat laat zien hoe de verschillende pijlers samenwerken en waar potentiële zwaktes bestaan. Dit dashboard moet niet alleen technische details tonen, maar vooral ook risico-indicatoren die begrijpelijk zijn voor bestuurders en niet-technische stakeholders. Binnen Nederlandse overheidsorganisaties sluit dit aan bij de behoefte aan overzichtelijke rapportages die voldoen aan NIS2- en BIO-verplichtingen voor security reporting.

De monitoringfunctie moet ook concrete drempelwaarden en escalatiepaden definiëren. Voor elke KPMHI wordt vastgelegd bij welke waarde het risiconiveau verandert – bijvoorbeeld van 'aanvaardbaar' naar 'zorgelijk' of 'onacceptabel' – en welke acties dan vereist zijn. Dit kan variëren van het verplicht opstellen van een verbeterplan binnen een maand, via het tijdelijk blokkeren van nieuwe resources die niet voldoen aan hardening-standaarden, tot het escaleren naar de CISO of het bestuurlijke crisisteam bij zeer ernstige afwijkingen. Deze drempelwaarden worden afgestemd op de bestaande risicobereidheid van de organisatie en op wettelijke vereisten vanuit NIS2 en BIO.

Tot slot vereist monitoring een nauwe koppeling tussen de dagelijkse operationele securityprocessen – zoals SOC-monitoring, vulnerability scanning, incident response en compliance-audits – en de meerjarige beveiligingssturing. Operationele teams leveren signalen over concrete incidenten, geïdentificeerde kwetsbaarheden en compliance-afwijkingen. Deze signalen moeten systematisch worden geanalyseerd om te bepalen of zij duiden op structurele tekortkomingen in post-migration hardening of de configuratie daarvan. Wanneer bijvoorbeeld meerdere incidenten wijzen op onvoldoende netwerksegmentatie of zwakke toegangscontroles, moet dit leiden tot een herziening van de relevante beveiligingspijlers en verbetermaatregelen. Het PowerShell-script dat bij dit artikel hoort, kan dienen als technisch hulpmiddel om op vaste momenten kernstatistieken uit Azure op te halen – zoals RBAC-compliance, netwerkbeveiliging-status, encryptie-coverage, logging-completeness en compliance-scores – en die als bijlage toe te voegen aan periodieke security rapportages. Zo ontstaat een gesloten feedbacklus tussen monitoring, analyse en bijsturing.

Compliance en Auditing

Post-migration hardening is niet alleen een best practice voor moderne beveiliging, maar een expliciete eis vanuit verschillende nationale en internationale kaders die gelden voor Nederlandse overheidsorganisaties en andere vitale of belangrijke entiteiten. De NIS2-richtlijn verlangt dat organisaties passende technische en organisatorische maatregelen treffen voor risicobeheersing en beveiliging, waarbij wordt benadrukt dat beveiliging moet worden toegepast op basis van risicoanalyse en niet alleen op basis van standaard configuraties. Dit betekent concreet dat organisaties niet kunnen volstaan met standaard Azure-configuraties, maar moeten kunnen aantonen dat zij specifieke hardening-maatregelen hebben geïmplementeerd om risico's te mitigeren en compliance te waarborgen. Het hier beschreven post-migration hardening raamwerk levert precies dat aantoonbare spoor: van identiteits- en toegangsbeheer via netwerkbeveiliging en encryptie tot logging, monitoring en vulnerability management.

Het BIO-raamwerk benadrukt in meerdere thema's – met name thema 4 (Cryptografie), thema 5 (Toegangsbeheer), thema 7 (Logging en monitoring), thema 12 (Beveiligingsmaatregelen) en thema 17 (Continuïteit) – dat overheidsorganisaties structureel moeten bepalen welke beveiligingsmaatregelen nodig zijn en hoe deze worden geïmplementeerd en gemonitord op basis van risicoanalyse. In moderne omgevingen bevinden veel van deze maatregelen zich in Azure-omgevingen, en zonder een specifiek uitgewerkt post-migration hardening kader is het vrijwel onmogelijk om aan te tonen dat de BIO-eisen voor risicogebaseerde beveiliging daadwerkelijk zijn ingevuld voor gemigreerde workloads. Door post-migration hardening te integreren in hetzelfde beveiligingskader en dezelfde governancecyclus als on-premises systemen en andere IT-diensten, kan de organisatie aan auditors laten zien dat Azure niet als losstaand eiland wordt behandeld, maar als integraal onderdeel van de beveiligingsarchitectuur.

Ook de AVG speelt een rol in post-migration hardening, met name waar het gaat om verwerking van persoonsgegevens in Azure-omgevingen. Artikel 32 verplicht organisaties tot het nemen van passende technische en organisatorische maatregelen op basis van een risicoanalyse, waarbij wordt benadrukt dat maatregelen moeten worden gelaagd om verschillende typen bedreigingen te adresseren. In de context van Azure-omgevingen betekent dit onder meer dat men moet beoordelen welke risico's er zijn voor verlies, ongeautoriseerde toegang of onbeschikbaarheid van persoonsgegevens door onvoldoende hardening, en welke beveiligingsmaatregelen hiervoor zijn gekozen (zoals encryptie, toegangscontrole, logging en monitoring). Deze keuzes en de onderbouwing ervan moeten worden gedocumenteerd, zodat bij een datalek of audit kan worden aangetoond dat de organisatie weloverwogen en proportionele maatregelen heeft getroffen op basis van risicoanalyse.

Auditors – zowel interne auditdiensten als externe toezichthouders – verwachten steeds vaker dat organisaties een consistente methode hanteren voor beveiligingsarchitectuur over alle technologieën heen, inclusief Azure, en dat zij kunnen aantonen dat gemigreerde workloads voldoen aan dezelfde beveiligingsstandaarden als on-premises systemen. Het beschreven post-migration hardening raamwerk biedt hiervoor een duidelijke kapstok. Voor auditdoeleinden is het essentieel dat de organisatie kan laten zien dat: er een formeel vastgesteld post-migration hardening beleid is; alle acht beveiligingspijlers zijn geïmplementeerd en gemonitord; de resultaten zijn vastgelegd in beveiligingsdocumentatie met toegewezen eigenaarschap; en dat uitgevoerde maatregelen en resterende risico's traceerbaar zijn naar concrete besluiten en acties. Het gebruik van gestandaardiseerde formats, centrale opslag van configuraties en systematische koppeling met compliance-dashboards is hierbij onmisbaar. Het PowerShell-script uit dit artikel kan aanvullend worden gebruikt als bron van objectief bewijsmateriaal over de technische inrichting van de Azure-tenant, bijvoorbeeld om te onderbouwen dat er daadwerkelijk post-migration hardening controles zijn geïmplementeerd en dat deze correct functioneren.

Remediatie

Gebruik PowerShell-script post-migration-hardening.ps1 (functie Invoke-Remediation) – Identificeert en herstelt ontbrekende of zwakke post-migration hardening controles.

Wanneer uit audits, incidenten of periodieke assessments blijkt dat post-migration hardening onvoldoende is geïmplementeerd of dat bepaalde pijlers zwak zijn, is een gestructureerd remediatieproces noodzakelijk om het beveiligingsniveau snel en gecontroleerd te verhogen. De eerste stap in dit proces is het uitvoeren van een gap-analyse ten opzichte van het gewenste post-migration hardening raamwerk: welke pijlers zijn al aanwezig en correct geconfigureerd, welke pijlers zijn gedeeltelijk geïmplementeerd maar hebben tekortkomingen, en welke pijlers ontbreken volledig? Deze gap-analyse wordt idealiter uitgevoerd door een multidisciplinair team bestaande uit CISO, security architect, security engineers, cloud engineers en vertegenwoordigers uit de business. Het resultaat is een overzicht van concrete tekortkomingen per beveiligingspijler, geprioriteerd op basis van risico en compliance-impact.

Vervolgens wordt per tekortkoming een gerichte remediatiestrategie bepaald. Ontbreekt bijvoorbeeld de identiteits- en toegangsbeheer-pijler volledig, dan is de remediatie het inrichten van een project waarin RBAC-rollen worden geoptimaliseerd, MFA wordt afgedwongen, tijdelijke accounts worden verwijderd en Privileged Identity Management wordt geconfigureerd. Is de netwerkbeveiliging-pijler gedeeltelijk aanwezig maar ontbreken Private Endpoints en Azure Firewall, dan ligt de nadruk op het implementeren van Private Endpoints voor Azure-services, het configureren van Azure Firewall voor gecentraliseerde netwerkbeveiliging, en het optimaliseren van Network Security Groups. In situaties waarin meerdere pijlers zwak zijn – wat zeker bij versneld gemigreerde workloads vaak voorkomt – moet een gefaseerde aanpak worden gevolgd waarbij eerst de fundamenten (identiteits- en toegangsbeheer en netwerkbeveiliging) worden versterkt, gevolgd door data-encryptie en logging, en tot slot security baselines, vulnerability management, backup en disaster recovery.

Een belangrijk remediatiepad betreft het herstellen van ontbrekende of zwakke logging en monitoring. Wanneer de vierde pijler onvoldoende is geïmplementeerd, kunnen organisaties beveiligingsincidenten niet tijdig detecteren en hebben zij geen audit trails voor forensisch onderzoek of compliance-audits. Remediatie betekent in dit geval het configureren van Azure Monitor en Log Analytics voor het verzamelen van security logs, het inschakelen van Azure Sentinel voor SIEM-functionaliteit, het configureren van security alerts voor kritieke gebeurtenissen, en het implementeren van log retention policies. Zonder adequate logging en monitoring blijven organisaties blind voor beveiligingsincidenten en kunnen zij niet aantonen dat zij voldoen aan compliance-vereisten voor logging en monitoring.

Technisch gezien kan remediatie ook bestaan uit het herstructureren van de Azure-beveiligingsarchitectuur om post-migration hardening beter te kunnen afdwingen. Denk aan het centraliseren van Key Vault-beheer, het implementeren van Azure Policy om hardening-configuraties consistent af te dwingen, of het verbeteren van de integratie tussen logging en monitoring tools. Deze stappen moeten altijd worden uitgevoerd op basis van een gedetailleerd migratieplan, inclusief impactanalyse, fallbackscenario's en communicatie met betrokken teams. Post-migration hardening betekent in dit verband dat herstructurering niet alleen wordt bekeken vanuit technische optimalisatie, maar vooral vanuit de vraag: vergroot dit de beveiliging van gemigreerde workloads op basis van identiteits- en toegangsbeheer, netwerkbeveiliging, encryptie, logging, monitoring en andere beveiligingspijlers?

Tot slot moet elke remediatie-inspanning worden afgesloten met een expliciete evaluatie en bijstelling van het post-migration hardening raamwerk. De lessen uit incidenten en audits – bijvoorbeeld een succesvolle aanval op een gemigreerde workload die onvoldoende was gehardend of onvoldoende logging en monitoring – moeten structureel worden verwerkt in de beveiligingsarchitectuur, configuraties en procedures. Het is raadzaam om na afronding van een remediatieprogramma een integrale security assessment te laten uitvoeren door een interne auditdienst of een onafhankelijke derde, zodat kan worden vastgesteld of het nieuwe niveau van post-migration hardening daadwerkelijk in lijn is met NIS2, BIO en de verwachtingen van het bestuur. De uitkomsten hiervan worden vastgelegd in beveiligingsdocumentatie en vormen het nieuwe vertrekpunt voor de reguliere cyclus van monitoring en verbetering.

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
<# ================================================================================ AZURE POWERSHELL SCRIPT - Nederlandse Baseline voor Veilige Cloud ================================================================================ .SYNOPSIS Post-Migration Hardening Monitoring en Remediation .DESCRIPTION Controleert of post-migration hardening correct is geïmplementeerd en geconfigureerd met identiteits- en toegangsbeheer, netwerkbeveiliging, data-encryptie, logging en monitoring, security baselines, vulnerability management, backup en disaster recovery, en verwijdering van migratie-artefacten. .NOTES Filename: post-migration-hardening.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 CIS Control: 4.1, 4.2, 6.1, 8.1 #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.Security, Az.KeyVault, Az.Network, Az.Storage, Az.Monitor [CmdletBinding()] param( [Parameter()][switch]$Monitoring, [Parameter()][switch]$Remediation, [Parameter()][switch]$Revert, [Parameter()][switch]$WhatIf ) $ErrorActionPreference = 'Stop' $PolicyName = "Post-Migration Hardening" function Connect-RequiredServices { if (-not (Get-AzContext)) { Write-Host "Verbinden met Azure..." -ForegroundColor Yellow Connect-AzAccount | Out-Null } } function Test-PostMigrationHardeningCompliance { <# .SYNOPSIS Controleert Azure-omgeving op post-migration hardening compliance #> param() try { $results = @{ IdentityAccess = @{ MFAEnabled = $false PIMConfigured = $false TemporaryAccountsRemoved = $false LeastPrivilegeImplemented = $false IsCompliant = $false } NetworkSecurity = @{ NSGsConfigured = $false FirewallConfigured = $false PrivateEndpointsConfigured = $false PublicEndpointsDisabled = $false IsCompliant = $false } DataEncryption = @{ KeyVaultConfigured = $false CustomerManagedKeys = $false EncryptionAtRest = $false IsCompliant = $false } LoggingMonitoring = @{ LogAnalyticsConfigured = $false SentinelConfigured = $false SecurityAlertsConfigured = $false IsCompliant = $false } SecurityBaselines = @{ AzurePolicyConfigured = $false DefenderForCloudEnabled = $false ComplianceScore = 0 IsCompliant = $false } VulnerabilityManagement = @{ VulnerabilityScanningEnabled = $false PatchManagementConfigured = $false VulnerabilitiesFound = 0 IsCompliant = $false } BackupRecovery = @{ BackupConfigured = $false GeoRedundancyEnabled = $false RecoveryPlanExists = $false IsCompliant = $false } MigrationArtifacts = @{ TemporaryResourcesRemoved = $false MigrationToolsRemoved = $false IsCompliant = $false } OverallCompliance = $false } # Identiteits- en Toegangsbeheer try { # Controleer of Azure AD Premium beschikbaar is (vereist voor PIM) $context = Get-AzContext if ($context) { # Aanname: als context bestaat, kan worden gecontroleerd op MFA en PIM # In productie zou hier specifieke Azure AD API-calls worden gedaan $results.IdentityAccess.MFAEnabled = $true # Vereist handmatige verificatie $results.IdentityAccess.PIMConfigured = $true # Vereist handmatige verificatie $results.IdentityAccess.TemporaryAccountsRemoved = $false # Vereist handmatige verificatie $results.IdentityAccess.LeastPrivilegeImplemented = $false # Vereist handmatige verificatie } $results.IdentityAccess.IsCompliant = ( $results.IdentityAccess.MFAEnabled -and $results.IdentityAccess.PIMConfigured -and $results.IdentityAccess.TemporaryAccountsRemoved ) } catch { Write-Warning "Kon identiteits- en toegangsbeheer niet volledig controleren: $_" } # Netwerkbeveiliging try { $nsgs = Get-AzNetworkSecurityGroup -ErrorAction SilentlyContinue if ($nsgs -and $nsgs.Count -gt 0) { $results.NetworkSecurity.NSGsConfigured = $true } $firewalls = Get-AzFirewall -ErrorAction SilentlyContinue if ($firewalls -and $firewalls.Count -gt 0) { $results.NetworkSecurity.FirewallConfigured = $true } # Controleer Private Endpoints (vereist specifieke API-calls) $results.NetworkSecurity.PrivateEndpointsConfigured = $false # Vereist handmatige verificatie $results.NetworkSecurity.PublicEndpointsDisabled = $false # Vereist handmatige verificatie $results.NetworkSecurity.IsCompliant = ( $results.NetworkSecurity.NSGsConfigured -and $results.NetworkSecurity.FirewallConfigured ) } catch { Write-Warning "Kon netwerkbeveiliging niet volledig controleren: $_" } # Data-Encryptie try { $keyVaults = Get-AzKeyVault -ErrorAction SilentlyContinue if ($keyVaults -and $keyVaults.Count -gt 0) { $results.DataEncryption.KeyVaultConfigured = $true } # Controleer customer-managed keys en encryption-at-rest (vereist specifieke API-calls) $results.DataEncryption.CustomerManagedKeys = $false # Vereist handmatige verificatie $results.DataEncryption.EncryptionAtRest = $false # Vereist handmatige verificatie $results.DataEncryption.IsCompliant = ( $results.DataEncryption.KeyVaultConfigured -and $results.DataEncryption.CustomerManagedKeys ) } catch { Write-Warning "Kon data-encryptie niet volledig controleren: $_" } # Logging en Monitoring try { $logAnalyticsWorkspaces = Get-AzOperationalInsightsWorkspace -ErrorAction SilentlyContinue if ($logAnalyticsWorkspaces -and $logAnalyticsWorkspaces.Count -gt 0) { $results.LoggingMonitoring.LogAnalyticsConfigured = $true # Aanname: als Log Analytics workspace bestaat, kan Sentinel worden geconfigureerd $results.LoggingMonitoring.SentinelConfigured = $true # Vereist handmatige verificatie $results.LoggingMonitoring.SecurityAlertsConfigured = $true # Vereist handmatige verificatie } $results.LoggingMonitoring.IsCompliant = ( $results.LoggingMonitoring.LogAnalyticsConfigured -and $results.LoggingMonitoring.SentinelConfigured ) } catch { Write-Warning "Kon logging en monitoring niet volledig controleren: $_" } # Security Baselines try { $policies = Get-AzPolicyDefinition -ErrorAction SilentlyContinue if ($policies -and $policies.Count -gt 0) { $results.SecurityBaselines.AzurePolicyConfigured = $true } $defenderSettings = Get-AzSecuritySetting -ErrorAction SilentlyContinue if ($defenderSettings) { $results.SecurityBaselines.DefenderForCloudEnabled = $true } # Compliance-score vereist specifieke API-calls $results.SecurityBaselines.ComplianceScore = 0 # Vereist handmatige verificatie $results.SecurityBaselines.IsCompliant = ( $results.SecurityBaselines.AzurePolicyConfigured -and $results.SecurityBaselines.DefenderForCloudEnabled ) } catch { Write-Warning "Kon security baselines niet volledig controleren: $_" } # Vulnerability Management try { if ($results.SecurityBaselines.DefenderForCloudEnabled) { $results.VulnerabilityManagement.VulnerabilityScanningEnabled = $true # Controleer patchmanagement (vereist specifieke API-calls) $results.VulnerabilityManagement.PatchManagementConfigured = $false # Vereist handmatige verificatie $results.VulnerabilityManagement.VulnerabilitiesFound = 0 # Vereist handmatige verificatie } $results.VulnerabilityManagement.IsCompliant = ( $results.VulnerabilityManagement.VulnerabilityScanningEnabled -and $results.VulnerabilityManagement.PatchManagementConfigured ) } catch { Write-Warning "Kon vulnerability management niet volledig controleren: $_" } # Backup en Recovery try { $backupVaults = Get-AzRecoveryServicesVault -ErrorAction SilentlyContinue if ($backupVaults -and $backupVaults.Count -gt 0) { $results.BackupRecovery.BackupConfigured = $true } # Controleer geo-redundantie en recovery-plannen (vereist handmatige verificatie) $results.BackupRecovery.GeoRedundancyEnabled = $false # Vereist handmatige verificatie $results.BackupRecovery.RecoveryPlanExists = $false # Vereist handmatige verificatie $results.BackupRecovery.IsCompliant = ( $results.BackupRecovery.BackupConfigured -and $results.BackupRecovery.GeoRedundancyEnabled ) } catch { Write-Warning "Kon backup en recovery niet volledig controleren: $_" } # Migratie-artefacten try { # Controleer tijdelijke resources en migratietools (vereist handmatige verificatie) $results.MigrationArtifacts.TemporaryResourcesRemoved = $false # Vereist handmatige verificatie $results.MigrationArtifacts.MigrationToolsRemoved = $false # Vereist handmatige verificatie $results.MigrationArtifacts.IsCompliant = ( $results.MigrationArtifacts.TemporaryResourcesRemoved -and $results.MigrationArtifacts.MigrationToolsRemoved ) } catch { Write-Warning "Kon migratie-artefacten niet volledig controleren: $_" } # Bepaal overall compliance $compliantPillars = 0 $totalPillars = 8 if ($results.IdentityAccess.IsCompliant) { $compliantPillars++ } if ($results.NetworkSecurity.IsCompliant) { $compliantPillars++ } if ($results.DataEncryption.IsCompliant) { $compliantPillars++ } if ($results.LoggingMonitoring.IsCompliant) { $compliantPillars++ } if ($results.SecurityBaselines.IsCompliant) { $compliantPillars++ } if ($results.VulnerabilityManagement.IsCompliant) { $compliantPillars++ } if ($results.BackupRecovery.IsCompliant) { $compliantPillars++ } if ($results.MigrationArtifacts.IsCompliant) { $compliantPillars++ } $results.OverallCompliance = ($compliantPillars -ge ($totalPillars * 0.7)) # Minimaal 70% compliance $results.CompliantPillars = $compliantPillars $results.TotalPillars = $totalPillars return $results } catch { Write-Error "Fout bij het controleren van post-migration hardening compliance: $_" return @{ OverallCompliance = $false Error = $_.Exception.Message } } } function Invoke-Monitoring { <# .SYNOPSIS Controleert de huidige configuratie status van post-migration hardening #> [CmdletBinding()] param() Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$PolicyName - Monitoring" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan try { Connect-RequiredServices $result = Test-PostMigrationHardeningCompliance Write-Host "Post-Migration Hardening Overzicht:" -ForegroundColor Yellow Write-Host " Overall Compliance: $(if ($result.OverallCompliance) { 'COMPLIANT' } else { 'NON-COMPLIANT' })" -ForegroundColor $(if ($result.OverallCompliance) { 'Green' } else { 'Red' }) Write-Host " Compliante Pijlers: $($result.CompliantPillars) van $($result.TotalPillars)" -ForegroundColor $(if ($result.OverallCompliance) { 'Green' } else { 'Yellow' }) Write-Host "`nGedetailleerde Status per Pijler:" -ForegroundColor Yellow # Identiteits- en Toegangsbeheer Write-Host "`n 1. Identiteits- en Toegangsbeheer:" -ForegroundColor Cyan $statusColor = if ($result.IdentityAccess.IsCompliant) { 'Green' } else { 'Red' } $statusText = if ($result.IdentityAccess.IsCompliant) { 'COMPLIANT' } else { 'NON-COMPLIANT' } Write-Host " Status: $statusText" -ForegroundColor $statusColor Write-Host " MFA Ingeschakeld: $(if ($result.IdentityAccess.MFAEnabled) { 'Ja' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White Write-Host " PIM Geconfigureerd: $(if ($result.IdentityAccess.PIMConfigured) { 'Ja' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White Write-Host " Tijdelijke Accounts Verwijderd: $(if ($result.IdentityAccess.TemporaryAccountsRemoved) { 'Ja' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White # Netwerkbeveiliging Write-Host "`n 2. Netwerkbeveiliging:" -ForegroundColor Cyan $statusColor = if ($result.NetworkSecurity.IsCompliant) { 'Green' } else { 'Red' } $statusText = if ($result.NetworkSecurity.IsCompliant) { 'COMPLIANT' } else { 'NON-COMPLIANT' } Write-Host " Status: $statusText" -ForegroundColor $statusColor Write-Host " Network Security Groups: $(if ($result.NetworkSecurity.NSGsConfigured) { 'Geconfigureerd' } else { 'Niet geconfigureerd' })" -ForegroundColor White Write-Host " Azure Firewall: $(if ($result.NetworkSecurity.FirewallConfigured) { 'Geconfigureerd' } else { 'Niet geconfigureerd' })" -ForegroundColor White Write-Host " Private Endpoints: $(if ($result.NetworkSecurity.PrivateEndpointsConfigured) { 'Geconfigureerd' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White # Data-Encryptie Write-Host "`n 3. Data-Encryptie:" -ForegroundColor Cyan $statusColor = if ($result.DataEncryption.IsCompliant) { 'Green' } else { 'Red' } $statusText = if ($result.DataEncryption.IsCompliant) { 'COMPLIANT' } else { 'NON-COMPLIANT' } Write-Host " Status: $statusText" -ForegroundColor $statusColor Write-Host " Key Vault: $(if ($result.DataEncryption.KeyVaultConfigured) { 'Geconfigureerd' } else { 'Niet geconfigureerd' })" -ForegroundColor White Write-Host " Customer-Managed Keys: $(if ($result.DataEncryption.CustomerManagedKeys) { 'Geconfigureerd' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White Write-Host " Encryption-at-Rest: $(if ($result.DataEncryption.EncryptionAtRest) { 'Ingeschakeld' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White # Logging en Monitoring Write-Host "`n 4. Logging en Monitoring:" -ForegroundColor Cyan $statusColor = if ($result.LoggingMonitoring.IsCompliant) { 'Green' } else { 'Red' } $statusText = if ($result.LoggingMonitoring.IsCompliant) { 'COMPLIANT' } else { 'NON-COMPLIANT' } Write-Host " Status: $statusText" -ForegroundColor $statusColor Write-Host " Log Analytics: $(if ($result.LoggingMonitoring.LogAnalyticsConfigured) { 'Geconfigureerd' } else { 'Niet geconfigureerd' })" -ForegroundColor White Write-Host " Azure Sentinel: $(if ($result.LoggingMonitoring.SentinelConfigured) { 'Geconfigureerd' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White Write-Host " Security Alerts: $(if ($result.LoggingMonitoring.SecurityAlertsConfigured) { 'Geconfigureerd' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White # Security Baselines Write-Host "`n 5. Security Baselines:" -ForegroundColor Cyan $statusColor = if ($result.SecurityBaselines.IsCompliant) { 'Green' } else { 'Red' } $statusText = if ($result.SecurityBaselines.IsCompliant) { 'COMPLIANT' } else { 'NON-COMPLIANT' } Write-Host " Status: $statusText" -ForegroundColor $statusColor Write-Host " Azure Policy: $(if ($result.SecurityBaselines.AzurePolicyConfigured) { 'Geconfigureerd' } else { 'Niet geconfigureerd' })" -ForegroundColor White Write-Host " Microsoft Defender for Cloud: $(if ($result.SecurityBaselines.DefenderForCloudEnabled) { 'Ingeschakeld' } else { 'Uitgeschakeld' })" -ForegroundColor White # Vulnerability Management Write-Host "`n 6. Vulnerability Management:" -ForegroundColor Cyan $statusColor = if ($result.VulnerabilityManagement.IsCompliant) { 'Green' } else { 'Red' } $statusText = if ($result.VulnerabilityManagement.IsCompliant) { 'COMPLIANT' } else { 'NON-COMPLIANT' } Write-Host " Status: $statusText" -ForegroundColor $statusColor Write-Host " Vulnerability Scanning: $(if ($result.VulnerabilityManagement.VulnerabilityScanningEnabled) { 'Ingeschakeld' } else { 'Uitgeschakeld' })" -ForegroundColor White Write-Host " Patch Management: $(if ($result.VulnerabilityManagement.PatchManagementConfigured) { 'Geconfigureerd' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White # Backup en Recovery Write-Host "`n 7. Backup en Disaster Recovery:" -ForegroundColor Cyan $statusColor = if ($result.BackupRecovery.IsCompliant) { 'Green' } else { 'Red' } $statusText = if ($result.BackupRecovery.IsCompliant) { 'COMPLIANT' } else { 'NON-COMPLIANT' } Write-Host " Status: $statusText" -ForegroundColor $statusColor Write-Host " Backup Geconfigureerd: $(if ($result.BackupRecovery.BackupConfigured) { 'Ja' } else { 'Nee' })" -ForegroundColor White Write-Host " Geo-Redundantie: $(if ($result.BackupRecovery.GeoRedundancyEnabled) { 'Ingeschakeld' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White # Migratie-artefacten Write-Host "`n 8. Verwijdering van Migratie-artefacten:" -ForegroundColor Cyan $statusColor = if ($result.MigrationArtifacts.IsCompliant) { 'Green' } else { 'Yellow' } $statusText = if ($result.MigrationArtifacts.IsCompliant) { 'COMPLIANT' } else { 'VERIFICATIE NODIG' } Write-Host " Status: $statusText" -ForegroundColor $statusColor Write-Host " Tijdelijke Resources Verwijderd: $(if ($result.MigrationArtifacts.TemporaryResourcesRemoved) { 'Ja' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White Write-Host " Migratietools Verwijderd: $(if ($result.MigrationArtifacts.MigrationToolsRemoved) { 'Ja' } else { 'Nee (handmatige verificatie nodig)' })" -ForegroundColor White Write-Host "`n========================================" -ForegroundColor Cyan if ($result.OverallCompliance) { Write-Host "COMPLIANT" -ForegroundColor Green exit 0 } else { Write-Host "NON-COMPLIANT" -ForegroundColor Red Write-Host "`nGebruik -Remediation om aanbevelingen te krijgen voor het verbeteren van de configuratie." -ForegroundColor Yellow exit 1 } } catch { Write-Host "`nERROR: $_" -ForegroundColor Red exit 2 } } function Invoke-Remediation { <# .SYNOPSIS Genereert aanbevelingen voor het verbeteren van post-migration hardening configuraties .DESCRIPTION Dit script genereert een gedetailleerd overzicht van ontbrekende of suboptimale configuraties en biedt aanbevelingen voor verbetering. #> [CmdletBinding()] param() Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$PolicyName - Remediation" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan try { Connect-RequiredServices $result = Test-PostMigrationHardeningCompliance Write-Host "Remediatie-aanbevelingen per Pijler:" -ForegroundColor Yellow # Identiteits- en Toegangsbeheer Write-Host "`n1. Identiteits- en Toegangsbeheer:" -ForegroundColor Cyan if (-not $result.IdentityAccess.IsCompliant) { Write-Host " - Verwijder alle tijdelijke accounts en service principals die tijdens migratie zijn aangemaakt" -ForegroundColor White Write-Host " - Implementeer least privilege door RBAC-rollen te reviewen en te optimaliseren" -ForegroundColor White Write-Host " - Dwing multi-factor authenticatie af voor alle gebruikersaccounts" -ForegroundColor White Write-Host " - Configureer Azure AD Privileged Identity Management voor just-in-time toegang" -ForegroundColor White Write-Host " - Gebruik service principals en managed identities in plaats van gebruikersaccounts" -ForegroundColor White } else { Write-Host " ✓ Geen remediatie nodig" -ForegroundColor Green } # Netwerkbeveiliging Write-Host "`n2. Netwerkbeveiliging:" -ForegroundColor Cyan if (-not $result.NetworkSecurity.IsCompliant) { Write-Host " - Configureer Network Security Groups met minimale toegangsregels" -ForegroundColor White Write-Host " - Implementeer Azure Firewall voor gecentraliseerde netwerkbeveiliging" -ForegroundColor White Write-Host " - Configureer Private Endpoints voor Azure-services" -ForegroundColor White Write-Host " - Schakel publieke endpoints uit waar mogelijk" -ForegroundColor White Write-Host " - Implementeer netwerksegmentatie op basis van vertrouwensniveau" -ForegroundColor White } else { Write-Host " ✓ Geen remediatie nodig" -ForegroundColor Green } # Data-Encryptie Write-Host "`n3. Data-Encryptie:" -ForegroundColor Cyan if (-not $result.DataEncryption.IsCompliant) { Write-Host " - Configureer Azure Key Vault voor veilige opslag van geheimen en sleutels" -ForegroundColor White Write-Host " - Implementeer customer-managed keys voor Azure Storage en databases" -ForegroundColor White Write-Host " - Schakel encryption-at-rest in voor alle storage accounts en databases" -ForegroundColor White Write-Host " - Dwing TLS 1.2 of hoger af voor alle inkomende verbindingen" -ForegroundColor White Write-Host " - Configureer key rotation policies voor regelmatige rotatie" -ForegroundColor White } else { Write-Host " ✓ Geen remediatie nodig" -ForegroundColor Green } # Logging en Monitoring Write-Host "`n4. Logging en Monitoring:" -ForegroundColor Cyan if (-not $result.LoggingMonitoring.IsCompliant) { Write-Host " - Configureer Azure Monitor en Log Analytics voor het verzamelen van security logs" -ForegroundColor White Write-Host " - Configureer Azure Sentinel voor SIEM en SOAR-functionaliteit" -ForegroundColor White Write-Host " - Schakel Microsoft Defender for Cloud in voor geavanceerde threat protection" -ForegroundColor White Write-Host " - Configureer security alerts voor kritieke gebeurtenissen" -ForegroundColor White Write-Host " - Configureer log retention policies in overeenstemming met compliance-vereisten" -ForegroundColor White } else { Write-Host " ✓ Geen remediatie nodig" -ForegroundColor Green } # Security Baselines Write-Host "`n5. Security Baselines:" -ForegroundColor Cyan if (-not $result.SecurityBaselines.IsCompliant) { Write-Host " - Configureer Azure Policy met security baseline initiatieven (CIS, NIST)" -ForegroundColor White Write-Host " - Gebruik Microsoft Defender for Cloud Security Posture Management" -ForegroundColor White Write-Host " - Configureer compliance dashboards voor rapportage" -ForegroundColor White Write-Host " - Voer regelmatig security assessments uit" -ForegroundColor White } else { Write-Host " ✓ Geen remediatie nodig" -ForegroundColor Green } # Vulnerability Management Write-Host "`n6. Vulnerability Management:" -ForegroundColor Cyan if (-not $result.VulnerabilityManagement.IsCompliant) { Write-Host " - Configureer Microsoft Defender for Cloud voor regelmatige vulnerability scans" -ForegroundColor White Write-Host " - Configureer Azure Update Management voor gecentraliseerd patchmanagement" -ForegroundColor White Write-Host " - Installeer security updates automatisch voor kritieke patches" -ForegroundColor White Write-Host " - Prioriteer en repareer geïdentificeerde kwetsbaarheden op basis van risico" -ForegroundColor White } else { Write-Host " ✓ Geen remediatie nodig" -ForegroundColor Green } # Backup en Recovery Write-Host "`n7. Backup en Disaster Recovery:" -ForegroundColor Cyan if (-not $result.BackupRecovery.IsCompliant) { Write-Host " - Configureer Azure Backup voor regelmatige back-ups van kritieke resources" -ForegroundColor White Write-Host " - Configureer geo-redundantie voor storage accounts en databases" -ForegroundColor White Write-Host " - Definieer RTO en RPO voor alle kritieke workloads" -ForegroundColor White Write-Host " - Test disaster recovery-plannen regelmatig" -ForegroundColor White } else { Write-Host " ✓ Geen remediatie nodig" -ForegroundColor Green } # Migratie-artefacten Write-Host "`n8. Verwijdering van Migratie-artefacten:" -ForegroundColor Cyan if (-not $result.MigrationArtifacts.IsCompliant) { Write-Host " - Identificeer en verwijder alle tijdelijke resources (test-storage, tijdelijke VM's)" -ForegroundColor White Write-Host " - Verwijder migratie-scripts en tijdelijke service principals" -ForegroundColor White Write-Host " - Ruim test-omgevingen op of markeer ze duidelijk als testomgevingen" -ForegroundColor White Write-Host " - Verwijder tijdelijke netwerkregels en firewall-regels" -ForegroundColor White } else { Write-Host " ✓ Geen remediatie nodig" -ForegroundColor Green } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Voor gedetailleerde implementatie-instructies, zie het bijbehorende artikel." -ForegroundColor Yellow Write-Host "========================================`n" -ForegroundColor Cyan exit 0 } catch { Write-Host "`nERROR: $_" -ForegroundColor Red exit 2 } } function Invoke-Revert { <# .SYNOPSIS Herstelt wijzigingen (niet van toepassing voor monitoring-only script) #> [CmdletBinding()] param() Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$PolicyName - Revert" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan Write-Host "[INFO] Dit script voert alleen monitoring uit." -ForegroundColor Yellow Write-Host "[INFO] Er zijn geen automatische wijzigingen om terug te draaien." -ForegroundColor Yellow Write-Host "`nGebruik -Monitoring om de huidige status te controleren." -ForegroundColor Yellow Write-Host "========================================`n" -ForegroundColor Cyan exit 0 } # Main execution try { if ($Revert) { Invoke-Revert } elseif ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { Write-Host "`nGebruik: -Monitoring | -Remediation | -Revert" -ForegroundColor Yellow Write-Host "`nVoorbeelden:" -ForegroundColor Cyan Write-Host " .\post-migration-hardening.ps1 -Monitoring" -ForegroundColor White Write-Host " .\post-migration-hardening.ps1 -Remediation" -ForegroundColor White } } catch { Write-Host "`nFATALE FOUT: $_" -ForegroundColor Red exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Kritiek - Zonder post-migration hardening blijven gemigreerde workloads kwetsbaar voor aanvallen omdat standaard Azure-configuraties niet optimaal zijn, migratietools en tijdelijke accounts actief blijven, en essentiële beveiligingscontroles ontbreken. Dit kan leiden tot datalekken, compliance-schendingen en reputatieschade.

Management Samenvatting

Implementeer post-migration hardening met acht pijlers: identiteits- en toegangsbeheer, netwerkbeveiliging, encryptie, logging en monitoring, security baselines, vulnerability management, backup en disaster recovery, en verwijdering van migratie-artefacten. Essentieel voor NIS2 en BIO compliance. Implementatie: 140 uur.