Azure App Service: HTTPS-Only Mode Afdwingen

💼 Management Samenvatting

HTTPS-Only enforcement voor Azure App Service zorgt ervoor dat al het HTTP-verkeer automatisch wordt omgeleid naar HTTPS, waardoor data-transmissie volledig wordt versleuteld. Deze maatregel voorkomt man-in-the-middle-aanvallen, data-interceptie en credential-diefstal, en is een fundamentele beveiligingscontrole voor alle web-applicaties.

Aanbeveling
IMPLEMENTEER VERPLICHT VOOR ALLE APP SERVICES
Risico zonder
High
Risk Score
8/10
Implementatie
1u (tech: 0.5u)
Van toepassing op:
App Service
Function Apps

Onversleuteld HTTP-verkeer vormt een kritiek beveiligingsrisico voor web-applicaties en hun gebruikers. Wanneer applicaties HTTP-verkeer toestaan, worden alle gegevens in plaintext over het netwerk verzonden, wat betekent dat inloggegevens zoals gebruikersnamen en wachtwoorden leesbaar zijn voor iedereen die netwerkverkeer kan onderscheppen, sessie-tokens kunnen worden gestolen wat session hijacking mogelijk maakt, gevoelige bedrijfsgegevens of persoonsgegevens kunnen worden onderschept wat AVG-schendingen oplevert, en man-in-the-middle-aanvallen mogelijk worden waarbij aanvallers verkeer kunnen lezen en manipuleren. Deze risico's zijn niet theoretisch: op publieke WiFi-netwerken, in compromised routers, of via ARP-spoofing kunnen aanvallers gemakkelijk HTTP-verkeer onderscheppen. Daarnaast vormt het toestaan van HTTP-verkeer een compliance-schending voor vrijwel alle security frameworks waaronder PCI-DSS (voor applicaties die betaalgegevens verwerken), ISO 27001, NIS2, en de AVG die versleuteling van data in transit vereisen. HTTPS-Only mode elimineert deze risico's door automatische redirection van alle HTTP-requests naar HTTPS in te schakelen, waardoor versleuteling wordt afgedwongen, ondersteuning te bieden voor HTTP Strict Transport Security (HSTS) headers die browsers instrueren om altijd HTTPS te gebruiken, en compliance te waarborgen met alle relevante security frameworks. Dit is een zero-cost security enhancement die geen performance impact heeft en essentieel is voor elke productie-applicatie.

PowerShell Modules Vereist
Primary API: Azure API
Connection: Connect-AzAccount
Required Modules: Az.Websites

Implementatie

Deze maatregel implementeert HTTPS-Only mode voor alle Azure App Services en Function Apps door de httpsOnly-property op true te zetten voor elke App Service-resource. Wanneer deze instelling is geactiveerd, handelt het Azure-platform automatisch alle inkomende HTTP-requests (poort 80) af door deze te redirecten naar HTTPS (poort 443) met een HTTP 301 Permanent Redirect response. Dit betekent dat zelfs als gebruikers of systemen proberen om via HTTP toegang te krijgen tot de applicatie, ze automatisch worden omgeleid naar de veilige HTTPS-versie. De implementatie is extreem eenvoudig en kan worden uitgevoerd via de Azure Portal onder TLS/SSL settings waar de optie 'HTTPS alleen' op 'Aan' moet worden gezet, of via PowerShell/Azure CLI voor geautomatiseerde deployment over meerdere App Services tegelijk. Deze wijziging vereist geen code-aanpassingen in de applicatie zelf en heeft geen negatieve performance impact - moderne TLS 1.3 versleuteling is zeer efficiënt. Optioneel kan ook de HTTP Strict Transport Security (HSTS) header worden ingeschakeld, wat browsers instrueert om gedurende een gespecificeerde periode automatisch HTTPS te gebruiken voor de applicatie, zelfs voordat de gebruiker een request maakt. Deze maatregel is kosteloos (geen extra Azure-kosten), instant implementeerbaar (wijziging is direct actief), en essentieel voor compliance met PCI-DSS Requirement 4.1, ISO 27001 control A.13.1.1, en NIS2 Artikel 21. Dit is een non-negotiable beveiligingscontrole die moet worden geïmplementeerd voor alle productie App Services zonder uitzondering.

Implementatie

De implementatie van HTTPS-Only mode voor Azure App Services kan op verschillende manieren worden uitgevoerd, afhankelijk van de schaal van uw omgeving en de mate van automatisering die u wenst. Voor kleine organisaties met enkele App Services is handmatige configuratie via de Azure Portal de meest directe aanpak. Deze methode vereist geen technische scripting-kennis en kan binnen vijf tot tien minuten per App Service worden voltooid. Het proces begint met het navigeren naar de Azure Portal en het selecteren van de specifieke App Service die u wilt beveiligen. In het linker navigatiemenu onder de sectie Settings vindt u de optie 'TLS/SSL settings' of 'Certificates', afhankelijk van de versie van de Azure Portal die u gebruikt. Binnen deze configuratiepagina bevindt zich de sectie 'HTTPS Only', die meestal prominent bovenaan de pagina wordt weergegeven. Standaard staat deze instelling op 'Off' voor nieuwe App Services, wat betekent dat zowel HTTP als HTTPS-verkeer wordt toegestaan. Door de schakelaar naar 'On' te zetten, activeert u de HTTPS-Only functionaliteit. Het systeem toont een waarschuwing die duidelijk maakt dat alle inkomende HTTP-verkeer automatisch zal worden omgeleid naar HTTPS. Na bevestiging van deze waarschuwing klikt u op 'Save' om de wijziging op te slaan. Een belangrijk voordeel van deze configuratie is dat de wijziging direct actief wordt zonder dat een herstart van de App Service nodig is. De Azure-platformlaag handelt de redirect automatisch af op infrastructuurniveau. Om te valideren dat de configuratie correct werkt, opent u een webbrowser en navigeert u naar de HTTP-versie van uw applicatie, bijvoorbeeld http://uw-app.azurewebsites.net. Als de configuratie correct is ingesteld, wordt u automatisch omgeleid naar de HTTPS-versie van de applicatie. In de adresbalk van de browser ziet u het groene slotje-icoon dat aangeeft dat de verbinding beveiligd is met een geldig TLS-certificaat. Deze visuele bevestiging is belangrijk voor gebruikersvertrouwen en compliance-verificatie.

Voor organisaties met meerdere App Services of enterprise-omgevingen met tientallen of honderden applicaties is geautomatiseerde deployment via PowerShell de aanbevolen aanpak. Deze methode vereist een initiële investering van dertig tot zestig minuten voor het opzetten van het script en de validatie, maar biedt daarna de mogelijkheid om alle App Services binnen een subscription binnen enkele minuten te configureren. Het proces begint met het verbinden met Azure via de Connect-AzAccount cmdlet, gevolgd door het selecteren van het juiste Azure-abonnement met Select-AzSubscription en de specifieke subscription-ID. Vervolgens gebruikt u Get-AzWebApp om alle App Services binnen het abonnement op te halen en filtert u op die services waarbij de HttpsOnly-eigenschap nog niet is ingeschakeld. Deze filtering identificeert alle niet-compliant applicaties in één oogopslag. Voor elke niet-compliant applicatie voert u Set-AzWebApp uit met de parameters ResourceGroupName, Name en HttpsOnly ingesteld op true. Het is aanbevolen om tijdens het uitvoeren van het script feedback te geven via Write-Host commando's, zodat u real-time kunt zien welke applicaties worden geconfigureerd. Na de implementatie valideert u de configuratie door opnieuw Get-AzWebApp uit te voeren en te filteren op applicaties waarbij HttpsOnly nog steeds false is. Deze query zou een lege lijst moeten retourneren als alle applicaties correct zijn geconfigureerd. Voor audit- en compliance-doeleinden is het zeer waardevol om een compliance-rapport te exporteren naar een CSV-bestand. Dit rapport bevat de naam van elke App Service, de resourcegroep waarin deze zich bevindt, en de status van de HTTPS-Only configuratie. Dit documentatiebestand kan worden gebruikt tijdens externe audits of interne compliance-controles. Om ervoor te zorgen dat nieuwe App Services automatisch worden geconfigureerd, kunt u dit script plannen als een terugkerende taak via Azure Automation. Door het script wekelijks of maandelijks uit te voeren, worden nieuwe App Services automatisch gedetecteerd en geconfigureerd, wat een proactieve beveiligingsaanpak mogelijk maakt in plaats van reactieve detectie.

De meest geavanceerde en preventieve aanpak voor HTTPS-Only enforcement is het gebruik van Azure Policy. Deze methode vereist ongeveer een uur voor de initiële setup, maar biedt daarna volledig geautomatiseerde compliance-afdwinging zonder handmatige interventie. Azure Policy werkt op infrastructuurniveau en kan nieuwe resources blokkeren voordat ze worden gemaakt, wat een fundamenteel andere aanpak is dan reactieve monitoring en remediatie. Het proces begint in de Azure Portal onder de sectie Policy, waar u naar Definitions navigeert. Microsoft biedt een ingebouwde policy definitie genaamd 'App Service apps should only be accessible over HTTPS', die specifiek is ontworpen voor deze use case. Deze policy definitie kan worden toegewezen op subscription-niveau of op resource group-niveau, afhankelijk van de organisatorische structuur van uw Azure-omgeving. Bij het toewijzen van de policy heeft u de keuze tussen twee effecten: 'Audit' en 'Deny'. Het Audit-effect detecteert alleen niet-compliant resources en rapporteert deze in het compliance-dashboard, zonder actie te ondernemen. Het Deny-effect is veel krachtiger en voorkomt dat developers nieuwe App Services kunnen deployen zonder HTTPS-Only ingeschakeld. Dit laatste effect wordt sterk aanbevolen voor productie-omgevingen omdat het proactieve beveiliging afdwingt in plaats van reactieve detectie. Tijdens de policy-toewijzing is het cruciaal om de optie 'Create a remediation task' in te schakelen. Deze functie maakt automatisch een Managed Identity aan die de benodigde machtigingen heeft om niet-compliant resources te remediëren. De remediation task kan automatisch worden uitgevoerd of handmatig worden geactiveerd vanuit het compliance-dashboard. Het compliance-dashboard in Azure Policy biedt real-time inzicht in de compliance-status van alle App Services binnen het bereik van de policy. Niet-compliant resources worden automatisch gedetecteerd binnen vierentwintig uur na de policy-toewijzing, en de status wordt continu bijgewerkt. Dit dashboard is onmisbaar voor compliance-officers en security teams die regelmatig moeten rapporteren over de beveiligingsstatus van de cloud-omgeving. Het belangrijkste voordeel van Azure Policy met het Deny-effect is dat het voorkomt dat developers per ongeluk of opzettelijk nieuwe App Services deployen zonder HTTPS-Only. Dit elimineert de noodzaak voor reactieve monitoring en remediatie, omdat niet-compliant resources simpelweg niet kunnen worden gemaakt. Deze preventieve aanpak is de gouden standaard voor enterprise cloud security en wordt sterk aanbevolen voor organisaties die serieus zijn over compliance en beveiliging.

Hoewel HTTPS-Only mode een fundamentele beveiligingscontrole is, kan deze worden versterkt met HTTP Strict Transport Security, oftewel HSTS. HSTS is een extra beveiligingslaag die browsers instrueert om automatisch HTTPS te gebruiken voor een specifieke applicatie, zelfs wanneer de gebruiker expliciet http:// in de adresbalk typt. Dit voorkomt zogenaamde downgrade-aanvallen waarbij aanvallers proberen gebruikers te dwingen om HTTP te gebruiken in plaats van HTTPS. HSTS werkt door middel van een speciale HTTP response header die de browser ontvangt wanneer deze voor het eerst verbinding maakt met de applicatie via HTTPS. Deze header bevat instructies die de browser opslaat in zijn cache, waardoor alle toekomstige verbindingen automatisch via HTTPS verlopen. Voor .NET-applicaties die op Azure App Service draaien, wordt HSTS geïmplementeerd via het web.config bestand of via de applicationHost.config op applicatieniveau. U voegt een httpProtocol sectie toe met customHeaders die de Strict-Transport-Security header bevat. De waarde van deze header bestaat uit verschillende parameters: max-age specificeert hoelang de browser deze instructie moet onthouden, meestal ingesteld op 31536000 seconden, wat overeenkomt met één jaar. De includeSubDomains parameter zorgt ervoor dat HSTS ook wordt toegepast op alle subdomeinen van het hoofddomein, wat belangrijk is voor complexe applicatie-architecturen. De preload parameter is optioneel en maakt het mogelijk om het domein in te dienen voor browser preload lists, wat betekent dat browsers het domein al kennen voordat de gebruiker er ooit verbinding mee heeft gemaakt. Voor applicaties die zijn gebouwd met Node.js, Python, Java of andere programmeertalen, wordt HSTS geïmplementeerd via applicatiecode die de HTTP response header configureert. In Node.js Express bijvoorbeeld voegt u middleware toe die de Strict-Transport-Security header instelt op elke response. Het is cruciaal om te beginnen met een korte max-age waarde, bijvoorbeeld 300 seconden, tijdens de testfase om te verifiëren dat alle subdomeinen correct HTTPS ondersteunen. Na succesvolle validatie kunt u de max-age geleidelijk verhogen naar één jaar. Deze voorzichtige aanpak is belangrijk omdat HSTS moeilijk terug te draaien is: browsers cachen de instructie en blijven deze toepassen zelfs als u de header verwijdert, totdat de max-age periode is verstreken. Daarom moet HSTS-implementatie zorgvuldig worden getest voordat deze in productie wordt geactiveerd.

De totale implementatietijd voor HTTPS-Only mode varieert aanzienlijk afhankelijk van de gekozen methode en de schaal van uw omgeving. Voor handmatige configuratie via de Azure Portal rekent u met vijf tot tien minuten per App Service, wat geschikt is voor kleine omgevingen met minder dan tien applicaties. Geautomatiseerde deployment via PowerShell vereist dertig tot zestig minuten voor de initiële setup van het script en de validatie, maar biedt daarna de mogelijkheid om alle App Services binnen een subscription binnen enkele minuten te configureren. Azure Policy setup vereist ongeveer een uur voor de initiële configuratie, inclusief het toewijzen van de policy, het configureren van remediation tasks en het valideren van de compliance-status. Eenmaal geconfigureerd werkt Azure Policy volledig automatisch zonder verdere handmatige interventie. Wat betreft kosten zijn HTTPS-Only en HSTS volledig gratis. Er zijn geen extra Azure-kosten verbonden aan deze functionaliteit, en TLS-certificaten voor custom domains zijn beschikbaar via App Service Managed Certificates zonder extra kosten. De totale implementatiekosten bedragen nul euro, wat deze maatregel tot een van de meest kosteneffectieve beveiligingsverbeteringen maakt die beschikbaar zijn voor Azure App Services.

Compliance en Auditing

HTTPS-Only enforcement voor Azure App Services is niet alleen een best practice, maar een verplichte vereiste voor vrijwel alle belangrijke beveiligings- en compliance-frameworks die relevant zijn voor Nederlandse overheidsorganisaties en bedrijven. De implementatie van deze maatregel is essentieel voor het behalen van compliance met meerdere internationale en nationale standaarden, waaronder de CIS Azure Foundations Benchmark, PCI-DSS voor organisaties die betalingsgegevens verwerken, ISO 27001 voor informatiebeveiligingsmanagement, en de NIS2-richtlijn voor kritieke en belangrijke entiteiten. Elke audit of compliance-assessment zal deze configuratie controleren, en het ontbreken ervan resulteert vrijwel altijd in een non-compliance bevinding die moet worden gerepareerd voordat certificering kan worden verkregen.

De CIS Microsoft Azure Foundations Benchmark bevat specifieke controles voor App Service-beveiliging die HTTPS-Only enforcement verplicht stellen. Deze benchmark wordt wereldwijd erkend als de gouden standaard voor cloud security configuration en wordt gebruikt door duizenden organisaties als basis voor hun beveiligingsbeleid. CIS-controles zijn gebaseerd op consensus van security experts en worden regelmatig bijgewerkt om nieuwe bedreigingen en best practices te reflecteren. Voor Azure App Services specifiek vereist de CIS Benchmark dat alle applicaties uitsluitend toegankelijk zijn via HTTPS, wat betekent dat HTTP-verkeer volledig moet worden geblokkeerd of automatisch moet worden omgeleid. Tijdens een CIS-compliance audit zullen auditors de HTTPS-Only configuratie van elke App Service controleren, en non-compliance zal worden gedocumenteerd als een kritieke bevinding die onmiddellijke remediatie vereist. Organisaties die streven naar CIS-compliance moeten deze maatregel implementeren voor alle App Services zonder uitzondering, inclusief development- en test-omgevingen, omdat de benchmark geen onderscheid maakt tussen productie- en niet-productie-omgevingen voor deze specifieke controle.

Voor organisaties die betalingsgegevens verwerken, is PCI-DSS Requirement 4.1 van cruciaal belang. Deze vereiste stelt expliciet dat alle transmissie van kaarthoudergegevens over open, publieke netwerken moet worden versleuteld met sterke cryptografie. Hoewel dit requirement technisch gezien alleen van toepassing is op systemen die daadwerkelijk betalingsgegevens verwerken, interpreteren de meeste Qualified Security Assessors, oftewel QSA's, deze vereiste breed: alle systemen binnen hetzelfde netwerksegment of die toegang hebben tot systemen die betalingsgegevens verwerken, moeten ook voldoen aan deze versleutelingsvereiste. Dit betekent dat vrijwel alle App Services binnen een organisatie die PCI-DSS-compliance nastreeft, HTTPS-Only moeten implementeren. Het niet naleven van PCI-DSS Requirement 4.1 kan leiden tot aanzienlijke boetes van betalingsverwerkers, verlies van de mogelijkheid om betalingsgegevens te verwerken, en in ernstige gevallen tot juridische aansprakelijkheid. Tijdens een PCI-DSS audit zal de QSA de configuratie van alle App Services controleren en zal non-compliance worden gedocumenteerd als een failed requirement, wat betekent dat de organisatie niet kan worden gecertificeerd totdat deze is gerepareerd. Het is belangrijk om te begrijpen dat PCI-DSS audits jaarlijks worden uitgevoerd, en dat deze configuratie continu moet worden gehandhaafd, niet alleen tijdens de auditperiode.

ISO 27001 is de internationale standaard voor informatiebeveiligingsmanagementsystemen en wordt wereldwijd gebruikt door organisaties die hun informatiebeveiligingspraktijken willen certificeren. Control A.13.1.1 binnen ISO 27001 behandelt netwerkbeveiliging en vereist expliciet dat organisaties netwerkbeveiligingscontroles implementeren, waaronder versleuteling van data in transit. Voor cloud-gebaseerde applicaties zoals Azure App Services betekent dit dat alle netwerkcommunicatie moet worden versleuteld via TLS, wat alleen kan worden gegarandeerd door HTTPS-Only enforcement. Tijdens een ISO 27001-certificeringsaudit zal de auditor controleren of alle applicaties correct zijn geconfigureerd voor versleutelde communicatie, en het ontbreken van HTTPS-Only zal worden gedocumenteerd als een non-conformity die moet worden gerepareerd voordat certificering kan worden verkregen. Daarnaast vereist ISO 27001 dat organisaties continu monitoren en verbeteren van hun beveiligingscontroles, wat betekent dat HTTPS-Only configuratie niet alleen moet worden geïmplementeerd, maar ook continu moet worden gemonitord om te zorgen dat nieuwe App Services automatisch worden geconfigureerd. Control A.10.1.1 behandelt cryptografische controles en vereist dat organisaties cryptografische controles gebruiken om de vertrouwelijkheid, authenticiteit en integriteit van informatie te beschermen. HTTPS-Only enforcement draagt direct bij aan deze controle door ervoor te zorgen dat alle data in transit wordt versleuteld met moderne TLS-protocollen.

De NIS2-richtlijn, die in 2024 van kracht is geworden in de Europese Unie, verplicht kritieke en belangrijke entiteiten om passende technische en organisatorische maatregelen te nemen om de beveiliging van netwerk- en informatiesystemen te waarborgen. Artikel 21 van de NIS2-richtlijn behandelt specifiek de beveiliging van netwerk- en informatiesystemen en vereist dat entiteiten passende maatregelen nemen om de beveiliging, inclusief versleuteling, te waarborgen. Voor Nederlandse organisaties die onder de reikwijdte van NIS2 vallen, wat onder andere geldt voor overheidsorganisaties, kritieke infrastructuur, en belangrijke entiteiten in sectoren zoals energie, transport, en financiën, is HTTPS-Only enforcement een verplichte maatregel. Het niet naleven van NIS2-vereisten kan leiden tot aanzienlijke boetes van toezichthouders, waaronder de Autoriteit Persoonsgegevens in Nederland, en kan ook leiden tot reputatieschade en verlies van vertrouwen van burgers en klanten. NIS2-compliance wordt gecontroleerd door nationale toezichthouders, en organisaties moeten kunnen aantonen dat zij passende technische maatregelen hebben geïmplementeerd om netwerkbeveiliging te waarborgen. HTTPS-Only enforcement is een van de meest basale en effectieve maatregelen die organisaties kunnen nemen om aan deze vereiste te voldoen.

Naast deze specifieke frameworks is HTTPS-Only enforcement ook essentieel voor AVG-compliance, oftewel de Algemene Verordening Gegevensbescherming. Artikel 32 van de AVG vereist dat organisaties passende technische en organisatorische maatregelen nemen om persoonsgegevens te beveiligen, en versleuteling wordt expliciet genoemd als een voorbeeld van een passende technische maatregel. Voor applicaties die persoonsgegevens verwerken, wat vrijwel alle moderne webapplicaties doen, is versleuteling van data in transit via HTTPS een minimale vereiste. Het niet implementeren van HTTPS-Only kan worden geïnterpreteerd als een schending van Artikel 32, wat kan leiden tot boetes van de Autoriteit Persoonsgegevens tot maximaal twintig miljoen euro of vier procent van de wereldwijde jaaromzet, afhankelijk van welke waarde hoger is. Tijdens een AVG-audit of datalekonderzoek zal de toezichthouder controleren of organisaties passende technische maatregelen hebben geïmplementeerd, en het ontbreken van HTTPS-Only enforcement kan worden gebruikt als bewijs dat de organisatie niet heeft voldaan aan haar verplichtingen onder de AVG.

Voor audit- en compliance-doeleinden is het essentieel om documentatie bij te houden die aantoont dat HTTPS-Only correct is geconfigureerd voor alle App Services. Deze documentatie moet regelmatig worden bijgewerkt, bij voorkeur automatisch via geautomatiseerde scripts die compliance-rapporten genereren. Tijdens externe audits zullen auditors vragen om bewijs dat alle App Services correct zijn geconfigureerd, en het hebben van up-to-date compliance-rapporten maakt het auditproces veel soepeler. Daarnaast is het belangrijk om te documenteren wanneer HTTPS-Only is geïmplementeerd, welke methode is gebruikt voor implementatie, en hoe de configuratie wordt gemonitord en onderhouden. Deze documentatie kan worden gebruikt om aan te tonen dat de organisatie proactief werkt aan compliance en dat beveiligingscontroles continu worden gehandhaafd, niet alleen tijdens auditperiodes.

Monitoring

Gebruik PowerShell-script app-service-https-only.ps1 (functie Invoke-Monitoring) – Controleren.

Remediatie

Gebruik PowerShell-script app-service-https-only.ps1 (functie Invoke-Remediation) – Herstellen.

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 Azure App Service: HTTPS Only .DESCRIPTION CIS Azure Foundations Benchmark - Control 9.1 Controleert of Azure App Services zijn geconfigureerd voor HTTPS Only. Dit zorgt ervoor dat alle HTTP traffic automatisch wordt geredirect naar HTTPS, waardoor data-in-transit protection gegarandeerd is. Waarom is deze control belangrijk? - Data encryption in transit - Preventie van man-in-the-middle attacks - Compliance met security standards - Protection van credentials en sensitive data .NOTES Filename: app-service-https-only.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/app-service/app-service-https-only.json CIS Control: 9.1 .PARAMETER WhatIf Toont wat het script zou doen zonder daadwerkelijk wijzigingen door te voeren .PARAMETER Monitoring Voert compliance check uit en toont gedetailleerd rapport .PARAMETER Remediation Voert automatische remediatie uit om HTTPS Only te enablen .PARAMETER Revert Draait wijzigingen terug (allows HTTP traffic) .EXAMPLE .\app-service-https-only.ps1 Voert basis compliance check uit .EXAMPLE .\app-service-https-only.ps1 -Monitoring Toont gedetailleerd compliance rapport .EXAMPLE .\app-service-https-only.ps1 -Remediation Enabled HTTPS Only voor non-compliant App Services #> # ============================================================================ # REQUIREMENTS # ============================================================================ #Requires -Version 5.1 #Requires -Modules Az.Accounts #Requires -Modules Az.Websites # ============================================================================ # PARAMETERS # ============================================================================ [CmdletBinding()] param( [Parameter()][switch]$WhatIf, [Parameter()][switch]$Monitoring, [Parameter()][switch]$Remediation, [Parameter()][switch]$Revert ) # ============================================================================ # GLOBAL VARIABLES # ============================================================================ $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $PolicyName = "Azure App Service: HTTPS Only" # ============================================================================ # FUNCTION: Connect-RequiredServices # ============================================================================ function Connect-RequiredServices { function Invoke-Revert { Write-Host "`nReverting HTTPS Only settings..." -ForegroundColor Yellow Write-Host "⚠️ WAARSCHUWING: HTTP traffic toestaan verhoogt security risk!" -ForegroundColor Red $webApps = Get-AzWebApp -ErrorAction SilentlyContinue foreach ($app in $webApps) { if ($app.HttpsOnly) { Set-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name -HttpsOnly $false Write-Host " ✓ Disabled HTTPS Only for $($app.Name)" -ForegroundColor Green } } } try { $context = Get-AzContext if (-not $context) { Write-Verbose "Connecting to Azure..." Connect-AzAccount | Out-Null } else { Write-Verbose "Already connected to Azure as $($context.Account.Id)" } } catch { Write-Error "Failed to connect to Azure: $_" throw } } # ============================================================================ # FUNCTION: Test-Compliance # ============================================================================ function Test-Compliance { Write-Verbose "Testing compliance for: $PolicyName..." $result = [PSCustomObject]@{ ScriptName = "app-service-https-only" PolicyName = $PolicyName IsCompliant = $false TotalResources = 0 CompliantCount = 0 NonCompliantCount = 0 Details = @() Recommendations = @() } function Invoke-Revert { Write-Host "`nReverting HTTPS Only settings..." -ForegroundColor Yellow Write-Host "⚠️ WAARSCHUWING: HTTP traffic toestaan verhoogt security risk!" -ForegroundColor Red $webApps = Get-AzWebApp -ErrorAction SilentlyContinue foreach ($app in $webApps) { if ($app.HttpsOnly) { Set-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name -HttpsOnly $false Write-Host " ✓ Disabled HTTPS Only for $($app.Name)" -ForegroundColor Green } } } try { Write-Verbose "Retrieving all App Services..." $webApps = Get-AzWebApp -ErrorAction SilentlyContinue if (-not $webApps) { $result.Details += "Geen App Services gevonden in dit subscription" $result.IsCompliant = $true return $result } $result.TotalResources = @($webApps).Count foreach ($app in $webApps) { Write-Verbose "Checking app: $($app.Name)" if ($app.HttpsOnly) { $result.CompliantCount++ $result.Details += "✓ App '$($app.Name)' heeft HTTPS Only enabled" } else { $result.NonCompliantCount++ $result.Details += "✗ App '$($app.Name)' accepteert HTTP traffic (ResourceGroup: $($app.ResourceGroup))" $result.Recommendations += "Enable HTTPS Only voor App Service '$($app.Name)'" } } $result.IsCompliant = ($result.NonCompliantCount -eq 0) if ($result.NonCompliantCount -gt 0) { $result.Recommendations += "Run met -Remediation om automatisch HTTPS Only te configureren" } } catch { $result.Details += "ERROR: $($_.Exception.Message)" } return $result } # ============================================================================ # FUNCTION: Invoke-Remediation # ============================================================================ function Invoke-Remediation { Write-Host "`nStarting remediation for: $PolicyName..." -ForegroundColor Cyan Write-Host "=" * 80 -ForegroundColor Cyan function Invoke-Revert { Write-Host "`nReverting HTTPS Only settings..." -ForegroundColor Yellow Write-Host "⚠️ WAARSCHUWING: HTTP traffic toestaan verhoogt security risk!" -ForegroundColor Red $webApps = Get-AzWebApp -ErrorAction SilentlyContinue foreach ($app in $webApps) { if ($app.HttpsOnly) { Set-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name -HttpsOnly $false Write-Host " ✓ Disabled HTTPS Only for $($app.Name)" -ForegroundColor Green } } } try { $fixed = 0 $failed = 0 $skipped = 0 $webApps = Get-AzWebApp -ErrorAction SilentlyContinue if (-not $webApps) { Write-Host "Geen App Services gevonden" -ForegroundColor Gray return } foreach ($app in $webApps) { if ($app.HttpsOnly) { Write-Host " ✓ $($app.Name): Already configured" -ForegroundColor Green $skipped++ } else { Write-Host " Configuring: $($app.Name)..." -ForegroundColor Gray function Invoke-Revert { Write-Host "`nReverting HTTPS Only settings..." -ForegroundColor Yellow Write-Host "⚠️ WAARSCHUWING: HTTP traffic toestaan verhoogt security risk!" -ForegroundColor Red $webApps = Get-AzWebApp -ErrorAction SilentlyContinue foreach ($app in $webApps) { if ($app.HttpsOnly) { Set-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name -HttpsOnly $false Write-Host " ✓ Disabled HTTPS Only for $($app.Name)" -ForegroundColor Green } } } try { Set-AzWebApp ` -ResourceGroupName $app.ResourceGroup ` -Name $app.Name ` -HttpsOnly $true ` -ErrorAction Stop | Out-Null Write-Host " [OK] HTTPS Only enabled" -ForegroundColor Green $fixed++ } catch { Write-Host " ✗ Failed: $($_.Exception.Message)" -ForegroundColor Red $failed++ } } } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Remediation Summary:" -ForegroundColor White Write-Host " Configured: $fixed" -ForegroundColor Green Write-Host " Already compliant: $skipped" -ForegroundColor Green if ($failed -gt 0) { Write-Host " Failed: $failed" -ForegroundColor Red } if ($fixed -gt 0) { Write-Host "`n[OK] Remediation completed successfully" -ForegroundColor Green Write-Host " Alle HTTP traffic wordt nu geredirect naar HTTPS" -ForegroundColor Gray } } catch { Write-Error "Remediation failed: $_" throw } } # ============================================================================ # FUNCTION: Invoke-Monitoring # ============================================================================ function Invoke-Monitoring { $result = Test-Compliance Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$PolicyName" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "App Services gecontroleerd: $($result.TotalResources)" -ForegroundColor White Write-Host "Compliant: $($result.CompliantCount)" -ForegroundColor Green $color = if ($result.NonCompliantCount -gt 0) { "Red" } else { "Green" } Write-Host "Non-compliant: $($result.NonCompliantCount)" -ForegroundColor $color if ($result.Details) { Write-Host "`nDetails:" -ForegroundColor Yellow foreach ($detail in $result.Details) { Write-Host " $detail" -ForegroundColor Gray } } if ($result.Recommendations) { Write-Host "`nAanbevelingen:" -ForegroundColor Yellow foreach ($recommendation in $result.Recommendations) { Write-Host " → $recommendation" -ForegroundColor Cyan } } return $result } # ============================================================================ # MAIN EXECUTION BLOCK # ============================================================================ function Invoke-Revert { Write-Host "`nReverting HTTPS Only settings..." -ForegroundColor Yellow Write-Host "⚠️ WAARSCHUWING: HTTP traffic toestaan verhoogt security risk!" -ForegroundColor Red $webApps = Get-AzWebApp -ErrorAction SilentlyContinue foreach ($app in $webApps) { if ($app.HttpsOnly) { Set-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name -HttpsOnly $false Write-Host " ✓ Disabled HTTPS Only for $($app.Name)" -ForegroundColor Green } } } try { Connect-RequiredServices if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { if ($WhatIf) { Write-Host "`n=== WHATIF MODE ===" -ForegroundColor Yellow Write-Host "Zou HTTPS Only configureren voor: $PolicyName" -ForegroundColor Yellow $result = Test-Compliance if ($result.NonCompliantCount -gt 0) { Write-Host "Zou HTTPS Only enablen voor $($result.NonCompliantCount) App Service(s)" -ForegroundColor Yellow } Write-Host "===================`n" -ForegroundColor Yellow } else { Invoke-Remediation } } elseif ($Revert) { Invoke-Revert } else { $result = Test-Compliance Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Compliance Check: $PolicyName" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if ($result.IsCompliant) { Write-Host "Status: [OK] COMPLIANT" -ForegroundColor Green Write-Host "Alle App Services hebben HTTPS Only enabled" -ForegroundColor Green } else { Write-Host "Status: [FAIL] NON-COMPLIANT" -ForegroundColor Red Write-Host "Aantal non-compliant apps: $($result.NonCompliantCount)" -ForegroundColor Red Write-Host "`nRun met -Monitoring voor gedetailleerd rapport" -ForegroundColor Yellow Write-Host "Run met -Remediation om automatisch te configureren" -ForegroundColor Yellow } } } catch { Write-Error "An error occurred: $_" Write-Error $_.ScriptStackTrace exit 1 }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder HTTPS-Only enforcement blijven Azure App Services kwetsbaar voor ernstige beveiligingsrisico's waarbij onversleuteld HTTP-verkeer mogelijk blijft. Man-in-the-middle aanvallen worden triviaal mogelijk op publieke WiFi-netwerken, gecompromitteerde routers of via ARP-spoofing waarbij aanvallers die netwerkverkeer kunnen onderscheppen alle HTTP-communicatie in plaintext kunnen lezen en manipuleren - dit omvat inloggegevens zoals gebruikersnamen en wachtwoorden die leesbaar over het netwerk gaan, sessie-tokens die kunnen worden gestolen voor session hijacking waarbij aanvallers gebruikerssessies overnemen, gevoelige bedrijfsgegevens zoals klantinformatie, financiële data of intellectueel eigendom die kan worden geëxfiltreerd, en API-sleutels of authenticatie-tokens die permanent toegang geven tot backend-systemen. Credential-interceptie is bijzonder kritiek omdat gestolen inloggegevens kunnen worden hergebruikt voor breder toegang tot corporate systemen via credential stuffing-aanvallen. Compliance-schendingen zijn onvermijdelijk waarbij PCI-DSS Requirement 4.1 strikt HTTPS vereist voor ALLE systemen die betaalkaartgegevens verwerken of transmitteren (niet-compliance leidt tot fines en verlies van betalingsverwerkingsrechten), ISO 27001 Control A.13.1.1 netwerkversleuteling mandatory maakt, NIS2 Artikel 21 versleuteling van data in transit verplicht stelt voor kritieke en belangrijke entiteiten, en AVG Artikel 32 passende technische maatregelen vereist waarbij versleuteling expliciet wordt genoemd - auditors zullen altijd falen bij gebrek aan HTTPS-enforcement. Reputatieschade ontstaat bij datalekken waarbij klanten ontdekken dat hun gegevens onversleuteld werden verzonden, wat media-aandacht, klantenverlies en juridische claims veroorzaakt. Het risico is kritiek voor alle productie-applicaties ongeacht data-gevoeligheid - zelfs publieke websites zonder gevoelige data moeten HTTPS gebruiken omdat browsers zoals Chrome en Firefox HTTP-sites markeren als 'Niet veilig' wat gebruikersvertrouwen ondermijnt.

Management Samenvatting

HTTPS-Only mode dwingt automatische versleuteling af voor alle Azure App Service-verkeer door HTTP-requests (poort 80) automatisch te redirecten naar HTTPS (poort 443) via HTTP 301 Permanent Redirect responses. Deze Azure platform-level functionaliteit vereist nul code-wijzigingen, heeft geen performance-impact (moderne TLS 1.3 is zeer efficiënt), en is instant actief na inschakeling. Implementatie: configureer httpsOnly-property op true via Azure Portal onder TLS/SSL settings → HTTPS Only → Aan, of gebruik geautomatiseerde PowerShell/CLI-scripts voor bulk-deployment over meerdere App Services (aanbevolen voor enterprise-omgevingen met tientallen apps). Optioneel maar sterk aanbevolen: schakel HTTP Strict Transport Security (HSTS) header in die browsers instrueert om automatisch HTTPS te gebruiken voor de applicatie gedurende gespecificeerde periode (bijvoorbeeld 1 jaar), wat downgrade-aanvallen voorkomt waarbij aanvallers proberen verbindingen terug te dwingen naar HTTP. Deze maatregel is absoluut verplicht voor ALLE productie App Services zonder uitzonderingen (inclusief development/test-omgevingen om credential-lekkage tijdens testing te voorkomen), kosteloos (geen extra Azure-kosten), instant implementeerbaar (wijziging is binnen seconden actief), vereist voor compliance met PCI-DSS Requirement 4.1, ISO 27001 A.13.1.1, NIS2 Artikel 21, CIS Azure Benchmark, en AVG Artikel 32. Implementatie-effort: 30 minuten voor handmatige configuratie van enkele apps, 1-2 uur voor geautomatiseerde deployment over alle App Services in subscription met compliance-monitoring. Doorlopende inspanning: nul - eenmaal ingeschakeld blijft HTTPS-Only actief zonder onderhoud. Return on investment komt van: eliminated man-in-the-middle attack risks, compliance audit success (PCI-DSS, ISO 27001, NIS2, AVG), gebruikersvertrouwen door browser 'secure' indicatoren in plaats van 'Not Secure' waarschuwingen, en zero implementation costs bij critical security value.