Azure OT Security: Overzicht Van Beveiligingsmaatregelen Voor Operationele Technologie

💼 Management Samenvatting

Operationele Technologie (OT) vormt het fundament van moderne industriële processen en kritieke infrastructuur, waarbij systemen zoals SCADA, industriële controlesystemen (ICS), Programmable Logic Controllers (PLC's) en Human Machine Interfaces (HMI's) real-time monitoring, controle en coördinatie verzorgen voor processen die essentieel zijn voor de maatschappij, zoals energievoorziening, waterbeheer, transport en productie. De beveiliging van OT-systemen in Azure cloudomgevingen vereist een gespecialiseerde, gelaagde aanpak die verder gaat dan traditionele IT-beveiliging, omdat deze systemen unieke karakteristieken hebben zoals real-time deterministische communicatie, lange levenscycli, kritieke beschikbaarheidsvereisten, en de directe koppeling met fysieke processen die kunnen leiden tot veiligheidsincidenten of maatschappelijke ontwrichting wanneer zij worden gecompromitteerd. Deze index pagina biedt een overzicht van alle OT-beveiligingsaspecten die relevant zijn voor Azure-omgevingen en helpt organisaties om een samenhangend, aantoonbaar beveiligingsraamwerk op te bouwen dat voldoet aan de Baseline Informatiebeveiliging Overheid (BIO), de NIS2 richtlijn en andere relevante normenkaders voor kritieke infrastructuren.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
10/10
Implementatie
240u (tech: 120u)
Van toepassing op:
Azure
Operationele Technologie
OT omgevingen
SCADA systemen
Industriële controlesystemen
Kritieke infrastructuur
ICS
IoT devices

OT-systemen in kritieke infrastructuur zoals energiecentrales, waterzuiveringsinstallaties, productiefaciliteiten en transportnetwerken vormen een zeer aantrekkelijk doelwit voor cyberaanvallen, omdat een succesvolle aanval niet alleen kan leiden tot dataverlies of reputatieschade, maar ook tot directe controle over fysieke processen met potentieel catastrofale gevolgen voor veiligheid, milieu en maatschappij. Historische incidenten zoals Stuxnet, BlackEnergy en Industroyer hebben aangetoond dat aanvallers specifiek gericht zijn op OT-systemen met als doel om industriële processen te ontwrichten, productie te stoppen, of zelfs fysieke schade te veroorzaken. Nederlandse organisaties die kritieke infrastructuur beheren worden steeds vaker geconfronteerd met geavanceerde cyberbedreigingen die specifiek gericht zijn op OT-systemen, waarbij aanvallers gebruik maken van kwetsbaarheden in industriële protocollen zoals Modbus, DNP3 en OPC Classic die vaak geen ingebouwde beveiligingsmechanismen bevatten. Zonder adequate OT-beveiliging kunnen aanvallers zich lateraal bewegen vanuit IT-netwerken naar OT-netwerken, ongeautoriseerd toegang krijgen tot HMI's, kwaadaardige commando's verzenden naar PLC's, historische data manipuleren, alarmen uitschakelen, of zelfs de volledige OT-infrastructuur compromitteren. Voor Nederlandse organisaties die essentiële diensten leveren is het ontbreken van adequate OT-beveiliging bovendien een directe schending van de NIS2-richtlijn en de Baseline Informatiebeveiliging Overheid (BIO), wat kan resulteren in aanzienlijke boetes tot 10 miljoen euro of 2% van de wereldwijde jaaromzet, verplichte herstelmaatregelen, en bestuurlijke aansprakelijkheid bij incidenten.

PowerShell Modules Vereist
Primary API: Azure API, Azure IoT Hub API, Microsoft Defender for IoT API
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.IotHub, Az.Security, Az.Network, Az.Monitor

Implementatie

Dit index-artikel fungeert als centrale verzamelplaats voor alle OT-beveiligingsgerelateerde artikelen binnen de Azure-domein van de 'Nederlandse Baseline voor Veilige Cloud'. We behandelen de belangrijkste beveiligingsuitdagingen die specifiek zijn voor OT-omgevingen, beschrijven hoe deze worden vertaald naar concrete Azure-services en configuraties, en laten zien hoe organisaties een volwassen OT-beveiligingsproces kunnen opzetten. Het artikel verbindt specifieke OT-beveiligingsartikelen zoals SCADA-beveiliging, ICS-netwerksegmentatie, OT-monitoring, industriële beveiligingspatronen en OT-beveiligingsgovernance, en biedt handvatten voor governance, monitoring en incident response. Daarnaast beschrijft het artikel hoe OT-beveiliging wordt gemeten, gerapporteerd en continu verbeterd binnen een Azure-omgeving.

Het OT-beveiligingslandschap voor Nederlandse overheidsorganisaties

Nederlandse overheidsorganisaties die operationele technologie gebruiken, worden geconfronteerd met een complexe beveiligingsuitdaging die fundamenteel verschilt van traditionele IT-beveiliging. OT-systemen zijn vaak embedded systemen met lange levenscycli die draaien op verouderde software die niet regelmatig kan worden bijgewerkt zonder operationele verstoringen, gebruiken industriële protocollen zoals Modbus, DNP3, IEC 61850 en OPC Classic die vaak geen ingebouwde beveiligingsmechanismen bevatten, en hebben kritieke beschikbaarheidsvereisten waarbij beveiligingsmaatregelen niet mogen interfereren met industriële processen. Deze karakteristieken maken OT-systemen tot een uniek en uitdagend beveiligingsdomein dat gespecialiseerde expertise en zorgvuldige planning vereist.

De Baseline Informatiebeveiliging Overheid (BIO) vormt het fundament voor informatiebeveiliging binnen de publieke sector en legt eisen op rond risicomanagement, beveiligingsmaatregelen, incident response en continuïteit. Voor OT-omgevingen betekent dit dat organisaties moeten kunnen aantonen dat zij passende maatregelen hebben genomen om OT-systemen te beveiligen, dat zij processen hebben geïmplementeerd voor het beheren van OT-toegangscontroles, dat zij netwerksegmentatie hebben geïmplementeerd om OT-systemen te isoleren van IT-netwerken, en dat zij monitoring en logging hebben geconfigureerd om alle activiteiten binnen OT-systemen te traceren. De NIS2 richtlijn voegt daar specifieke eisen aan toe voor essentiële en belangrijke entiteiten op het gebied van cybersecurity-maatregelen, incidentmeldingen en supply chain security, waarbij OT-systemen vaak onderdeel vormen van kritieke infrastructuren die onder de reikwijdte van NIS2 vallen.

Azure biedt verschillende services om OT-beveiligingsuitdagingen aan te pakken, waaronder Azure IoT Hub voor device connectivity en management, Azure IoT Edge voor edge computing, Microsoft Defender for IoT voor threat detection en protocol monitoring, Azure Virtual Networks en Network Security Groups voor netwerksegmentatie, en Azure Sentinel met ICS-specifieke analytics voor beveiligingsmonitoring. Deze services moeten worden geconfigureerd volgens best practices om een volwassen OT-beveiligingsraamwerk te realiseren dat voldoet aan de eisen van BIO, NIS2 en andere relevante normenkaders.

Implementatieframework: van netwerksegmentatie tot continue monitoring

Het implementeren van een volwassen OT-beveiligingsraamwerk in Azure begint met netwerksegmentatie volgens het Purdue Model, waarbij OT-systemen worden geplaatst in strikt geïsoleerde netwerksegmenten die gescheiden zijn van IT-netwerken en die corresponderen met de verschillende niveaus van industriële automatisering. Level 2 van het Purdue Model, waar SCADA-systemen en HMI's zich bevinden, moet strikt worden geïsoleerd van Level 4 en Level 5 waar IT-systemen en externe connectiviteit plaatsvinden, waarbij alleen specifiek geautoriseerd verkeer wordt toegestaan tussen niveaus door middel van gecontroleerde gateways, firewalls en unidirectionele communicatie waar mogelijk. Deze segmentatie voorkomt dat aanvallers die toegang krijgen tot IT-systemen zich lateraal kunnen bewegen naar OT-systemen, en zorgt ervoor dat IT-bedreigingen zoals malware en ransomware niet kunnen overslaan naar kritieke industriële systemen.

Een kritiek onderdeel van OT-beveiliging is het beveiligen van industriële protocollen die worden gebruikt voor communicatie tussen OT-componenten, omdat de meeste industriële protocollen zoals Modbus, DNP3, IEC 61850 en OPC Classic zijn ontworpen voor betrouwbare en deterministische communicatie in geïsoleerde omgevingen, maar geen ingebouwde beveiligingsmechanismen bevatten zoals encryptie of authenticatie. Deze protocollen zijn daarom zeer kwetsbaar voor aanvallen zoals protocol spoofing waarbij aanvallers kwaadaardige commando's verzenden naar PLC's, man-in-the-middle aanvallen waarbij aanvallers communicatie onderscheppen en manipuleren, en replay aanvallen waarbij aanvallers eerder opgenomen commando's opnieuw afspelen om ongeautoriseerde acties uit te voeren. Organisaties moeten daarom deep packet inspection (DPI) tools implementeren die industriële protocolverkeer kunnen analyseren en detecteren wanneer kwaadaardige of ongeautoriseerde commando's worden verzonden, protocol-aware firewalls die verkeer kunnen filteren op basis van specifieke industriële protocolcommando's, en waar mogelijk moderne beveiligde varianten van industriële protocollen implementeren zoals OPC UA met ingebouwde encryptie en authenticatie.

Strikte toegangscontroles en multi-factor authenticatie vormen een essentieel onderdeel van OT-beveiliging, omdat ongeautoriseerde toegang tot HMI's, engineering-workstations of SCADA-servers kan leiden tot wijzigingen aan kritieke configuraties, manipulatie van procesparameters, of zelfs volledige controle over industriële processen. Organisaties moeten gebruik maken van Azure Active Directory voor identiteitsbeheer en toegangscontroles voor OT-systemen, waarbij alle gebruikers worden geverifieerd met multi-factor authenticatie voordat zij toegang krijgen tot OT-componenten, waarbij rolgebaseerde toegangscontroles worden geïmplementeerd om ervoor te zorgen dat gebruikers alleen toegang hebben tot de functies en data die zij nodig hebben voor hun werk, en waarbij privileged access management wordt gebruikt om toegang tot engineering-functies en configuratie-instellingen te beperken tot geautoriseerde technici. Daarnaast moeten organisaties conditional access policies implementeren die aanvullende verificatie-eisen stellen wanneer gebruikers toegang proberen te krijgen vanuit onbekende locaties, wanneer er afwijkende activiteiten worden gedetecteerd, of wanneer toegang wordt verkregen buiten normale werkuren.

Microsoft Defender for IoT biedt geavanceerde threat detection voor OT-omgevingen door middel van gedragsanalyse van apparaten, kwetsbaarheidsscanning van firmware en gespecialiseerde bedreigingsinformatie voor industriële systemen. De service detecteert proactief cyberaanvallen die specifiek gericht zijn op OT-infrastructuren en helpt organisaties hun OT-ecosysteem te beschermen tegen moderne bedreigingen. Defender for IoT biedt continue monitoring van industriële protocolverkeer, anomaliedetectie voor apparaatgedrag zoals ongebruikelijke datavolumes en afwijkende verbindingspatronen, kwetsbaarheidsbeoordeling voor apparaatfirmware, detectie van gecompromitteerde apparaten, analyse van industriële protocollen inclusief Modbus, DNP3, IEC 61850 en OPC, en beveiligingsaanbevelingen per apparaat. Voor organisaties die moeten voldoen aan BIO en NIS2 is het essentieel om Defender for IoT te activeren en te configureren, omdat deze service de detectiecapaciteiten biedt die nodig zijn om beveiligingsincidenten snel te identificeren en te reageren.

Monitoring, detectie en incident response voor OT-omgevingen

Gebruik PowerShell-script index.ps1 (functie Invoke-Monitoring) – Geeft een overzicht van de OT-beveiligingsstatus van de Azure-omgeving, inclusief netwerksegmentatie, toegangscontroles, Defender for IoT-status en belangrijke beveiligingsindicatoren..

Effectieve monitoring van OT-beveiliging vereist een combinatie van technische monitoringtools en organisatorische processen die specifiek zijn afgestemd op industriële omgevingen. Azure IoT Hub biedt uitgebreide logging en monitoring functionaliteit via Azure Monitor, waarbij alle device-to-cloud en cloud-to-device berichten worden gelogd, evenals device management operaties, twin updates en connection events. Deze logs kunnen worden geëxporteerd naar Azure Log Analytics voor geavanceerde analyses en correlaties met andere beveiligingsgebeurtenissen. Microsoft Defender for IoT voegt daar OT-specifieke threat detection aan toe, waarbij anomalieën in device gedrag worden gedetecteerd en waarschuwingen worden gegenereerd wanneer verdachte activiteiten worden geïdentificeerd. Voor organisaties die moeten voldoen aan BIO en NIS2 is het essentieel om deze monitoringcapaciteiten te activeren en te configureren, omdat zij de detectiecapaciteiten bieden die nodig zijn om beveiligingsincidenten snel te identificeren en te reageren.

Incident response voor OT-omgevingen vereist specifieke expertise omdat OT-systemen vaak draaien op embedded systemen met beperkte loggingcapaciteiten en omdat industriële protocollen anders werken dan traditionele IT-protocollen. Wanneer een OT-systeem wordt gecompromitteerd, moet het security team snel kunnen identificeren welk systeem is aangetast, welke data is gelekt of gemanipuleerd, en welke andere systemen mogelijk zijn gecompromitteerd. Microsoft Defender for IoT biedt gedetailleerde forensische informatie over OT-incidenten, waarbij device gedrag wordt geanalyseerd, kwetsbaarheden worden geïdentificeerd en aanbevelingen worden gegeven voor remediatie. Voor organisaties die moeten voldoen aan NIS2 is het essentieel om processen te hebben voor het melden van beveiligingsincidenten aan de bevoegde autoriteiten, waarbij OT-incidenten die impact hebben op kritieke infrastructuren binnen de vereiste tijdsframes moeten worden gemeld.

Continue verbetering van OT-beveiliging vereist een gestructureerde aanpak waarbij bevindingen uit monitoring worden vertaald naar concrete verbeteracties. Niet-conforme systemen moeten worden geanalyseerd: wat is de oorzaak (bijvoorbeeld ontbrekende netwerksegmentatie, zwakke authenticatie, of ontbrekende monitoring), wat is de impact op risico's en compliance, en wat is de beste remediatiestrategie? Sommige afwijkingen kunnen automatisch worden opgelost via Azure Policy of Defender for IoT remediation tasks, andere vereisen handmatige interventie of procesaanpassingen. Belangrijk is dat verbeteracties worden voorzien van een eigenaar, deadline en prioriteit, en dat de voortgang wordt gemonitord totdat de afwijking is opgelost. Door dit proces expliciet te maken en te koppelen aan het bredere risicomanagement- en changeproces, ontstaat een transparante keten van bevinding → analyse → maatregel → verificatie → rest-risico. Dit sluit rechtstreeks aan bij de eisen uit BIO, ISO 27001 en NIS2 rond continue verbetering en aantoonbaarheid van beheersmaatregelen.

Governance en relatie met andere OT-beveiligingsartikelen

OT-beveiliging in Azure is geen geïsoleerde discipline, maar moet worden ingebed in een breder governance-raamwerk dat enterprise architectuur, risicomanagement, security operations en change management met elkaar verbindt. Zonder duidelijke governance ontstaat het risico dat OT-beveiliging wordt gezien als een lastige verplichting die vooral tijdens audits belangrijk is, in plaats van een integraal onderdeel van de OT-strategie. Een effectief governance-model benoemt daarom expliciete rollen en verantwoordelijkheden: wie is eindverantwoordelijk voor OT-beveiliging (vaak de CISO of OT security architect), wie beheert netwerksegmentatie en toegangscontroles (vaak een OT operations team), wie voert security assessments uit (vaak interne audit of een gespecialiseerd team), en wie rapporteert richting bestuur en toezichthouders? Deze rollen worden vertaald naar concrete taken en processen die vastgelegd worden in governance-documenten, zodat zij organisatiebreed herkenbaar zijn.

Dit index-artikel moet expliciet worden gelezen in samenhang met andere OT-beveiligingsartikelen binnen de 'Nederlandse Baseline voor Veilige Cloud'. Het artikel over SCADA-beveiliging beschrijft hoe SCADA-systemen kunnen worden beveiligd met netwerksegmentatie, toegangscontroles en monitoring. Het artikel over ICS-netwerksegmentatie behandelt hoe organisaties netwerksegmentatie kunnen implementeren volgens het Purdue-model. Het artikel over OT-monitoring beschrijft hoe organisaties een volwassen monitoringproces kunnen opzetten voor industriële systemen. Het artikel over industriële beveiligingspatronen beschrijft hoe organisaties beveiligingspatronen kunnen implementeren voor verschillende typen industriële systemen. Samen vormen deze artikelen een compleet beeld: dit index-artikel schetst de overkoepelende lijnen en het governance-kader, terwijl de deelartikelen verdieping bieden op specifieke OT-beveiligingsaspecten en technische implementaties.

Voor auditors en toezichthouders is vooral van belang dat de samenhang tussen beleid, technische configuraties, monitoring en remediatie aantoonbaar is. Dat betekent dat u niet alleen OT-beveiligingsdocumenten en procesbeschrijvingen beschikbaar heeft, maar ook concreet kunt laten zien welke Azure-configuraties zijn toegepast, hoe netwerksegmentatie is geïmplementeerd, hoe toegangscontroles zijn geconfigureerd, en hoe Defender for IoT is geactiveerd. De in dit domein beschreven PowerShell-scripts – waaronder het index-script bij dit artikel en de scripts voor specifieke OT-beveiligingsaspecten – helpen om deze informatie snel en reproduceerbaar te verzamelen. Door hun output te koppelen aan dashboards en rapportages wordt OT-beveiliging niet beperkt tot papieren documenten, maar ondersteund door actuele operationele data die aantoonbaar maakt dat het OT-beveiligingsraamwerk daadwerkelijk wordt nageleefd, gemonitord en verbeterd. Dit vormt de basis voor vertrouwen bij toezichthouders en het bestuur, en helpt om OT-beveiliging te positioneren als een proactieve, waarde-toevoegende activiteit in plaats van een reactieve, lastige verplichting.

Remediatie en volwassenwording van Azure OT-beveiliging

Gebruik PowerShell-script index.ps1 (functie Invoke-Remediation) – Genereert overzichten van OT-beveiligingshiaten en biedt handvatten voor gerichte verbeteracties om de OT-beveiligingsvolwassenheid te verhogen..

Remediatie binnen het Azure OT-beveiligingsdomein betekent in de praktijk dat u gaten dicht tussen de gewenste OT-beveiligingsstatus en de werkelijkheid. In veel organisaties bestaan al wel beleidsdocumenten over OT-beveiliging, maar ontbreekt concrete vastlegging van hoe deze worden vertaald naar Azure-configuraties, welke netwerksegmentatie daadwerkelijk is geïmplementeerd, hoe toegangscontroles zijn geconfigureerd, en hoe OT-beveiliging wordt gemonitord en verbeterd. Het index-script ondersteunt remediatie door automatisch te inventariseren waar OT-beveiligingsvereisten niet worden nageleefd, waar belangrijke configuraties ontbreken, waar Defender for IoT niet is geactiveerd, en waar documentatie verouderd of incompleet is. Op basis van deze inventarisatie kunnen gerichte verbeteracties worden gepland en uitgevoerd, waarbij prioriteit wordt gegeven aan de meest kritieke hiaten die de grootste impact hebben op risico's en wettelijke naleving.

Een volwassen Azure OT-beveiligingsraamwerk groeit stap voor stap door continue verbetering. Na elke monitoringsronde worden de belangrijkste verbeterpunten vastgelegd, van een eigenaar voorzien en ingepland in het reguliere change- of verbeterportfolio. Denk aan het implementeren van ontbrekende netwerksegmentatie volgens het Purdue Model, het activeren van Defender for IoT, het verbeteren van toegangscontroles en multi-factor authenticatie, het invoeren van gestructureerde monitoringprocessen, het verbeteren van OT-beveiligingsrapportages en dashboards, het actualiseren van OT-beveiligingsdocumentatie, of het invoeren van geautomatiseerde remediation workflows. Door de resultaten van het index-script te combineren met de uitkomsten van gespecialiseerde scripts voor specifieke OT-beveiligingsaspecten ontstaat een integraal beeld van de voortgang. Uiteindelijk wordt Azure OT-beveiliging zo niet alleen een set van technische configuraties en processen, maar een aantoonbaar beheerst en verantwoord ingericht raamwerk dat continu wordt geëvalueerd en verbeterd om te blijven voldoen aan veranderende eisen, dreigingen en regelgeving.

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 Overzichtsmonitoring en remediatie voor Azure OT Security-status .DESCRIPTION Geeft een samenvattend beeld van de OT-beveiligingsstatus van de Azure-omgeving, inclusief netwerksegmentatie, toegangscontroles, Defender for IoT-status en belangrijke beveiligingsindicatoren. Ondersteunt het gericht identificeren en dichten van OT-beveiligingshiaten. .NOTES Filename: index.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-27 Last Modified: 2025-01-27 Version: 1.0 Related JSON: content/azure/ot-security/index.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\index.ps1 -Monitoring Toont een samenvattend overzicht van Azure OT-beveiligingsstatus en belangrijke indicatoren. .EXAMPLE .\index.ps1 -Remediation Genereert een overzicht van OT-beveiligingshiaten en biedt handvatten voor verbeteracties. #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.IotHub, Az.Security, Az.Network [CmdletBinding()] param( [Parameter(HelpMessage = "Voer een samenvattende monitoring uit van de Azure OT-beveiligingsstatus.")] [switch]$Monitoring, [Parameter(HelpMessage = "Genereer remediatie-overzichten en handvatten voor OT-beveiligingsverbeteringen.")] [switch]$Remediation, [Parameter(HelpMessage = "Toon welke acties zouden worden uitgevoerd zonder daadwerkelijk te wijzigen.")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' function Get-RepositoryRoot { <# .SYNOPSIS Bepaalt de rootmap van de repository op basis van de locatie van dit script. .OUTPUTS String met pad naar repository-root. #> [CmdletBinding()] param() $root = Resolve-Path (Join-Path $PSScriptRoot "..\..\..") -ErrorAction SilentlyContinue if (-not $root) { throw "Kon de repository-root niet bepalen op basis van PSScriptRoot: $PSScriptRoot" } return $root.Path } function Get-OTSecurityInventory { <# .SYNOPSIS Stelt een overzicht op van Azure OT-beveiligingsgerelateerde JSON- en PS1-bestanden. .OUTPUTS PSCustomObject met aantallen en details. #> [CmdletBinding()] param() $repoRoot = Get-RepositoryRoot $contentRoot = Join-Path $repoRoot "content\azure\ot-security" $codeRoot = Join-Path $repoRoot "code\azure\ot-security" $jsonFiles = @() if (Test-Path -Path $contentRoot) { $jsonFiles = Get-ChildItem -Path $contentRoot -Filter "*.json" -File -ErrorAction SilentlyContinue } $ps1Files = @() if (Test-Path -Path $codeRoot) { $ps1Files = Get-ChildItem -Path $codeRoot -Filter "*.ps1" -File -ErrorAction SilentlyContinue } $byName = @{} foreach ($json in $jsonFiles) { $base = [System.IO.Path]::GetFileNameWithoutExtension($json.Name) if (-not $byName.ContainsKey($base)) { $byName[$base] = [pscustomobject]@{ Name = $base JsonPath = $null JsonUpdated = $null ScriptPath = $null ScriptUpdated= $null } } $entry = $byName[$base] $entry.JsonPath = $json.FullName $entry.JsonUpdated = $json.LastWriteTime $byName[$base] = $entry } foreach ($ps1 in $ps1Files) { $base = [System.IO.Path]::GetFileNameWithoutExtension($ps1.Name) if (-not $byName.ContainsKey($base)) { $byName[$base] = [pscustomobject]@{ Name = $base JsonPath = $null JsonUpdated = $null ScriptPath = $null ScriptUpdated= $null } } $entry = $byName[$base] $entry.ScriptPath = $ps1.FullName $entry.ScriptUpdated = $ps1.LastWriteTime $byName[$base] = $entry } $items = $byName.Values | Sort-Object Name $missingJson = $items | Where-Object { -not $_.JsonPath } $missingScript = $items | Where-Object { -not $_.ScriptPath } return [pscustomobject]@{ RepositoryRoot = $repoRoot Items = $items MissingJson = $missingJson MissingScripts = $missingScript TotalControls = $items.Count WithJsonAndPs1 = ($items | Where-Object { $_.JsonPath -and $_.ScriptPath }).Count } } function Test-AzureConnection { <# .SYNOPSIS Controleert of er een actieve Azure-verbinding bestaat. .OUTPUTS Boolean: $true als verbonden, anders $false #> [CmdletBinding()] param() try { $context = Get-AzContext -ErrorAction Stop if ($context) { Write-Verbose "Azure-verbinding actief: $($context.Account.Id) in tenant $($context.Tenant.Id)" return $true } return $false } catch { Write-Verbose "Geen actieve Azure-verbinding: $_" return $false } } function Get-AzureOTSecurityStatus { <# .SYNOPSIS Inventariseert de OT-beveiligingsstatus van de Azure-omgeving. .OUTPUTS PSCustomObject met OT-beveiligingsstatus. #> [CmdletBinding()] param() $isConnected = Test-AzureConnection if (-not $isConnected) { Write-Warning "Geen actieve Azure-verbinding. Alleen repository-inventarisatie wordt uitgevoerd." return [pscustomobject]@{ AzureConnected = $false IoTHubs = 0 DefenderForIoTEnabled = $false OTNetworksSegmented = 0 TotalOTNetworks = 0 } } try { Write-Verbose "Inventariseren van Azure OT-beveiligingsstatus..." $subscriptions = @() try { $subscriptions = Get-AzSubscription -ErrorAction SilentlyContinue | Where-Object { $_.State -eq 'Enabled' } } catch { Write-Verbose "Kon subscriptions niet ophalen: $_" } $totalIoTHubs = 0 $defenderForIoTEnabled = $false $totalOTNetworks = 0 $otNetworksSegmented = 0 foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction SilentlyContinue | Out-Null try { # Haal IoT Hubs op $iotHubs = Get-AzIotHub -ErrorAction SilentlyContinue $totalIoTHubs += $iotHubs.Count # Controleer of Defender for IoT is ingeschakeld try { $defenderSettings = Get-AzSecurityPricing -Name "IoT" -ErrorAction SilentlyContinue if ($defenderSettings -and $defenderSettings.PricingTier -ne 'Free') { $defenderForIoTEnabled = $true } } catch { Write-Verbose "Kon Defender for IoT status niet ophalen (mogelijk niet geconfigureerd): $_" } # Identificeer OT-gerelateerde virtuele netwerken $vnets = Get-AzVirtualNetwork -ErrorAction SilentlyContinue foreach ($vnet in $vnets) { $otKeywords = @('ot', 'scada', 'ics', 'industrial', 'plc', 'hmi', 'historian') $vnetName = $vnet.Name.ToLower() $tags = $vnet.Tags $isOTNetwork = $false # Check tags if ($tags) { foreach ($key in $tags.Keys) { $value = $tags[$key].ToString().ToLower() foreach ($keyword in $otKeywords) { if ($value -match $keyword -or $key.ToLower() -match $keyword) { $isOTNetwork = $true break } } if ($isOTNetwork) { break } } } # Check name patterns if (-not $isOTNetwork) { foreach ($keyword in $otKeywords) { if ($vnetName -match $keyword) { $isOTNetwork = $true break } } } if ($isOTNetwork) { $totalOTNetworks++ # Check if segmented (has multiple subnets and NSGs) if ($vnet.Subnets.Count -ge 2) { $hasNSG = $false foreach ($subnet in $vnet.Subnets) { if ($subnet.NetworkSecurityGroup) { $hasNSG = $true break } } if ($hasNSG) { $otNetworksSegmented++ } } } } } catch { Write-Verbose "Kon OT-beveiligingsstatus voor subscription '$($sub.Name)' niet ophalen: $_" } } return [pscustomobject]@{ AzureConnected = $true IoTHubs = $totalIoTHubs DefenderForIoTEnabled = $defenderForIoTEnabled OTNetworksSegmented = $otNetworksSegmented TotalOTNetworks = $totalOTNetworks } } catch { Write-Warning "Fout bij inventariseren van Azure OT-beveiligingsstatus: $_" return [pscustomobject]@{ AzureConnected = $false IoTHubs = 0 DefenderForIoTEnabled = $false OTNetworksSegmented = 0 TotalOTNetworks = 0 } } } function Invoke-Monitoring { <# .SYNOPSIS Voert een samenvattende monitoring uit van Azure OT-beveiligingsstatus. .OUTPUTS PSCustomObject met overzichtsresultaten. #> [CmdletBinding()] param() Write-Host "`nMonitoring: Azure OT Security overzicht" -ForegroundColor Yellow Write-Host "=========================================" -ForegroundColor Yellow $inventory = Get-OTSecurityInventory $otStatus = Get-AzureOTSecurityStatus Write-Host "`nRepository-root: $($inventory.RepositoryRoot)" -ForegroundColor Cyan Write-Host "Totaal Azure OT security controls (JSON/PS1-combinaties): $($inventory.TotalControls)" -ForegroundColor Cyan Write-Host "Volledig gekoppeld (JSON + PS1): $($inventory.WithJsonAndPs1)" -ForegroundColor Cyan if ($otStatus.AzureConnected) { Write-Host "`nAzure OT-beveiligingsstatus:" -ForegroundColor Cyan Write-Host " IoT Hubs gevonden: $($otStatus.IoTHubs)" -ForegroundColor Gray Write-Host " OT-netwerken geïdentificeerd: $($otStatus.TotalOTNetworks)" -ForegroundColor Gray Write-Host " OT-netwerken met segmentatie: $($otStatus.OTNetworksSegmented) / $($otStatus.TotalOTNetworks)" -ForegroundColor $(if ($otStatus.OTNetworksSegmented -eq $otStatus.TotalOTNetworks -and $otStatus.TotalOTNetworks -gt 0) { 'Green' } else { 'Yellow' }) if ($otStatus.DefenderForIoTEnabled) { Write-Host " Defender for IoT: INGESCHAKELD" -ForegroundColor Green } else { Write-Host " Defender for IoT: UITGESCHAKELD of niet geconfigureerd" -ForegroundColor Yellow } } else { Write-Host "`n⚠️ Geen actieve Azure-verbinding. Verbind met Connect-AzAccount voor volledige OT-beveiligingsmonitoring." -ForegroundColor Yellow } if ($inventory.MissingJson.Count -gt 0) { Write-Host "`n❌ Ontbrekende JSON voor de volgende scripts:" -ForegroundColor Red foreach ($item in $inventory.MissingJson) { Write-Host " - $($item.Name) (script: $($item.ScriptPath))" -ForegroundColor Red } } if ($inventory.MissingScripts.Count -gt 0) { Write-Host "`n❌ Ontbrekende PS1-scripts voor de volgende JSON-bestanden:" -ForegroundColor Red foreach ($item in $inventory.MissingScripts) { Write-Host " - $($item.Name) (json: $($item.JsonPath))" -ForegroundColor Red } } if (($inventory.MissingJson.Count -eq 0) -and ($inventory.MissingScripts.Count -eq 0)) { Write-Host "`n✅ Alle Azure OT-beveiligingsartikelen hebben zowel JSON als PS1." -ForegroundColor Green } else { Write-Host "`n⚠️ Er zijn nog hiaten in de JSON/PS1-koppeling voor Azure OT-beveiliging." -ForegroundColor Yellow Write-Host " Gebruik -Remediation om gericht met deze hiaten aan de slag te gaan." -ForegroundColor Yellow } # OT-beveiliging evaluatie $isCompliant = $true if ($otStatus.AzureConnected) { if ($otStatus.IoTHubs -gt 0 -and -not $otStatus.DefenderForIoTEnabled) { $isCompliant = $false Write-Host "`n⚠️ IoT Hubs gevonden maar Defender for IoT is niet ingeschakeld. Activeer Defender for IoT voor threat detection." -ForegroundColor Yellow } if ($otStatus.TotalOTNetworks -gt 0 -and $otStatus.OTNetworksSegmented -lt $otStatus.TotalOTNetworks) { $isCompliant = $false Write-Host "`n⚠️ OT-netwerken gevonden maar niet alle zijn gesegmenteerd. Implementeer netwerksegmentatie volgens het Purdue Model." -ForegroundColor Yellow } if ($otStatus.TotalOTNetworks -eq 0 -and $otStatus.IoTHubs -eq 0) { Write-Host "`nℹ️ Geen OT-systemen of IoT Hubs gevonden in deze omgeving." -ForegroundColor Cyan } } return [pscustomobject]@{ Inventory = $inventory OTSecurityStatus = $otStatus IsCompliant = $isCompliant } } function Invoke-Remediation { <# .SYNOPSIS Ondersteunt remediatie door OT-beveiligingshiaten inzichtelijk te maken en handvatten te bieden voor verbeteracties. .OUTPUTS PSCustomObject met remediatieadvies. #> [CmdletBinding()] param() Write-Host "`nRemediatie: Azure OT Security verbetering" -ForegroundColor Yellow Write-Host "==========================================" -ForegroundColor Yellow $inventory = Get-OTSecurityInventory $otStatus = Get-AzureOTSecurityStatus $repoRoot = $inventory.RepositoryRoot $actions = @() Write-Host "`nOT-beveiligingshiaten analyse:" -ForegroundColor Cyan if ($otStatus.AzureConnected) { if ($otStatus.IoTHubs -gt 0 -and -not $otStatus.DefenderForIoTEnabled) { $action = [pscustomobject]@{ Priority = "High" Issue = "Defender for IoT niet ingeschakeld" Count = $otStatus.IoTHubs Recommendation = "Activeer Microsoft Defender for IoT op subscriptions met IoT Hubs voor geavanceerde threat detection en kwetsbaarheidsbeoordeling." } $actions += $action Write-Host " ❌ $($action.Issue): $($action.Count) IoT Hub(s)" -ForegroundColor Red Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } if ($otStatus.TotalOTNetworks -gt 0 -and $otStatus.OTNetworksSegmented -lt $otStatus.TotalOTNetworks) { $action = [pscustomobject]@{ Priority = "High" Issue = "OT-netwerken niet gesegmenteerd" Count = $otStatus.TotalOTNetworks - $otStatus.OTNetworksSegmented Recommendation = "Implementeer netwerksegmentatie volgens het Purdue Model om OT-systemen te isoleren van IT-netwerken." } $actions += $action Write-Host " ❌ $($action.Issue): $($action.Count) netwerk(en)" -ForegroundColor Red Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } if ($otStatus.TotalOTNetworks -eq 0 -and $otStatus.IoTHubs -eq 0) { Write-Host " ℹ️ Geen OT-systemen of IoT Hubs gevonden" -ForegroundColor Cyan Write-Host " → Als u OT-systemen heeft, zorg ervoor dat deze correct zijn getagd of benoemd" -ForegroundColor Gray } } else { Write-Host " ⚠️ Verbind met Azure voor gedetailleerde OT-beveiligingsanalyse" -ForegroundColor Yellow } if ($inventory.MissingJson.Count -gt 0 -or $inventory.MissingScripts.Count -gt 0) { Write-Host "`nRepository-hiaten:" -ForegroundColor Cyan Write-Host (" Items zonder JSON: {0}" -f $inventory.MissingJson.Count) -ForegroundColor Cyan Write-Host (" Items zonder script: {0}" -f $inventory.MissingScripts.Count) -ForegroundColor Cyan Write-Host " → Werk deze hiaten bij om het OT-beveiligingsraamwerk compleet te maken." -ForegroundColor Gray } Write-Host "`nVolgende stappen:" -ForegroundColor Cyan Write-Host "1. Activeer Microsoft Defender for IoT op alle subscriptions met IoT Hubs" -ForegroundColor White Write-Host "2. Implementeer netwerksegmentatie volgens het Purdue Model voor OT-netwerken" -ForegroundColor White Write-Host "3. Configureer strikte toegangscontroles en multi-factor authenticatie voor OT-systemen" -ForegroundColor White Write-Host "4. Implementeer monitoring en logging voor alle OT-activiteiten" -ForegroundColor White Write-Host "5. Beveilig industriële protocollen met deep packet inspection en protocol-aware firewalls" -ForegroundColor White Write-Host "6. Voer regelmatige OT-beveiligingsassessments uit" -ForegroundColor White return [pscustomobject]@{ Actions = $actions Inventory = $inventory OTSecurityStatus = $otStatus } } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure OT Security Overzichtsmonitor" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan if ($Monitoring) { $result = Invoke-Monitoring if ($result.IsCompliant) { exit 0 } else { exit 1 } } elseif ($Remediation) { Invoke-Remediation | Out-Null } else { # Standaard: compacte OT-beveiligingscheck via monitoring $result = Invoke-Monitoring if ($result.IsCompliant -and ($result.Inventory.MissingJson.Count -eq 0) -and ($result.Inventory.MissingScripts.Count -eq 0)) { Write-Host "`n✅ COMPLIANT" -ForegroundColor Green exit 0 } else { Write-Host "`n❌ NON-COMPLIANT" -ForegroundColor Red Write-Host "Run met -Monitoring voor gedetailleerde rapportage" -ForegroundColor Yellow Write-Host "Run met -Remediation voor gericht verbeteradvies" -ForegroundColor Yellow exit 1 } } } catch { Write-Error "Er is een fout opgetreden in index.ps1: $_" exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Critical: Zonder een volwassen OT-beveiligingsraamwerk in Azure ontstaat het risico dat organisaties niet kunnen aantonen dat zij voldoen aan BIO, NIS2, AVG en andere relevante wet- en regelgeving voor kritieke infrastructuren. OT-systemen vormen een zeer aantrekkelijk doelwit voor cyberaanvallen omdat een succesvolle aanval kan leiden tot directe controle over fysieke processen met potentieel catastrofale gevolgen voor veiligheid, milieu en maatschappij. Het ontbreken van adequate OT-beveiliging kan leiden tot laterale beweging vanuit IT-netwerken naar OT-netwerken, ongeautoriseerde toegang tot HMI's, kwaadaardige commando's naar PLC's, of zelfs volledige compromittering van de OT-infrastructuur. Dit kan resulteren in boetes, verplichte herstelmaatregelen, reputatieschade, verlies van vertrouwen bij burgers en bestuurlijke aansprakelijkheid bij incidenten.

Management Samenvatting

Azure OT-beveiliging vereist een samenhangend raamwerk dat netwerksegmentatie volgens het Purdue Model, beveiliging van industriële protocollen, strikte toegangscontroles, multi-factor authenticatie, threat detection en incident response integreert. Dit index-artikel fungeert als centrale verzamelplaats voor OT-beveiligingsartikelen en beschrijft governance, implementatie, monitoring en continue verbetering van OT-beveiliging in Azure-omgevingen.