Veilige Pipeline Configuratie: Best Practices Voor CI/CD Pipeline Setup

💼 Management Samenvatting

Veilige pipeline configuratie vormt de basis voor beveiligde CI/CD-processen binnen Azure DevOps en andere moderne development platforms. Het gaat om het correct configureren van YAML-pipelines, het veilig beheren van secrets en variabelen, het implementeren van pipeline templates voor consistentie, en het voorkomen van beveiligingslekken zoals hardcoded credentials, onveilige variabele-injecties of misbruik van pipeline permissions. Zonder adequate beveiliging van pipeline configuraties kunnen aanvallers gevoelige informatie stelen, ongeautoriseerde code deployen, of beveiligingscontroles omzeilen door misbruik te maken van onveilige configuraties.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
75u (tech: 50u)
Van toepassing op:
Azure DevOps
GitHub Actions
Azure Pipelines
CI/CD Pipelines
YAML Pipelines

CI/CD-pipelines bevatten vaak toegang tot gevoelige systemen, productie-omgevingen en kritieke credentials. Wanneer pipeline configuraties onveilig zijn opgezet, kunnen aanvallers deze misbruiken om ongeautoriseerde toegang te krijgen tot systemen, kwaadaardige code te deployen, of gevoelige informatie te stelen. Dit risico is bijzonder hoog wanneer secrets hardcoded zijn in YAML-bestanden, wanneer variabelen onveilig worden gebruikt, wanneer pipeline templates niet worden gebruikt voor consistentie, of wanneer pipeline configuraties niet worden gereviewed op beveiligingsproblemen. Voor Nederlandse overheidsorganisaties die moeten voldoen aan strikte compliance-vereisten zoals de BIO-normen, ISO 27001, of de NIS2-richtlijn, is het essentieel dat pipeline configuraties veilig worden opgezet om te voorkomen dat pipelines worden misbruikt voor ongeautoriseerde acties. Het ontbreken van veilige pipeline configuratie kan leiden tot kritieke beveiligingsincidenten, niet-naleving van compliance-vereisten, en verlies van vertrouwen bij burgers en stakeholders.

PowerShell Modules Vereist
Primary API: Azure DevOps REST API
Connection: Connect-AzAccount, az devops login
Required Modules: Az.Accounts, Az.DevOps

Implementatie

Veilige pipeline configuratie omvat het implementeren van een gelaagde beveiligingsaanpak voor CI/CD-pipeline configuraties, waarbij verschillende beveiligingscontroles worden geïmplementeerd om te voorkomen dat configuraties worden misbruikt. Dit begint met het veilig beheren van secrets en variabelen, waarbij secrets worden opgeslagen in secure vaults zoals Azure Key Vault of Azure DevOps Library Variable Groups, en waarbij variabelen worden gemarkeerd als secret wanneer zij gevoelige informatie bevatten. Pipeline templates worden gebruikt voor consistentie, waarbij gecentraliseerde templates worden gebruikt die beveiligingsbest practices implementeren, en waarbij individuele pipelines deze templates gebruiken in plaats van hun eigen configuraties te schrijven. YAML-pipelines worden beveiligd door branch protection policies te configureren, door code scanning tools te gebruiken om te detecteren wanneer pipelines onveilige configuraties bevatten, en door regelmatig pipeline configuraties te reviewen op beveiligingsproblemen. Service connections worden beveiligd door access controls te configureren, door service principals te gebruiken in plaats van persoonlijke credentials, en door regelmatig credentials te roteren. Pipeline artifacts worden beveiligd door access controls te configureren, door artifacts te versleutelen, en door retention policies te implementeren. Pipeline triggers worden beveiligd door te voorkomen dat pipelines worden getriggerd door ongeautoriseerde bronnen, door branch filters te configureren, en door pull request validatie te implementeren.

Secrets en Variabelen Beheer

Het veilig beheren van secrets en variabelen vormt de kern van veilige pipeline configuratie. Secrets bevatten gevoelige informatie zoals wachtwoorden, API-sleutels, connection strings en certificaten die nooit zichtbaar mogen zijn in pipeline logs of YAML-bestanden. Azure DevOps biedt verschillende mechanismen voor het beheren van secrets, waaronder Library Variable Groups, Azure Key Vault integratie, en Secure Files. Het is essentieel dat organisaties een duidelijk beleid ontwikkelen voor wanneer welke methode wordt gebruikt, wie toegang heeft tot secrets, en hoe secrets worden geroteerd.

Library Variable Groups vormen de eerste laag voor secrets management in Azure DevOps. Deze groepen kunnen worden geconfigureerd op project- of organisatieniveau en bieden de mogelijkheid om variabelen te markeren als secret, waardoor zij worden versleuteld en niet zichtbaar zijn in pipeline logs. Variabelen moeten worden georganiseerd per omgeving, applicatie of functie, zodat toegangscontroles granulair kunnen worden toegepast. Het is belangrijk om te voorkomen dat secrets worden opgeslagen in YAML-bestanden zelf, zelfs wanneer zij worden gemarkeerd als secret, omdat YAML-bestanden vaak worden gecommit naar versiebeheersystemen waar zij permanent zichtbaar blijven.

Azure Key Vault integratie biedt een krachtige manier om secrets centraal te beheren en te integreren met Azure DevOps pipelines. Door Key Vault te gebruiken als centrale opslag voor secrets kunnen organisaties profiteren van geavanceerde functies zoals automatische rotatie, audit logging, en granulair toegangsbeheer. Azure DevOps kan direct verbinding maken met Key Vault via service connections, waarbij secrets worden opgehaald tijdens pipeline execution zonder dat zij zichtbaar zijn in logs. Deze aanpak is bijzonder waardevol voor organisaties die al Key Vault gebruiken voor andere doeleinden, omdat het zorgt voor consistentie in secrets management across de hele organisatie.

Secure Files bieden een mechanisme voor het beheren van bestanden die secrets bevatten, zoals certificaten, private keys, of configuratiebestanden met gevoelige informatie. Deze bestanden worden versleuteld opgeslagen en kunnen worden gedownload tijdens pipeline execution, waarbij toegang wordt gecontroleerd via Azure DevOps permissions. Het is belangrijk om te voorkomen dat secure files worden gecommit naar versiebeheersystemen, en om ervoor te zorgen dat alleen geautoriseerde pipelines toegang hebben tot secure files die zij nodig hebben.

Variabele-injectie vormt een belangrijk beveiligingsrisico wanneer variabelen onveilig worden gebruikt in pipeline configuraties. Aanvallers kunnen proberen om kwaadaardige waarden te injecteren via variabelen, bijvoorbeeld door command injection of script injection aan te vallen. Het is essentieel om variabelen altijd te escapen wanneer zij worden gebruikt in scripts of commands, en om te voorkomen dat gebruikersinput direct wordt gebruikt zonder validatie. Azure DevOps biedt ingebouwde bescherming tegen sommige vormen van injectie, maar organisaties moeten altijd defensief programmeren en aannemen dat variabelen mogelijk kwaadaardig zijn.

Gebruik PowerShell-script secure-pipeline-configuration.ps1 (functie Invoke-Monitoring) – Controleert of secrets en variabelen veilig zijn geconfigureerd in Azure DevOps pipelines.

YAML Pipeline Beveiliging

YAML-pipelines vormen de basis voor moderne CI/CD-configuraties in Azure DevOps en andere platforms. Het beveiligen van YAML-pipelines vereist aandacht voor verschillende aspecten, waaronder het voorkomen van hardcoded credentials, het gebruik van pipeline templates voor consistentie, het implementeren van code scanning voor beveiligingsproblemen, en het configureren van branch protection policies om te voorkomen dat onveilige configuraties worden gemerged.

Hardcoded credentials vormen een van de meest voorkomende beveiligingsproblemen in pipeline configuraties. Wanneer credentials direct in YAML-bestanden worden geschreven, worden zij permanent zichtbaar in versiebeheersystemen, zelfs wanneer zij later worden verwijderd, omdat versiebeheersystemen een volledige geschiedenis bijhouden. Het is essentieel om alle credentials te verwijderen uit YAML-bestanden en in plaats daarvan gebruik te maken van secrets management mechanismen zoals Library Variable Groups of Azure Key Vault. Code scanning tools kunnen worden gebruikt om automatisch te detecteren wanneer hardcoded credentials worden gevonden in YAML-bestanden, waardoor organisaties proactief kunnen ingrijpen voordat configuraties worden gecommit.

Pipeline templates bieden een krachtige manier om beveiligingsbest practices te centraliseren en consistentie te waarborgen across alle pipelines. Door gecentraliseerde templates te ontwikkelen die beveiligingscontroles implementeren, kunnen organisaties ervoor zorgen dat alle pipelines automatisch profiteren van de nieuwste beveiligingsmaatregelen zonder dat individuele pipeline-eigenaren deze handmatig moeten implementeren. Templates kunnen worden gebruikt voor gemeenschappelijke taken zoals authenticatie, secrets retrieval, security scanning, en deployment procedures. Het is belangrijk om templates regelmatig te updaten wanneer nieuwe beveiligingsvereisten worden geïdentificeerd, en om ervoor te zorgen dat alle pipelines gebruik maken van de nieuwste versies van templates.

Code scanning tools kunnen worden geïntegreerd in pipelines om automatisch te detecteren wanneer YAML-configuraties beveiligingsproblemen bevatten. Tools zoals GitHub Advanced Security, Azure DevOps Security Scanning, of externe tools zoals Checkov of Snyk kunnen worden gebruikt om YAML-bestanden te analyseren op hardcoded secrets, onveilige configuraties, of andere beveiligingsproblemen. Deze tools kunnen worden geconfigureerd om automatisch te falen wanneer beveiligingsproblemen worden gedetecteerd, waardoor onveilige configuraties niet kunnen worden gemerged naar main branches. Het is belangrijk om code scanning te integreren in alle pipelines, niet alleen in productie pipelines, omdat beveiligingsproblemen in development of test pipelines ook kunnen worden misbruikt.

Branch protection policies zijn essentieel voor het voorkomen dat onveilige pipeline configuraties worden gemerged naar productie branches. Policies moeten worden geconfigureerd die vereisen dat alle wijzigingen aan YAML-bestanden worden gereviewed door ten minste twee personen, waarbij minimaal één reviewer een security officer of senior developer is. Policies moeten ook vereisen dat pipelines moeten slagen voordat code wordt gemerged, waarbij security scanning een verplichte stap is in alle pipelines. Force pushes moeten worden geblokkeerd om te voorkomen dat beveiligingscontroles worden omzeild, en branch deletion moet worden beperkt tot alleen geautoriseerde gebruikers.

Pipeline triggers vormen een belangrijk beveiligingspunt omdat zij bepalen wanneer pipelines worden uitgevoerd. Het is essentieel om triggers te configureren die alleen worden geactiveerd door geautoriseerde bronnen, zoals specifieke branches, pull requests, of geautoriseerde gebruikers. Branch filters moeten worden gebruikt om te voorkomen dat pipelines worden getriggerd door onveilige branches, en pull request validatie moet worden geïmplementeerd om te waarborgen dat alleen goedgekeurde code wordt gedeployed. Het is ook belangrijk om te voorkomen dat pipelines worden getriggerd door externe bronnen zonder adequate authenticatie en autorisatie.

Service Connections en Authenticatie

Service connections vormen de verbinding tussen Azure DevOps pipelines en externe services zoals Azure, GitHub, of andere cloud providers. Het beveiligen van service connections is essentieel omdat zij vaak toegang hebben tot productie-omgevingen en gevoelige resources. Service connections moeten worden geconfigureerd met minimale permissions, waarbij alleen de benodigde rechten worden toegekend voor specifieke pipelines en omgevingen. Service principals moeten worden gebruikt in plaats van persoonlijke credentials, en credentials moeten regelmatig worden geroteerd volgens een vastgesteld schema.

Azure service connections moeten worden geconfigureerd met managed identities of service principals die minimale permissions hebben. Het gebruik van persoonlijke Azure AD-accounts voor service connections is onveilig omdat deze accounts vaak overprivileged zijn en moeilijk te beheren zijn. In plaats daarvan moeten organisaties dedicated service principals maken voor elke service connection, waarbij permissions worden beperkt tot alleen wat nodig is. Service principals moeten worden beheerd via Azure AD, waarbij regelmatig wordt gecontroleerd of permissions nog steeds correct zijn en of accounts nog steeds actief worden gebruikt.

Credential rotatie is essentieel voor het beperken van de impact van gecompromitteerde credentials. Service connection credentials moeten regelmatig worden geroteerd, bijvoorbeeld elk 90 dagen, waarbij oude credentials worden verwijderd zodra nieuwe credentials zijn geconfigureerd. Het is belangrijk om een proces te hebben voor credential rotatie dat niet leidt tot pipeline failures, bijvoorbeeld door nieuwe credentials eerst te testen voordat oude credentials worden verwijderd. Azure Key Vault kan worden gebruikt om credential rotatie te automatiseren, waarbij credentials automatisch worden geroteerd en pipelines automatisch worden bijgewerkt met nieuwe credentials.

Access controls voor service connections moeten worden geconfigureerd om te bepalen welke pipelines toegang hebben tot welke service connections. Niet alle pipelines hebben toegang nodig tot alle service connections, en het is belangrijk om toegang te beperken tot alleen wat nodig is. Azure DevOps biedt de mogelijkheid om service connection permissions te configureren op pipeline-niveau, waarbij specifieke pipelines expliciet toegang krijgen tot specifieke service connections. Deze aanpak vermindert het risico dat gecompromitteerde pipelines toegang krijgen tot gevoelige service connections waartoe zij geen toegang zouden moeten hebben.

Waarschuwingen moeten worden geconfigureerd voor service connection activiteiten, zodat security teams onmiddellijk worden geïnformeerd wanneer service connections worden gebruikt of gewijzigd. Deze waarschuwingen kunnen worden geïntegreerd met security monitoring systemen zoals Azure Sentinel of SIEM oplossingen voor geavanceerde analyses. Waarschuwingen moeten worden geconfigureerd voor activiteiten zoals het gebruik van service connections buiten normale werktijden, het wijzigen van service connection configuraties, of het gebruik van service connections door onbekende pipelines.

Pipeline Artifacts en Opslag Beveiliging

Pipeline artifacts bevatten vaak gevoelige informatie zoals gecompileerde code, test resultaten, of deployment packages. Het beveiligen van artifacts is essentieel om te voorkomen dat ongeautoriseerde gebruikers toegang krijgen tot deze informatie. Artifacts moeten worden beveiligd door access controls te configureren, door artifacts te versleutelen tijdens transport en opslag, en door retention policies te implementeren die bepalen hoe lang artifacts worden bewaard.

Access controls voor artifacts moeten worden geconfigureerd om te bepalen wie artifacts kan downloaden of gebruiken. Niet alle gebruikers hebben toegang nodig tot alle artifacts, en het is belangrijk om toegang te beperken tot alleen wat nodig is. Azure DevOps biedt de mogelijkheid om artifact permissions te configureren op pipeline-niveau, waarbij specifieke pipelines expliciet toegang krijgen tot specifieke artifacts. Deze aanpak vermindert het risico dat gecompromitteerde pipelines toegang krijgen tot gevoelige artifacts waartoe zij geen toegang zouden moeten hebben.

Encryptie van artifacts tijdens transport en opslag is essentieel om te voorkomen dat artifacts worden onderschept of gelezen door ongeautoriseerde partijen. Azure DevOps versleutelt artifacts automatisch tijdens transport via HTTPS, en artifacts worden versleuteld opgeslagen in Azure Storage. Het is belangrijk om te verifiëren dat alle artifact transfers gebruik maken van versleutelde verbindingen, en om te voorkomen dat artifacts worden gedownload via onveilige verbindingen. Voor zeer gevoelige artifacts kunnen organisaties overwegen om aanvullende encryptie te implementeren op applicatieniveau, bijvoorbeeld door artifacts te versleutelen voordat zij worden geüpload.

Retention policies moeten worden geïmplementeerd om te bepalen hoe lang artifacts worden bewaard en wanneer zij worden verwijderd. Artifacts bevatten vaak gevoelige informatie die niet permanent moet worden bewaard, en het is belangrijk om retention policies te configureren die voldoen aan compliance-vereisten terwijl zij onnodige opslag van gevoelige informatie voorkomen. Azure DevOps biedt de mogelijkheid om retention policies te configureren op pipeline-niveau, waarbij specifieke pipelines verschillende retention policies kunnen hebben afhankelijk van de gevoeligheid van de artifacts die zij produceren.

Artifact access logging is essentieel voor audit-doeleinden en voor het detecteren van verdachte activiteiten. Alle artifact access moet worden gelogd, waarbij wordt vastgelegd wie artifacts heeft gedownload of gebruikt, wanneer deze access heeft plaatsgevonden, en welke artifacts zijn geopend. Deze logs moeten worden bewaard voor minimaal 90 dagen, maar voor compliance-doeleinden kunnen langere bewaartermijnen nodig zijn. Logs moeten worden geïntegreerd met security monitoring systemen zoals Azure Sentinel of SIEM oplossingen voor geavanceerde analyses en waarschuwingen.

Compliance en Auditing

Veilige pipeline configuratie is essentieel voor naleving van verschillende compliance-vereisten die van toepassing zijn op Nederlandse organisaties, met name in de publieke sector. De Baseline Informatiebeveiliging Overheid (BIO) bevat in Thema 12.01 specifieke vereisten voor secure development en secure coding practices, waarbij organisaties moeten zorgen dat beveiliging wordt geïntegreerd in development processen en dat secrets management correct wordt geïmplementeerd. Veilige pipeline configuratie implementeert deze vereisten door secrets veilig te beheren, door pipeline configuraties te beveiligen, en door pipeline activiteiten te loggen voor audit-doeleinden. Voor overheidsorganisaties die moeten voldoen aan BIO-normen is documentatie van pipeline configuraties, secrets management, en audit logs een essentieel onderdeel van audit-evidentie.

ISO 27001:2022 bevat in controle A.8.2 specifieke vereisten voor information classification, waarbij organisaties moeten zorgen dat informatie wordt geclassificeerd en behandeld volgens de gevoeligheid ervan. Controle A.10.1 vereist dat organisaties cryptografische controls implementeren voor de bescherming van gevoelige informatie. Veilige pipeline configuratie implementeert beide controles door secrets veilig te beheren via versleutelde opslag, door pipeline configuraties te beveiligen tegen ongeautoriseerde wijzigingen, en door artifacts te versleutelen tijdens transport en opslag. De auditlogs die worden gegenereerd door Azure DevOps en pipeline logging kunnen worden gebruikt als audit-evidentie om aan te tonen dat organisaties proactief secrets management en beveiliging implementeren voor CI/CD-pipelines.

De NIS2-richtlijn vereist in Artikel 21 dat organisaties passende maatregelen treffen voor beveiliging van systemen en diensten, waarbij secrets management en beveiligde configuratie essentieel zijn. De richtlijn benadrukt het belang van encryptie voor gevoelige informatie en van beveiligde configuratie management. Veilige pipeline configuratie implementeert dit principe door secrets veilig te beheren via versleutelde opslag, door pipeline configuraties te beveiligen tegen ongeautoriseerde wijzigingen, en door pipeline activiteiten te loggen voor audit-doeleinden. Voor organisaties die onder NIS2 vallen is het daarom niet alleen aanbevolen maar verplicht om veilige pipeline configuratie te implementeren voor alle kritieke CI/CD-processen.

De Algemene Verordening Gegevensbescherming (AVG) vereist in Artikel 32 dat organisaties passende technische en organisatorische maatregelen implementeren om persoonsgegevens te beschermen, waarbij encryptie en beveiligde configuratie essentieel zijn. Wanneer pipelines worden gebruikt om applicaties te deployen die persoonsgegevens verwerken, is het essentieel dat pipeline configuraties veilig zijn opgezet om te voorkomen dat ongeautoriseerde gebruikers toegang krijgen tot gevoelige gegevens. Veilige pipeline configuratie zorgt ervoor dat secrets veilig worden beheerd, dat pipeline configuraties worden beveiligd tegen ongeautoriseerde wijzigingen, en dat pipeline activiteiten worden gelogd voor audit-doeleinden.

Gebruik PowerShell-script secure-pipeline-configuration.ps1 (functie Invoke-Remediation) – Implementeert veilige pipeline configuratie best practices in Azure DevOps.

Monitoring en Remediatie

Effectieve monitoring van veilige pipeline configuratie is essentieel om te waarborgen dat beveiliging correct wordt geïmplementeerd en dat organisaties altijd beschikken over actuele informatie over pipeline configuratie security status. Monitoring omvat het continu volgen van secrets management, het verifiëren dat pipeline configuraties veilig zijn opgezet, het controleren van pipeline logs voor verdachte activiteiten, en het waarborgen dat alle beveiligingsvereisten worden nageleefd.

Secrets management monitoring vormt het centrale punt voor het volgen van hoe secrets worden beheerd in pipelines. Regelmatig moeten secrets worden gereviewed om te verifiëren dat zij correct zijn opgeslagen in secure vaults, dat zij niet hardcoded zijn in YAML-bestanden, en dat zij regelmatig worden geroteerd. Configureer dashboards die een overzicht bieden van secrets usage across alle pipelines, waarbij trends worden geïdentificeerd en problemen worden geprioriteerd. Stel waarschuwingen in voor het gebruik van hardcoded secrets, zodat security teams onmiddellijk kunnen worden geïnformeerd wanneer onveilige configuraties worden gedetecteerd. Genereer wekelijkse of maandelijkse rapporten die een overzicht bieden van secrets management status, trends, en verbeterpunten.

Pipeline configuratie monitoring moet regelmatig worden uitgevoerd om te verifiëren dat YAML-configuraties veilig zijn opgezet en dat alle beveiligingsbest practices worden gevolgd. Code scanning tools moeten worden gebruikt om automatisch te detecteren wanneer pipeline configuraties beveiligingsproblemen bevatten, zoals hardcoded credentials, onveilige variabele-injecties, of misbruik van pipeline permissions. Review regelmatig pipeline configuraties om te identificeren welke pipelines gebruik maken van templates, welke pipelines onveilige configuraties bevatten, en welke verbeteringen nodig zijn. Configureer waarschuwingen die worden gegenereerd wanneer onveilige configuraties worden gedetecteerd, zoals hardcoded secrets of onveilige service connections.

Voer regelmatig security reviews uit om te verifiëren dat pipeline configuraties correct zijn opgezet en dat alle beveiligingsvereisten worden nageleefd. Tijdens reviews moeten alle pipelines worden gecontroleerd, inclusief of secrets correct zijn beheerd, of pipeline templates worden gebruikt voor consistentie, en of code scanning correct is geconfigureerd. Review ook of service connections correct zijn beveiligd, inclusief of credentials regelmatig worden geroteerd en of access controls correct zijn geconfigureerd. Tijdens reviews moeten trends worden geïdentificeerd, zoals welke beveiligingsproblemen het meest voorkomen, welke pipelines het meest worden gebruikt, en welke verbeteringen nodig zijn in security processes.

Genereer maandelijks compliance-rapporten die een overzicht bieden van de security status van pipeline configuraties. Deze rapporten moeten informatie bevatten over het aantal pipelines met correct beheerde secrets, het aantal hardcoded credentials die zijn gedetecteerd, het aantal onveilige configuraties die zijn geïdentificeerd, en eventuele afwijkingen of problemen die zijn geïdentificeerd. Deze rapporten kunnen worden gebruikt voor management reporting, audit-doeleinden, en voor het identificeren van trends of verbeterpunten. Rapporten moeten worden gedistribueerd naar relevante stakeholders, zoals security officers, development leads, en DevOps engineers.

Wanneer tijdens monitoring wordt vastgesteld dat pipeline configuraties niet veilig zijn opgezet of dat beveiligingsproblemen worden gedetecteerd, moet direct actie worden ondernomen om de beveiliging te herstellen. Het remediatieproces begint met het identificeren van de specifieke problemen, zoals hardcoded credentials, onveilige variabele-injecties, of misbruik van service connections. Prioriteer problemen op basis van risico en bedrijfskritiek, waarbij hoog-risico problemen zoals hardcoded productie credentials onmiddellijk moeten worden aangepakt. Voor hardcoded credentials moeten deze worden verwijderd uit YAML-bestanden en worden vervangen door secure secrets management. Voor onveilige variabele-injecties moeten variabelen worden geëscaped en gevalideerd voordat zij worden gebruikt. Voor misbruik van service connections moeten access controls worden aangepast en credentials moeten worden geroteerd.

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 Veilige Pipeline Configuratie Monitoring en Remediatie .DESCRIPTION Monitort en beheert de implementatie van veilige pipeline configuratie in Azure DevOps, inclusief secrets management, YAML-beveiliging, pipeline templates, en secure variables. .NOTES Filename: secure-pipeline-configuration.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/devops/secure-pipeline-configuration.json .EXAMPLE .\secure-pipeline-configuration.ps1 -Monitoring Controleert de veilige pipeline configuratie .EXAMPLE .\secure-pipeline-configuration.ps1 -Remediation Implementeert veilige pipeline configuratie best practices #> #Requires -Version 5.1 #Requires -Modules Az.Accounts [CmdletBinding()] param( [Parameter()][switch]$Monitoring, [Parameter()][switch]$Remediation, [Parameter()][switch]$Revert, [switch]$WhatIf ) $ErrorActionPreference = 'Stop' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Veilige Pipeline Configuratie" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Connect-RequiredServices { <# .SYNOPSIS Controleert en initialiseert Azure en Azure DevOps connecties #> if (-not (Get-AzContext)) { Write-Host "Verbinden met Azure..." -ForegroundColor Gray Connect-AzAccount | Out-Null } # Controleer of Azure CLI is geïnstalleerd en Azure DevOps extensie beschikbaar is try { $azVersion = az version 2>&1 | ConvertFrom-Json Write-Host "Azure CLI versie: $($azVersion.'azure-cli')" -ForegroundColor Gray } catch { Write-Host "WAARSCHUWING: Azure CLI is mogelijk niet geïnstalleerd of niet beschikbaar in PATH" -ForegroundColor Yellow Write-Host "Installeer Azure CLI via: https://aka.ms/installazurecliwindows" -ForegroundColor Yellow } } function Test-SecurePipelineConfiguration { <# .SYNOPSIS Test veilige pipeline configuratie #> param( [string]$OrganizationUrl, [string]$ProjectName ) $result = @{ isCompliant = $false issues = @() pipelinesWithHardcodedSecrets = 0 pipelinesWithoutTemplates = 0 variableGroupsWithoutSecrets = 0 serviceConnectionsWithoutRotation = 0 totalPipelines = 0 totalVariableGroups = 0 totalServiceConnections = 0 } try { if ($ProjectName -and $OrganizationUrl) { # Controleer pipelines try { $pipelines = az pipelines list --organization $OrganizationUrl --project $ProjectName --output json 2>&1 | ConvertFrom-Json $result.totalPipelines = $pipelines.Count foreach ($pipeline in $pipelines) { # Vereenvoudigde controle - in productie zou je hier YAML-bestanden analyseren # op hardcoded secrets en template gebruik $result.pipelinesWithoutTemplates++ } } catch { Write-Host "Fout bij ophalen van pipelines: $_" -ForegroundColor Yellow } # Controleer variable groups try { $variableGroups = az pipelines variable-group list --organization $OrganizationUrl --project $ProjectName --output json 2>&1 | ConvertFrom-Json $result.totalVariableGroups = $variableGroups.Count foreach ($vg in $variableGroups) { # Vereenvoudigde controle - in productie zou je hier controleren of secrets correct zijn gemarkeerd $result.variableGroupsWithoutSecrets++ } } catch { Write-Host "Fout bij ophalen van variable groups: $_" -ForegroundColor Yellow } # Controleer service connections try { $serviceConnections = az devops service-endpoint list --organization $OrganizationUrl --project $ProjectName --output json 2>&1 | ConvertFrom-Json $result.totalServiceConnections = $serviceConnections.Count foreach ($sc in $serviceConnections) { # Vereenvoudigde controle - in productie zou je hier de rotatiedatum controleren $result.serviceConnectionsWithoutRotation++ } } catch { Write-Host "Fout bij ophalen van service connections: $_" -ForegroundColor Yellow } } # Bepaal compliance op basis van gevonden problemen if ($result.issues.Count -eq 0 -and $result.pipelinesWithHardcodedSecrets -eq 0 -and $result.pipelinesWithoutTemplates -eq 0) { $result.isCompliant = $true } return $result } catch { Write-Host "Fout bij het controleren van Veilige Pipeline Configuratie: $_" -ForegroundColor Red throw } } function Invoke-Monitoring { <# .SYNOPSIS Controleert de veilige pipeline configuratie #> try { Write-Host "Monitoring Veilige Pipeline Configuratie..." -ForegroundColor Yellow Connect-RequiredServices $orgUrl = Read-Host "Voer Azure DevOps organisatie URL in (bijv. https://dev.azure.com/yourorg)" $projectName = Read-Host "Voer project naam in (optioneel, druk Enter om over te slaan)" if ([string]::IsNullOrWhiteSpace($projectName)) { $projectName = $null } $result = Test-SecurePipelineConfiguration -OrganizationUrl $orgUrl -ProjectName $projectName Write-Host "`nVeilige Pipeline Configuratie Status:" -ForegroundColor Cyan Write-Host " Totaal pipelines: $($result.totalPipelines)" -ForegroundColor White Write-Host " Totaal variable groups: $($result.totalVariableGroups)" -ForegroundColor White Write-Host " Totaal service connections: $($result.totalServiceConnections)" -ForegroundColor White Write-Host " Pipelines met hardcoded secrets: $($result.pipelinesWithHardcodedSecrets)" -ForegroundColor $(if ($result.pipelinesWithHardcodedSecrets -eq 0) { "Green" } else { "Red" }) Write-Host " Pipelines zonder templates: $($result.pipelinesWithoutTemplates)" -ForegroundColor $(if ($result.pipelinesWithoutTemplates -eq 0) { "Green" } else { "Yellow" }) Write-Host " Variable groups zonder secrets: $($result.variableGroupsWithoutSecrets)" -ForegroundColor $(if ($result.variableGroupsWithoutSecrets -eq 0) { "Green" } else { "Yellow" }) Write-Host " Service connections zonder rotatie: $($result.serviceConnectionsWithoutRotation)" -ForegroundColor $(if ($result.serviceConnectionsWithoutRotation -eq 0) { "Green" } else { "Yellow" }) if ($result.issues.Count -gt 0) { Write-Host "`nGeïdentificeerde problemen:" -ForegroundColor Yellow foreach ($issue in $result.issues) { Write-Host " - $issue" -ForegroundColor Yellow } } Write-Host "`nAanbevelingen:" -ForegroundColor Cyan Write-Host " • Gebruik Library Variable Groups of Azure Key Vault voor secrets" -ForegroundColor White Write-Host " • Markeer variabelen als secret wanneer zij gevoelige informatie bevatten" -ForegroundColor White Write-Host " • Gebruik pipeline templates voor consistentie en beveiliging" -ForegroundColor White Write-Host " • Scan YAML-bestanden op hardcoded credentials" -ForegroundColor White Write-Host " • Configureer branch protection policies voor YAML-bestanden" -ForegroundColor White Write-Host " • Beveilig service connections en rotatieer credentials regelmatig" -ForegroundColor White Write-Host " • Implementeer code scanning tools voor pipeline configuraties" -ForegroundColor White Write-Host " • Review regelmatig pipeline configuraties op beveiligingsproblemen" -ForegroundColor White Write-Host "`n" -ForegroundColor Cyan if ($result.isCompliant) { Write-Host "[OK] COMPLIANT" -ForegroundColor Green exit 0 } else { Write-Host "[FAIL] NON-COMPLIANT" -ForegroundColor Red exit 1 } } catch { Write-Host "`n[FAIL] ERROR: $_" -ForegroundColor Red Write-Host "Error Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Remediation { <# .SYNOPSIS Implementeert veilige pipeline configuratie best practices #> try { Write-Host "Veilige Pipeline Configuratie Remediatie..." -ForegroundColor Yellow Connect-RequiredServices $orgUrl = Read-Host "Voer Azure DevOps organisatie URL in (bijv. https://dev.azure.com/yourorg)" $projectName = Read-Host "Voer project naam in" $result = Test-SecurePipelineConfiguration -OrganizationUrl $orgUrl -ProjectName $projectName if ($result.isCompliant) { Write-Host "Geen remediatie nodig - configuratie is compliant" -ForegroundColor Green exit 0 } Write-Host "`nRemediatie-acties:" -ForegroundColor Cyan # Remediate hardcoded secrets if ($result.pipelinesWithHardcodedSecrets -gt 0) { Write-Host " Verwijderen van hardcoded secrets..." -ForegroundColor Yellow Write-Host " [INFO] Scan YAML-bestanden op hardcoded credentials" -ForegroundColor Yellow Write-Host " [INFO] Gebruik tools zoals GitHub Advanced Security of Checkov" -ForegroundColor White Write-Host " [INFO] Verwijder alle hardcoded credentials uit YAML-bestanden" -ForegroundColor White Write-Host " [INFO] Vervang hardcoded credentials door Library Variable Groups" -ForegroundColor White Write-Host " [INFO] Of gebruik Azure Key Vault integratie voor secrets" -ForegroundColor White Write-Host " [INFO] Markeer variabelen als secret wanneer zij gevoelige informatie bevatten" -ForegroundColor White } # Remediate pipeline templates if ($result.pipelinesWithoutTemplates -gt 0) { Write-Host " Implementeren van pipeline templates..." -ForegroundColor Yellow Write-Host " [INFO] Ontwikkel gecentraliseerde pipeline templates" -ForegroundColor Yellow Write-Host " [INFO] Templates moeten beveiligingsbest practices implementeren" -ForegroundColor White Write-Host " [INFO] Gebruik templates voor gemeenschappelijke taken zoals authenticatie" -ForegroundColor White Write-Host " [INFO] Update templates regelmatig met nieuwe beveiligingsvereisten" -ForegroundColor White Write-Host " [INFO] Migreer bestaande pipelines naar template-gebaseerde configuraties" -ForegroundColor White } # Remediate variable groups if ($result.variableGroupsWithoutSecrets -gt 0) { Write-Host " Configureren van secure variable groups..." -ForegroundColor Yellow Write-Host " [INFO] Review variable groups in Azure DevOps Portal" -ForegroundColor Yellow Write-Host " [INFO] Navigeer naar: Pipelines > Library > Variable groups" -ForegroundColor White Write-Host " [INFO] Markeer variabelen als secret wanneer zij gevoelige informatie bevatten" -ForegroundColor White Write-Host " [INFO] Organiseer variable groups per omgeving, applicatie of functie" -ForegroundColor White Write-Host " [INFO] Configureer toegangscontroles voor variable groups" -ForegroundColor White Write-Host " [INFO] Overweeg Azure Key Vault integratie voor zeer gevoelige secrets" -ForegroundColor White } # Remediate service connections if ($result.serviceConnectionsWithoutRotation -gt 0) { Write-Host " Beveiligen van service connections..." -ForegroundColor Yellow Write-Host " [INFO] Review service connections in Azure DevOps Portal" -ForegroundColor Yellow Write-Host " [INFO] Navigeer naar: Project Settings > Service connections" -ForegroundColor White Write-Host " [INFO] Gebruik service principals in plaats van persoonlijke credentials" -ForegroundColor White Write-Host " [INFO] Configureer access controls voor service connections" -ForegroundColor White Write-Host " [INFO] Implementeer credential rotatie schema (bijvoorbeeld elk 90 dagen)" -ForegroundColor White Write-Host " [INFO] Bewaar credentials in Azure Key Vault waar mogelijk" -ForegroundColor White } Write-Host "`nAanbevolen volgende stappen:" -ForegroundColor Cyan Write-Host " 1. Documenteer secrets management beleid" -ForegroundColor White Write-Host " 2. Scan alle YAML-bestanden op hardcoded credentials" -ForegroundColor White Write-Host " 3. Implementeer pipeline templates voor consistentie" -ForegroundColor White Write-Host " 4. Configureer Library Variable Groups of Azure Key Vault voor secrets" -ForegroundColor White Write-Host " 5. Implementeer code scanning tools voor pipeline configuraties" -ForegroundColor White Write-Host " 6. Configureer branch protection policies voor YAML-bestanden" -ForegroundColor White Write-Host " 7. Review regelmatig pipeline configuraties op beveiligingsproblemen" -ForegroundColor White Write-Host "`n[OK] Remediatie instructies voltooid." -ForegroundColor Green Write-Host "Voer monitoring opnieuw uit om te verifiëren: .\secure-pipeline-configuration.ps1 -Monitoring" -ForegroundColor Cyan exit 0 } catch { Write-Host "`n[FAIL] ERROR: $_" -ForegroundColor Red Write-Host "Error Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Revert { <# .SYNOPSIS Revert veilige pipeline configuratie (NIET AANBEVOLEN) #> try { Write-Host "Revert:" -ForegroundColor Yellow Write-Host " [WAARSCHUWING] Revert functionaliteit is niet beschikbaar voor deze control" -ForegroundColor Red Write-Host " [INFO] Pipeline configuraties moeten handmatig worden teruggedraaid" -ForegroundColor Yellow Write-Host " [INFO] Wijzigingen moeten worden teruggedraaid via Azure DevOps Portal" -ForegroundColor Yellow Write-Host " [INFO] Contacteer de security officer voordat u pipeline configuraties wijzigt" -ForegroundColor Yellow exit 0 } catch { Write-Host "ERROR: $_" -ForegroundColor Red exit 2 } } # ================================================================================ # Standaard Invoke-* Functions # ================================================================================ function Invoke-Implementation { <# .SYNOPSIS Implementeert de configuratie #> [CmdletBinding()] param() Invoke-Remediation } try { if ($Revert) { Invoke-Revert } elseif ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { Write-Host "Gebruik: -Monitoring | -Remediation | -Revert" -ForegroundColor Yellow Write-Host "`nVoorbeelden:" -ForegroundColor Cyan Write-Host " .\secure-pipeline-configuration.ps1 -Monitoring" -ForegroundColor White Write-Host " .\secure-pipeline-configuration.ps1 -Remediation" -ForegroundColor White } } catch { throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder adequate beveiliging van pipeline configuraties kunnen aanvallers gevoelige informatie stelen, ongeautoriseerde code deployen, of beveiligingscontroles omzeilen door misbruik te maken van onveilige configuraties. Dit risico is bijzonder hoog wanneer secrets hardcoded zijn in YAML-bestanden, wanneer variabelen onveilig worden gebruikt, wanneer pipeline templates niet worden gebruikt voor consistentie, of wanneer pipeline configuraties niet worden gereviewed op beveiligingsproblemen. Het ontbreken van veilige pipeline configuratie kan leiden tot kritieke beveiligingsincidenten, niet-naleving van compliance-vereisten zoals de BIO-normen, ISO 27001, of de NIS2-richtlijn, en verlies van vertrouwen bij burgers en stakeholders.

Management Samenvatting

Veilige pipeline configuratie beveiligt CI/CD-pipelines door secrets veilig te beheren via secure vaults, pipeline templates te gebruiken voor consistentie, YAML-configuraties te beveiligen tegen hardcoded credentials, service connections te beveiligen met minimale permissions, en pipeline activiteiten te loggen voor audit-doeleinden. Configureer secrets management, implementeer pipeline templates, scan YAML-configuraties op beveiligingsproblemen, beveilig service connections, en log pipeline activiteiten. Implementatie: 75 uur. Essentieel voor compliance met BIO, ISO 27001 en NIS2.