OT Monitoring Voor Industriële Systemen In Azure

💼 Management Samenvatting

OT monitoring in Azure vormt een kritieke beveiligings- en operationele randvoorwaarde voor industriële controlesystemen en operationele technologie (OT) omgevingen. In tegenstelling tot traditionele IT-monitoring, vereist OT-monitoring een diepgaand begrip van industriële protocollen, real-time procesvereisten en de unieke karakteristieken van operationele technologie die essentieel zijn voor de continuïteit, veiligheid en betrouwbaarheid van industriële processen en kritieke infrastructuur.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
180u (tech: 100u)
Van toepassing op:
Azure
Industriële systemen
OT omgevingen
SCADA systemen
IoT devices

Industriële controlesystemen en OT-omgevingen vormen een fundamenteel onderdeel van de Nederlandse kritieke infrastructuur, waaronder energiecentrales, waterzuiveringsinstallaties, productiefaciliteiten, transportnetwerken en slimme steden. Deze systemen hebben unieke monitoringvereisten omdat zij niet alleen gevoelige data verwerken, maar ook directe controle uitoefenen over fysieke processen die kunnen leiden tot veiligheidsincidenten, milieuschade, productieverlies of maatschappelijke ontwrichting wanneer zij falen of worden gecompromitteerd. Traditionele IT-monitoringtools en -methoden zijn onvoldoende voor OT-omgevingen omdat deze niet rekening houden met industriële protocollen zoals Modbus, DNP3, IEC 61850, OPC Classic en OPC UA, die specifieke monitoringconfiguraties vereisen en die kwetsbaar zijn voor aanvallen die niet voorkomen in traditionele IT-omgevingen. Zonder adequate OT-specifieke monitoring kunnen organisaties niet tijdig detecteren wanneer industriële systemen worden aangevallen, wanneer configuratiefouten optreden die productieprocessen kunnen beïnvloeden, of wanneer operationele problemen ontstaan die kunnen leiden tot veiligheidsincidenten of milieuschade. Voor Nederlandse organisaties die kritieke infrastructuur beheren, is het ontbreken van adequate OT-monitoring bovendien een directe schending van de NIS2-richtlijn en de Baseline Informatiebeveiliging Overheid (BIO) normen, wat kan resulteren in aanzienlijke boetes, reputatieschade en mogelijke aansprakelijkheid bij incidenten.

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

Implementatie

OT monitoring in Azure betekent het implementeren van een samenhangend monitoringraamwerk dat specifiek is afgestemd op industriële omgevingen en dat gebruik maakt van Azure-services zoals Azure IoT Hub voor het verbinden en beheren van industriële apparaten, Azure Monitor en Log Analytics voor het verzamelen en analyseren van industriële telemetrie en logs, Azure Sentinel met ICS-specifieke analytics voor beveiligingsmonitoring, en Azure Time Series Insights voor het analyseren van tijdreeksdata van industriële sensoren en systemen. OT-monitoring moet niet alleen technische metrische gegevens verzamelen zoals CPU-gebruik, geheugengebruik en netwerkverkeer, maar vooral ook industriële procesgegevens zoals sensorwaarden, procesvariabelen, commando's die worden verzonden naar PLC's en RTU's, en de status van kritieke industriële componenten. Monitoring moet ook rekening houden met de unieke karakteristieken van OT-omgevingen, zoals de noodzaak voor deterministische monitoring met lage latentie voor real-time procesbewaking, de vereisten voor lange bewaartermijnen voor compliance en forensische doeleinden, en de kritieke behoefte aan beschikbaarheid en betrouwbaarheid die vaak belangrijker zijn dan vertrouwelijkheid in industriële omgevingen. OT-monitoring moet bovendien in staat zijn om industriële protocolverkeer te analyseren en te detecteren wanneer kwaadaardige of ongeautoriseerde commando's worden verzonden die kritieke industriële processen kunnen beïnvloeden, en moet waarschuwingen genereren wanneer afwijkende communicatiepatronen worden gedetecteerd die kunnen wijzen op aanvallen, configuratiefouten of operationele problemen.

Vereisten en ontwerpprincipes

De implementatie van OT-monitoring in Azure vereist een uitgebreide voorbereiding die verder gaat dan traditionele IT-monitoring, omdat industriële omgevingen unieke technische, operationele en compliance-vereisten hebben die specifieke expertise en zorgvuldige planning vereisen. Organisaties die OT-monitoring willen implementeren moeten eerst een grondige analyse uitvoeren van hun industriële architectuur, waarbij zij identificeren welke industriële systemen, protocollen en processen zij hebben, hoe deze met elkaar communiceren, welke monitoringvereisten van toepassing zijn voor elk systeem, en welke specifieke beveiligings- en compliance-vereisten gelden voor hun sector en type kritieke infrastructuur. Deze analyse moet niet alleen technische aspecten omvatten, maar ook operationele, veiligheids- en compliance-gerelateerde overwegingen die uniek zijn voor industriële omgevingen. Organisaties moeten begrijpen dat OT-monitoring niet alleen een beveiligingsmaatregel is, maar ook een operationele maatregel die directe impact kan hebben op de beschikbaarheid, betrouwbaarheid en veiligheid van industriële processen, en dat foutieve implementatie kan leiden tot productiestilstand, veiligheidsincidenten of milieuschade. Daarom is het essentieel dat OT-monitoring wordt geïmplementeerd in nauwe samenwerking met operationele teams, procesingenieurs en veiligheidsfunctionarissen die volledig begrijpen hoe industriële systemen werken en welke monitoringvereisten essentieel zijn voor de continuïteit van industriële processen.

Een fundamenteel ontwerpprincipe voor OT-monitoring is volledigheid van zichtbaarheid op alle kritieke industriële componenten. Dit betekent dat alle bedrijfskritieke industriële systemen – denk aan PLC's, RTU's, SCADA-systemen, HMI's, industriële gateways en IoT-sensoren – moeten worden aangesloten op het monitoringraamwerk, zodat organisaties in real-time kunnen zien wat er gebeurt in hun industriële omgevingen. In Azure wordt dit doorgaans gerealiseerd via Azure IoT Hub, dat fungeert als centrale gateway voor het verbinden en beheren van industriële apparaten, en via Azure Monitor en Log Analytics, waarin industriële telemetrie, logs en beveiligingsgebeurtenissen samenkomen. Het is belangrijk om vooraf te bepalen welke industriële protocollen worden gebruikt, welke data moet worden verzameld van elk systeem, welke bewaartermijnen van toepassing zijn voor verschillende typen data, en hoe monitoringdata wordt geanalyseerd en gebruikt voor operationele besluitvorming en beveiligingsdetectie. Een ondoordachte inrichting leidt al snel tot fragmentatie, dubbele kosten, onoverzichtelijke query's en blinde vlekken in de monitoringdekking.

Een tweede ontwerpprincipe is normalisatie en standaardisatie van monitoringconfiguraties voor belangrijke industriële componenten. Door voor belangrijke industriële systemen – zoals PLC's, SCADA-systemen, industriële gateways en IoT-sensoren – standaard monitoringconfiguraties te definiëren, wordt gewaarborgd dat overal dezelfde typen telemetrie en logs worden verzameld. Dit vergemakkelijkt niet alleen analyse en correllatie, maar maakt het ook eenvoudiger om normenkaders als de BIO of ISO 27001 te vertalen naar concrete monitoringcontrolepunten. Wanneer bijvoorbeeld is afgesproken dat alle beheerhandelingen binnen een bepaalde businesskritieke keten herleidbaar moeten zijn, kan in de standaard monitoringconfiguratie worden vastgelegd dat auditlogs van beheerders altijd naar een centrale, alleen-lezen Log Analytics-workspace worden gestuurd. Standaardisatie helpt ook om consistentie te waarborgen tussen verschillende industriële sites en faciliteiten, waardoor organisaties kunnen benchmarken en best practices kunnen delen.

Het derde ontwerpprincipe is actiegerichtheid. Monitoring heeft alleen waarde als signalen leiden tot concrete opvolging. Dat betekent dat bij het definiëren van wat er gemonitord wordt, direct wordt nagedacht over wie verantwoordelijkheid draagt voor welke signalen, binnen welke termijn wordt gereageerd en hoe escalatie verloopt als een signaal te lang open blijft staan. In Azure vertaalt zich dit naar een duidelijke toewijzing van alerts aan specifieke teams of functies, het vastleggen van drempelwaarden die passen bij de risicoacceptatie van de organisatie en het koppelen van alerts aan ITSM-processen. Bijvoorbeeld: een kritieke alert op een ongeautoriseerd commando dat wordt verzonden naar een PLC in een vitale keten moet sneller geadresseerd worden dan een waarschuwing over een tijdelijk overschreden drempelwaarde voor een niet-kritieke sensor. OT-monitoring moet ook rekening houden met de unieke karakteristieken van industriële omgevingen, zoals de noodzaak voor deterministische monitoring met lage latentie voor real-time procesbewaking, waarbij alerts binnen seconden moeten worden gegenereerd en doorgestuurd naar operationele teams die direct kunnen ingrijpen wanneer kritieke industriële processen worden bedreigd.

Een vierde ontwerpprincipe is aantoonbaarheid richting toezichthouders en auditors. Toezichthouders, rekenkamers en interne audit vragen niet alleen of monitoring is ingericht, maar ook hoe is vastgesteld dat deze inrichting effectief is. OT-monitoring moet daarom evidence opleveren: logische documentatie van architectuurkeuzes, configuratie-overzichten, rapportages met trendanalyses en onderbouwde beslissingen rond acceptatie van rest-risico's. Voor Nederlandse organisaties die kritieke infrastructuur beheren komt hierbij de verplichting om te kunnen aantonen dat OT-monitoring voldoet aan de eisen van de NIS2-richtlijn en de Baseline Informatiebeveiliging Overheid. De NIS2-richtlijn vereist dat essentiële en belangrijke entiteiten passende maatregelen nemen om de beschikbaarheid, integriteit en vertrouwelijkheid van hun netwerken en informatiesystemen te waarborgen, inclusief monitoring en detectie van beveiligingsincidenten. De BIO bevat in norm 09.01.02 specifieke eisen aan monitoring en logging, en organisaties moeten kunnen aantonen dat hun OT-monitoring volledig voldoet aan deze eisen. Door deze elementen vanaf het begin onderdeel te maken van het ontwerp, wordt voorkomen dat monitoring later alsnog als een losse technische component wordt behandeld, los van het governance- en verantwoordingstraject.

Technische implementatie in Azure

Gebruik PowerShell-script ot-monitoring.ps1 (functie Invoke-Monitoring) – Voert een kerngezondheidscontrole uit op de belangrijkste OT-monitoringcomponenten in Azure en rapporteert de status per IoT Hub en industriële omgeving..

De technische implementatie van OT-monitoring in Azure begint bij het inrichten van een robuuste gegevensstroom: van industriële apparaten naar Azure IoT Hub, van IoT Hub naar Log Analytics-workspaces voor analyse, en van Log Analytics naar Azure Sentinel voor beveiligingsmonitoring en correllatie. In de praktijk betekent dit dat voor alle relevante industriële apparaten – PLC's, RTU's, SCADA-systemen, HMI's, industriële gateways en IoT-sensoren – verbindingen worden geconfigureerd met Azure IoT Hub, dat fungeert als centrale gateway voor het verbinden, beheren en monitoren van industriële apparaten. Azure IoT Hub biedt ondersteuning voor verschillende industriële protocollen via protocol gateways en biedt ingebouwde beveiligingsfuncties zoals device authentication, device-to-cloud en cloud-to-device messaging, en device management. Voor Nederlandse overheidsorganisaties is het hierbij essentieel om rekening te houden met data-classificatie en datalocatie: gevoelige of bijzondere persoonsgegevens moeten conform AVG- en BIO-richtlijnen worden opgeslagen, bij voorkeur binnen EU-regio's en met passende toegangscontrole.

Een belangrijk startpunt is het definiëren van één of enkele centrale Log Analytics-workspaces voor OT-monitoring en beveiliging. In deze workspaces komen onder andere industriële telemetrie van Azure IoT Hub, beveiligingslogs van industriële systemen, netwerkverkeerlogs van industriële netwerken, en Defender for IoT-signalen samen. Door gebruik te maken van workspace-templates of Infrastructure as Code (Terraform/Bicep) kan de inrichting van workspaces, datacollectieregels en retentieperioden herhaalbaar en beheersbaar worden gemaakt. Veel organisaties hanteren bijvoorbeeld een retentie van 365 dagen voor operationele analyse en een aanvullende export naar een opslagaccount of Azure Data Explorer voor archivering met langere bewaartermijnen, conform compliance-vereisten zoals de Archiefwet voor overheidsorganisaties. Het is belangrijk om vooraf te bepalen hoe deze workspaces logisch worden ingedeeld: bijvoorbeeld per omgeving (ontwikkel, test, productie), per industriële site of faciliteit, of per domein (energie, water, transport). Een ondoordachte inrichting leidt al snel tot fragmentatie, dubbele kosten en onoverzichtelijke query's.

Vervolgens worden per industriële apparaattype de benodigde monitoringconfiguraties ingericht. Voor een PLC kunnen bijvoorbeeld procesvariabelen, commando's en statusinformatie worden verzameld, terwijl voor een SCADA-systeem vooral supervisie- en controlelogs relevant zijn. Voor industriële gateways kunnen netwerkverkeerlogs en protocolconversielogs worden verzameld. Door deze configuraties in Infrastructure as Code of deployment-sjablonen op te nemen, wordt geborgd dat nieuwe industriële apparaten automatisch in de monitoring worden opgenomen. Dit voorkomt dat nieuwe OT-workloads onbewust buiten het zicht van SOC of beheerorganisatie vallen. In sectoren met hoge beschikbaarheidseisen, zoals energie of water, is dit cruciaal om verstoringen of aanvallen snel te detecteren. Azure IoT Hub biedt verschillende ingebouwde monitoringfuncties, zoals device-to-cloud telemetrie, device twins voor het synchroniseren van device state, en direct methods voor het aanroepen van functies op devices. Deze functies moeten worden geconfigureerd om de benodigde industriële data te verzamelen en te monitoren.

Bovenop de datacollectie worden alertregels ingericht die specifiek zijn afgestemd op industriële omgevingen. Azure Monitor biedt hiervoor metric alerts, log alerts en activity log alerts. Metric alerts zijn geschikt voor directe technische signalen, zoals CPU- of geheugengebruik van industriële gateways, responstijden van SCADA-systemen, of het aantal verbonden IoT-devices. Log alerts worden gebruikt om complexere patronen te detecteren, bijvoorbeeld herhaalde ongeautoriseerde commando's die worden verzonden naar PLC's, afwijkende communicatiepatronen tussen industriële systemen, of configuratiewijzigingen in kritieke industriële resources. Activity log alerts kunnen worden ingezet om beheeracties op IoT Hub-niveau te bewaken, zoals het uitschakelen van beveiligingsfuncties of wijzigingen in device-toegangsrechten. Door deze alerts te koppelen aan action groups – e-mail, sms, webhook, ITSM-connector of automation runbooks – wordt gegarandeerd dat relevante teams direct geïnformeerd worden. Voor OT-omgevingen is het belangrijk dat alerts snel worden gegenereerd en doorgestuurd, omdat industriële processen vaak real-time respons vereisen om veiligheidsincidenten of productieverlies te voorkomen.

Microsoft Defender for IoT vormt een aanvullende laag in de technische implementatie van OT-monitoring. Defender for IoT biedt gespecialiseerde beveiligingsmonitoring voor industriële omgevingen, met ondersteuning voor industriële protocollen zoals Modbus, DNP3, IEC 61850 en OPC, en met ingebouwde detectie van industriële bedreigingen zoals protocol spoofing, command injection en man-in-the-middle aanvallen. Defender for IoT kan worden geïntegreerd met Azure IoT Hub en kan worden gekoppeld aan Azure Sentinel voor geavanceerde beveiligingsanalytics en correllatie. Door Defender for IoT te activeren voor relevante industriële workloads, worden configuraties continu beoordeeld tegen best practices, en wordt aanvullende dreigingsinformatie toegevoegd. Aanbevelingen en alerts uit Defender for IoT kunnen weer worden geïntegreerd in dezelfde Log Analytics-workspaces en dashboards, waardoor er één samenhangend beeld ontstaat. Voor Nederlandse overheidsorganisaties is het verstandig om duidelijke drempels en doelen af te spreken, bijvoorbeeld een minimale monitoringdekking per industriële site of maximaal toegestane aantallen openstaande kritieke aanbevelingen. Deze doelen kunnen vervolgens worden gemonitord via KQL-query's en gevisualiseerd in werkboeken of Power BI-rapportages.

Azure Time Series Insights kan worden gebruikt voor het analyseren van tijdreeksdata van industriële sensoren en systemen. Time Series Insights is specifiek ontworpen voor het analyseren van grote volumes tijdreeksdata met lage latentie, wat essentieel is voor real-time procesbewaking in industriële omgevingen. Door industriële telemetrie naar Time Series Insights te routeren, kunnen organisaties trends analyseren, anomalieën detecteren en voorspellende analyses uitvoeren op basis van historische procesdata. Dit is waardevol voor zowel operationele optimalisatie als voor het detecteren van afwijkende patronen die kunnen wijzen op beveiligingsproblemen of operationele problemen. De bij dit artikel horende PowerShell-control, `ot-monitoring.ps1`, sluit aan op deze technische inrichting. Het script voert periodiek een kerngezondheidscheck uit op een selectie van cruciale OT-monitoringaspecten, zoals het bestaan van Azure IoT Hub-instances, de aanwezigheid van verbonden industriële apparaten, de configuratie van diagnostic settings voor IoT Hub, en basisalertregels voor industriële omgevingen. Hiermee krijgt het beheer- en securityteam in één oogopslag zicht op hiaten in de OT-monitoring en kan gericht worden bijgestuurd.

Monitoring van industriële protocollen

Een cruciaal aspect van OT-monitoring is het monitoren en analyseren van industriële protocolverkeer. Industriële protocollen zoals Modbus, DNP3, IEC 61850, OPC Classic en OPC UA zijn ontworpen voor betrouwbare en deterministische communicatie in industriële omgevingen, maar zij bevatten vaak geen ingebouwde beveiligingsmechanismen zoals encryptie of authenticatie, waardoor zij kwetsbaar zijn voor aanvallen zoals protocol spoofing, command injection en man-in-the-middle aanvallen. OT-monitoring moet daarom in staat zijn om industriële protocolverkeer te analyseren en te detecteren wanneer kwaadaardige of ongeautoriseerde commando's worden verzonden die kritieke industriële processen kunnen beïnvloeden. Dit vereist gespecialiseerde tools en expertise die specifiek zijn afgestemd op industriële omgevingen, omdat traditionele IT-security tools vaak niet geschikt zijn voor het analyseren van industriële protocollen.

Microsoft Defender for IoT biedt gespecialiseerde beveiligingsmonitoring voor industriële protocollen, met ondersteuning voor een breed scala aan industriële protocollen en met ingebouwde detectie van industriële bedreigingen. Defender for IoT kan worden geconfigureerd om industriële protocolverkeer te analyseren en te detecteren wanneer afwijkende communicatiepatronen optreden die kunnen wijzen op aanvallen, configuratiefouten of operationele problemen. Defender for IoT genereert waarschuwingen wanneer bijvoorbeeld ongeautoriseerde commando's worden verzonden naar PLC's, wanneer protocol spoofing wordt gedetecteerd, of wanneer man-in-the-middle aanvallen worden geïdentificeerd. Deze waarschuwingen kunnen worden geïntegreerd met Azure Sentinel voor geavanceerde beveiligingsanalytics en correllatie, en kunnen worden gekoppeld aan automation runbooks voor automatische respons.

Naast Defender for IoT kunnen organisaties ook gebruik maken van Azure Network Watcher voor het monitoren van netwerkverkeer in industriële omgevingen. Network Watcher biedt functies zoals packet capture, connection troubleshoot en flow logs die kunnen worden gebruikt om industriële netwerkverkeer te analyseren en te detecteren wanneer afwijkende communicatiepatronen optreden. Flow logs kunnen worden geconfigureerd om netwerkverkeer te loggen tussen verschillende industriële netwerksegmenten, en kunnen worden geanalyseerd met KQL-query's in Log Analytics om afwijkende patronen te identificeren. Dit is waardevol voor het detecteren van laterale beweging door aanvallers, het identificeren van ongeautoriseerde communicatie tussen netwerksegmenten, en het monitoren van netwerkprestaties in industriële omgevingen.

Een belangrijk onderdeel van industriële protocolmonitoring is het creëren van een baseline van normale industriële netwerkactiviteit, zodat organisaties kunnen identificeren wanneer er ongebruikelijke patronen optreden die mogelijk wijzen op beveiligingsproblemen of configuratiefouten. Deze baseline moet worden ontwikkeld door uitgebreide analyse van netwerkverkeer over een langere periode, waarbij wordt geïdentificeerd welke industriële protocollen normaal worden gebruikt, welke communicatiepatronen normaal zijn tussen verschillende industriële systemen, welke commando's normaal worden verzonden naar industriële systemen, en welke tijdsintervallen normaal zijn voor verschillende typen communicatie. Zodra een baseline is vastgesteld, kunnen monitoringtools worden geconfigureerd om waarschuwingen te genereren wanneer afwijkende patronen worden gedetecteerd, zoals ongebruikelijke communicatie tussen industriële systemen die normaal niet met elkaar communiceren, industriële protocolcommando's die niet normaal zijn voor specifieke systemen, of communicatiepatronen die kunnen wijzen op man-in-the-middle aanvallen of protocol spoofing. Deze waarschuwingen moeten worden geëscaleerd naar operationele teams en beveiligingsfunctionarissen die kunnen evalueren of de afwijkingen wijzen op beveiligingsproblemen of configuratiefouten die moeten worden opgelost.

Operationele verankering, rapportage en governance

Wanneer de technische basis voor OT-monitoring staat, verschuift de aandacht naar de dagelijkse operatie en de vraag hoe monitoring bijdraagt aan bestuurbare, aantoonbare informatiebeveiliging. In veel organisaties is er een kloof tussen wat er technisch gemonitord wordt en de informatie die bestuur, CISO en proceseigenaren daadwerkelijk nodig hebben. Om deze kloof te dichten, is het nodig om duidelijke informatieproducten te definiëren: welke rapportages worden periodiek geleverd, welke dashboards zijn beschikbaar voor operationele teams, welke indicatoren worden gedeeld met directie en welke details zijn toegankelijk voor auditors.

Een goed uitgangspunt is het opstellen van een rapportagekalender waarin per frequentie (bijvoorbeeld wekelijks, maandelijks, per kwartaal) wordt beschreven welke monitoringinformatie wordt opgeleverd en aan wie. Voor een Nederlands gemeentebestuur of provinciebestuur kan dit bijvoorbeeld betekenen dat de CISO elk kwartaal een managementrapportage ontvangt met trendinformatie over monitoringdekking, aantallen openstaande kritieke alerts, status van verbonden industriële apparaten en de status van verbeteracties. Operationele teams krijgen wekelijks of dagelijks meer gedetailleerde overzichten, bijvoorbeeld lijsten met industriële apparaten zonder actuele monitoringdekking, of alerts die de afgesproken reactietijden hebben overschreden. Deze informatieproducten worden idealiter opgebouwd op basis van gestandaardiseerde KQL-query's in Log Analytics en opgeslagen als werkboeken of Power BI-dashboards.

Binnen de dagelijkse operatie speelt ook de triage en opvolging van signalen een centrale rol. Alerts die voortkomen uit OT-monitoring moeten worden geïntegreerd in bestaande processen rondom incident- en probleembeheer. Dit betekent dat alerts automatisch worden doorgestuurd naar ITSM-systemen, dat er duidelijke classificaties en prioriteiten worden gehanteerd en dat er afspraken zijn over escalatie naar securityteams of bovenliggende managementlagen. Door voor de belangrijkste alerttypen playbooks of standaard werkinstructies te definiëren, wordt de responstijd verkort en neemt de kwaliteit van de afhandeling toe. In volwassen organisaties wordt deze aanpak regelmatig getest via scenario-oefeningen, bijvoorbeeld een gesimuleerde verstoring van monitoring of een plotselinge toename van verdachte commando's naar industriële systemen.

Governance is de derde pijler van operationele verankering. Monitoringconfiguraties veranderen in de tijd: nieuwe industriële apparaten worden toegevoegd, oude systemen worden uitgefaseerd en normenkaders worden aangescherpt. Zonder duidelijke governance dreigt sluipende erosie: ooit zorgvuldig ingerichte dashboards worden niet meer onderhouden, alerts verliezen hun relevantie en uitzonderingen worden niet meer herbeoordeeld. Daarom is het verstandig om een formeel orgaan aan te wijzen – bijvoorbeeld een cloud governance board of security steering committee – dat periodiek de effectiviteit van OT-monitoring beoordeelt. Dit orgaan beslist over wijzigingen in monitoringarchitectuur, bewaartermijnen, drempelwaarden en rapportageafspraken, en borgt de aansluiting met organisatiebreed risicomanagement.

In de context van de Nederlandse Baseline voor Veilige Cloud is aantoonbaarheid richting toezichthouders en rekenkamers een cruciale succesfactor. OT-monitoring moet harde, verifieerbare informatie opleveren waarmee kan worden onderbouwd dat beveiligingsmaatregelen daadwerkelijk functioneren. Dit betekent dat niet alleen ruwe data beschikbaar is, maar ook dat er inzicht is in trends, root causes en genomen verbetermaatregelen. Door de resultaten van OT-monitoring expliciet te koppelen aan het Information Security Management System (ISMS) of GRC-platform van de organisatie, ontstaat een sluitende keten van risico-identificatie, controle, monitoring, rapportage en verbetering. De bijbehorende PowerShell-control kan hierin dienen als praktische check om te bevestigen dat de technische monitoringfundamenten nog steeds op orde zijn.

Compliance & Frameworks

Automation

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

PowerShell
<# .SYNOPSIS Controleert beveiligings- en compliance-aspecten voor OT monitoring en kritieke infrastructuur. .DESCRIPTION Dit script inventariseert OT-apparaten, controleert de beveiligingsstatus van IoT Hubs en verifieert Azure Defender voor IoT-configuraties voor operationele technologie en kritieke infrastructuur. Het controleert onder meer: - Inventarisatie van OT-apparaten en IoT Hubs - Azure Defender voor IoT-configuratie en monitoring-status - Bedreigingsdetectie en anomalie-analyse configuraties - Netwerksegmentatie en beveiligingsinstellingen - Compliance-status voor NIS2 en andere relevante frameworks In monitoringmodus wordt een rapport gegenereerd met de beveiligings- en compliance-status per IoT Hub en OT-omgeving. In remediatiemodus wordt een overzicht gemaakt van OT-beveiligingshiaten, inclusief aanbevelingen voor vervolgstappen. .NOTES Filename: ot-monitoring.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-27 Last Modified: 2025-01-27 Version: 1.0 Related JSON: content/azure/industrial/ot-monitoring.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\ot-monitoring.ps1 -Monitoring Voert een controle uit op alle IoT Hubs en OT-omgevingen en toont de beveiligingsstatus. .EXAMPLE .\ot-monitoring.ps1 -Remediation Genereert een overzicht van OT-beveiligingshiaten en aanbevelingen voor verbetering. .EXAMPLE .\ot-monitoring.ps1 -Monitoring -LocalDebug Draait een lokale debug-run met gesimuleerde data zonder Azure-verbinding of Azure-API-calls. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter()] [switch]$WhatIf, [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation, [Parameter()] [string[]]$SubscriptionId, [Parameter()] [switch]$LocalDebug ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $PolicyName = "OT monitoring beveiliging" $PolicyDescription = "Controleert of OT-omgevingen en kritieke infrastructuur adequaat worden gemonitord via Azure Defender voor IoT, inclusief apparaatdetectie, bedreigingsdetectie en compliance-rapportage." function Test-ModuleAvailability { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string[]]$ModuleName ) foreach ($name in $ModuleName) { if (-not (Get-Module -ListAvailable -Name $name)) { Write-Warning "Vereiste module '$name' is niet geïnstalleerd. Installeer deze module voor volledige functionaliteit." } } } function Connect-RequiredServices { <# .SYNOPSIS Maakt verbinding met Azure als dat nog niet is gebeurd. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "LocalDebug is ingeschakeld; er wordt geen Azure-verbinding opgezet." return } Test-ModuleAvailability -ModuleName @('Az.Accounts', 'Az.IotHub', 'Az.Security', 'Az.Monitor', 'Az.OperationalInsights') try { $context = Get-AzContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Azure..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null } else { Write-Verbose "Reeds verbonden met Azure: $($context.Subscription.Name)" } } catch { Write-Error "Kon geen verbinding maken met Azure: $_" throw } } function Get-DebugOtData { [CmdletBinding()] param() return @( [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000010" SubscriptionName = "DBG-Overheid-CriticalInfra" ResourceGroupName = "rg-iot-ot-monitoring" IoTHubName = "iot-hub-watermanagement-prod" Location = "westeurope" DefenderForIoTEnabled = $true DeviceCount = 1250 MonitoredDevices = 1180 UnmonitoredDevices = 70 ThreatAlerts = 3 VulnerabilityCount = 12 HighSeverityVulns = 2 NetworkSegmentation = $true PrivateEndpointEnabled = $true LoggingEnabled = $true HasSecurityIssues = $false SecurityIssues = @() }, [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000020" SubscriptionName = "DBG-Overheid-Energy" ResourceGroupName = "rg-iot-energy-production" IoTHubName = "iot-hub-energy-scada" Location = "northeurope" DefenderForIoTEnabled = $false DeviceCount = 850 MonitoredDevices = 0 UnmonitoredDevices = 850 ThreatAlerts = 0 VulnerabilityCount = 0 HighSeverityVulns = 0 NetworkSegmentation = $false PrivateEndpointEnabled = $false LoggingEnabled = $false HasSecurityIssues = $true SecurityIssues = @( "Azure Defender voor IoT is niet ingeschakeld", "Geen apparaten worden gemonitord", "Netwerksegmentatie is niet geconfigureerd", "Private endpoints zijn niet ingeschakeld", "Logging is niet geconfigureerd" ) } ) } function Get-OtMonitoringStatus { <# .SYNOPSIS Haalt IoT Hubs op en bepaalt de OT monitoring-status. .OUTPUTS PSCustomObject met IoT Hub- en beveiligingsinformatie. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "Gebruik van gesimuleerde OT monitoring data (LocalDebug)." return Get-DebugOtData } Write-Verbose "Ophalen van IoT Hubs via Azure Resource Graph..." $query = @' resources | where type =~ "microsoft.devices/iothubs" | project id, name, location, subscriptionId, resourceGroup, tags, properties '@ $argParams = @{ Query = $query } if ($SubscriptionId) { $argParams['Subscription'] = $SubscriptionId } $iotHubs = Search-AzGraph @argParams $results = @() foreach ($iotHub in $iotHubs) { $props = $iotHub.properties $tags = $iotHub.tags $classification = $tags["DataClassification"] $owner = $tags["Owner"] $businessProc = $tags["BusinessProcess"] $securityIssues = @() $hasIssues = $false # Controleer of Defender voor IoT is ingeschakeld $defenderEnabled = $false try { $defenderSettings = Get-AzSecurityIotHubSolution -ResourceId $iotHub.id -ErrorAction SilentlyContinue if ($defenderSettings) { $defenderEnabled = $true } else { $hasIssues = $true $securityIssues += "Azure Defender voor IoT is niet ingeschakeld voor deze IoT Hub." } } catch { Write-Verbose "Kon Defender voor IoT-status niet bepalen voor IoT Hub $($iotHub.name): $_" $hasIssues = $true $securityIssues += "Kon Azure Defender voor IoT-status niet verifiëren." } # Controleer apparaat-aantallen (vereenvoudigde check) $deviceCount = 0 $monitoredDevices = 0 try { $devices = Get-AzIotHubDevice -ResourceGroupName $iotHub.resourceGroup -IotHubName $iotHub.name -ErrorAction SilentlyContinue if ($devices) { $deviceCount = $devices.Count # In een echte implementatie zou hier worden gecontroleerd hoeveel apparaten daadwerkelijk worden gemonitord $monitoredDevices = if ($defenderEnabled) { $deviceCount } else { 0 } } } catch { Write-Verbose "Kon apparaat-aantallen niet bepalen voor IoT Hub $($iotHub.name): $_" } $unmonitoredDevices = $deviceCount - $monitoredDevices if ($unmonitoredDevices -gt 0) { $hasIssues = $true $securityIssues += "$unmonitoredDevices apparaten worden niet gemonitord." } # Controleer private endpoints $privateEndpointEnabled = $false try { $privateEndpoints = Get-AzPrivateEndpoint -ResourceGroupName $iotHub.resourceGroup -ErrorAction SilentlyContinue | Where-Object { $_.PrivateLinkServiceConnections.PrivateLinkServiceId -like "*$($iotHub.id)*" } if ($privateEndpoints) { $privateEndpointEnabled = $true } else { $hasIssues = $true $securityIssues += "Private endpoints zijn niet geconfigureerd voor deze IoT Hub." } } catch { Write-Verbose "Kon private endpoint-status niet bepalen voor IoT Hub $($iotHub.name): $_" } # Controleer logging $loggingEnabled = $false try { $diagSettings = Get-AzDiagnosticSetting -ResourceId $iotHub.id -ErrorAction SilentlyContinue if ($diagSettings) { $loggingEnabled = $true } else { $hasIssues = $true $securityIssues += "Diagnostic logging is niet geconfigureerd voor deze IoT Hub." } } catch { Write-Verbose "Kon diagnostic settings niet ophalen voor IoT Hub $($iotHub.name): $_" } # Vereenvoudigde bedreigings- en kwetsbaarheidschecks $threatAlerts = 0 $vulnerabilityCount = 0 $highSeverityVulns = 0 if ($defenderEnabled) { try { # In een echte implementatie zou hier Azure Defender voor IoT worden geraadpleegd voor bedreigings- en kwetsbaarheidsinformatie $threatAlerts = 0 $vulnerabilityCount = 0 $highSeverityVulns = 0 } catch { Write-Verbose "Kon bedreigings- en kwetsbaarheidsinformatie niet ophalen voor IoT Hub $($iotHub.name): $_" } } # Netwerksegmentatie (vereenvoudigde check via tags) $networkSegmentation = $tags["NetworkSegmentation"] -eq "Enabled" if (-not $networkSegmentation) { $hasIssues = $true $securityIssues += "Netwerksegmentatie is niet gedocumenteerd of geconfigureerd." } $results += [PSCustomObject]@{ SubscriptionId = $iotHub.subscriptionId SubscriptionName = (Get-AzSubscription -SubscriptionId $iotHub.subscriptionId -ErrorAction SilentlyContinue).Name ResourceGroupName = $iotHub.resourceGroup IoTHubName = $iotHub.name Location = $iotHub.location DefenderForIoTEnabled = $defenderEnabled DeviceCount = $deviceCount MonitoredDevices = $monitoredDevices UnmonitoredDevices = $unmonitoredDevices ThreatAlerts = $threatAlerts VulnerabilityCount = $vulnerabilityCount HighSeverityVulns = $highSeverityVulns NetworkSegmentation = $networkSegmentation PrivateEndpointEnabled = $privateEndpointEnabled LoggingEnabled = $loggingEnabled HasSecurityIssues = $hasIssues SecurityIssues = $securityIssues } } return $results } function Test-Compliance { <# .SYNOPSIS Bepaalt de compliancestatus voor OT monitoring beveiliging. .OUTPUTS PSCustomObject met samenvatting van de resultaten. #> [CmdletBinding()] param() $iotHubs = Get-OtMonitoringStatus if (-not $iotHubs -or $iotHubs.Count -eq 0) { Write-Verbose "Geen IoT Hubs gevonden in de geselecteerde scope." return [PSCustomObject]@{ ScriptName = "ot-monitoring" IsCompliant = $true Timestamp = Get-Date Details = "Er zijn geen IoT Hubs gevonden in de huidige scope." Recommendations = @() IoTHubs = @() } } $nonCompliant = $iotHubs | Where-Object { $_.HasSecurityIssues } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden IoT Hubs voldoen aan de basis OT monitoring-vereisten." } else { "Een of meer IoT Hubs hebben OT monitoring-hiaten die aandacht vereisen." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Schakel Azure Defender voor IoT in voor alle IoT Hubs die OT-apparaten beheren." $recommendations += "Zorg dat alle OT-apparaten worden gedetecteerd en gemonitord via Azure Defender voor IoT." $recommendations += "Configureer private endpoints voor IoT Hubs om beveiligde, private verbindingen te waarborgen." $recommendations += "Stel diagnostic logging in voor alle IoT Hubs voor audit- en compliance-doeleinden." $recommendations += "Implementeer netwerksegmentatie volgens het Purdue-model voor OT-omgevingen." $recommendations += "Documenteer OT-beveiligingsafspraken, runbooks en incidentresponsprocedures." $recommendations += "Neem OT monitoring op in periodieke risicobeoordelingen en auditplannen." } return [PSCustomObject]@{ ScriptName = "ot-monitoring" IsCompliant = $isCompliant Timestamp = Get-Date Details = $details Recommendations = $recommendations IoTHubs = $iotHubs } } function Invoke-Monitoring { <# .SYNOPSIS Voert een monitoring-run uit en toont de beveiligingsstatus per IoT Hub en OT-omgeving. #> [CmdletBinding()] param() Write-Host "`nMonitoring: $PolicyName" -ForegroundColor Yellow Write-Host "Beschrijving: $PolicyDescription" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $iotHubs = $result.IoTHubs if ($iotHubs.Count -gt 0) { Write-Host "`nGevonden IoT Hubs:" -ForegroundColor Cyan foreach ($hub in $iotHubs) { $statusColor = if (-not $hub.HasSecurityIssues) { "Green" } else { "Red" } $statusText = if (-not $hub.HasSecurityIssues) { "OT Monitoring: COMPLIANT" } else { "OT Monitoring: NON-COMPLIANT - $($hub.SecurityIssues.Count) issue(s)" } Write-Host ("- {0}/{1} ({2})" -f $hub.SubscriptionName, $hub.IoTHubName, $hub.Location) -ForegroundColor $statusColor Write-Host (" Defender voor IoT: {0}" -f $(if ($hub.DefenderForIoTEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" Apparaten: {0} totaal, {1} gemonitord, {2} niet-gemonitord" -f $hub.DeviceCount, $hub.MonitoredDevices, $hub.UnmonitoredDevices) -ForegroundColor Gray Write-Host (" Bedreigingswaarschuwingen: {0}" -f $hub.ThreatAlerts) -ForegroundColor Gray Write-Host (" Kwetsbaarheden: {0} totaal, {1} hoog risico" -f $hub.VulnerabilityCount, $hub.HighSeverityVulns) -ForegroundColor Gray Write-Host (" Private endpoints: {0}" -f $(if ($hub.PrivateEndpointEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" Logging: {0}" -f $(if ($hub.LoggingEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" Netwerksegmentatie: {0}" -f $(if ($hub.NetworkSegmentation) { "Geconfigureerd" } else { "Niet geconfigureerd" })) -ForegroundColor Gray Write-Host (" Status: {0}" -f $statusText) -ForegroundColor $statusColor if ($hub.SecurityIssues.Count -gt 0) { foreach ($issue in $hub.SecurityIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } } Write-Host "" } } else { Write-Host "`nGeen IoT Hubs gevonden in de huidige scope." -ForegroundColor Cyan } if ($result.IsCompliant) { Write-Host "✅ COMPLIANT - Alle IoT Hubs voldoen aan de basis OT monitoring-vereisten." -ForegroundColor Green } else { Write-Host "❌ NON-COMPLIANT - Eén of meer IoT Hubs hebben OT monitoring-hiaten." -ForegroundColor Red Write-Host "Aanbevolen acties:" -ForegroundColor Yellow foreach ($rec in $result.Recommendations) { Write-Host (" - {0}" -f $rec) -ForegroundColor Yellow } } return $result } function Invoke-Remediation { <# .SYNOPSIS Geeft een remediatie-overzicht voor IoT Hubs met OT monitoring-hiaten. #> [CmdletBinding()] param() Write-Host "`nRemediatie: $PolicyName" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $iotHubs = $result.IoTHubs | Where-Object { $_.HasSecurityIssues } if (-not $iotHubs -or $iotHubs.Count -eq 0) { Write-Host "Alle IoT Hubs voldoen aan de basis OT monitoring-vereisten. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme IoT Hubs (met OT monitoring-hiaten):" -ForegroundColor Red foreach ($hub in $iotHubs) { Write-Host ("- Subscription: {0}" -f $hub.SubscriptionName) -ForegroundColor Red Write-Host (" ResourceGroup: {0}" -f $hub.ResourceGroupName) -ForegroundColor Red Write-Host (" IoT Hub: {0}" -f $hub.IoTHubName) -ForegroundColor Red Write-Host (" Locatie: {0}" -f $hub.Location) -ForegroundColor Red Write-Host (" Geïdentificeerde issues:" -ForegroundColor Yellow foreach ($issue in $hub.SecurityIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } Write-Host "" } Write-Host "Aanbevolen vervolgstappen:" -ForegroundColor Yellow Write-Host "1. Schakel Azure Defender voor IoT in voor alle IoT Hubs die OT-apparaten beheren." -ForegroundColor Yellow Write-Host "2. Verifieer dat alle OT-apparaten worden gedetecteerd en gemonitord via Azure Defender voor IoT." -ForegroundColor Yellow Write-Host "3. Configureer private endpoints voor IoT Hubs om beveiligde, private verbindingen te waarborgen." -ForegroundColor Yellow Write-Host "4. Stel diagnostic logging in voor alle IoT Hubs voor audit- en compliance-doeleinden." -ForegroundColor Yellow Write-Host "5. Implementeer netwerksegmentatie volgens het Purdue-model voor OT-omgevingen." -ForegroundColor Yellow Write-Host "6. Documenteer OT-beveiligingsafspraken, runbooks en incidentresponsprocedures." -ForegroundColor Yellow Write-Host "7. Plan periodieke evaluaties van OT monitoring en veranker verbeteracties in de security- en cloudroadmap." -ForegroundColor Yellow if ($WhatIf) { Write-Host "`nWhatIf is ingeschakeld: er worden geen wijzigingen doorgevoerd; alleen een rapport is gegenereerd." -ForegroundColor Cyan } return $result } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Script: ot-monitoring" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan Connect-RequiredServices if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { $result = Test-Compliance if ($result.IsCompliant) { Write-Host "`n✅ COMPLIANT" -ForegroundColor Green } else { Write-Host "`n❌ NON-COMPLIANT" -ForegroundColor Red Write-Host "Voer het script uit met -Monitoring of -Remediation voor meer details." -ForegroundColor Yellow } return $result } } catch { Write-Error "Er is een fout opgetreden in ot-monitoring.ps1: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder adequate OT-monitoring kunnen organisaties niet tijdig detecteren wanneer industriële systemen worden aangevallen, wanneer configuratiefouten optreden die productieprocessen kunnen beïnvloeden, of wanneer operationele problemen ontstaan die kunnen leiden tot veiligheidsincidenten of milieuschade. Dit kan leiden tot productieverlies, veiligheidsincidenten, milieuschade, boetes, reputatieschade en mogelijke aansprakelijkheid bij incidenten. Compliance: NIS2 Artikel 21, BIO 09.01.02, ISO 27001 A.12.4.

Management Samenvatting

OT-monitoring in Azure: Implementatie van een samenhangend monitoringraamwerk met Azure IoT Hub voor industriële apparaten, Azure Monitor en Log Analytics voor telemetrie, Azure Sentinel met ICS-analytics voor beveiliging, en Defender for IoT voor protocolmonitoring. Biedt real-time zichtbaarheid op industriële processen en detecteert bedreigingen en operationele problemen. Activatie: Configureer IoT Hub → Verbind industriële apparaten → Stel monitoring in → Configureer alerts. Verplicht NIS2 Artikel 21, BIO 09.01.02 voor kritieke infrastructuur. Implementatie: 100-180 uur. Kritieke beveiligings- en operationele randvoorwaarde voor industriële systemen.