Security Champions Program: Verankering Van Beveiliging In DevOps-teams

💼 Management Samenvatting

Een Security Champions Program brengt beveiligingskennis en -bewustzijn direct naar de frontlinie van softwareontwikkeling: de ontwikkelteams zelf. In plaats van dat security-teams achteraf code reviewen of incidenten oplossen, worden ontwikkelaars binnen hun teams opgeleid tot security champions die proactief beveiligingsaspecten meenemen in hun dagelijkse werk. Voor Nederlandse overheidsorganisaties die Microsoft 365, Azure en Power Platform gebruiken, is een Security Champions Program essentieel om veiligheid vroeg in het ontwikkelproces te verankeren en om compliance met BIO, NIS2 en AVG te borgen zonder de ontwikkelingstrajecten te vertragen.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
140u (tech: 60u)
Van toepassing op:
Microsoft 365
Azure DevOps
Power Platform
GitHub
DevOps-teams
Ontwikkelteams

Traditionele security-aanpakken waarbij security-teams achteraf controleren en goedkeuren, werken niet meer in moderne DevOps-omgevingen waar code dagelijks wordt geïmplementeerd en waar snelheid cruciaal is. Ontwikkelteams die geen security-kennis hebben, maken onbewust fouten die tot kwetsbaarheden leiden: ze implementeren authenticatie verkeerd, slaan gevoelige data onversleuteld op, gebruiken onveilige API's, of vergeten logging en monitoring. Zonder security champions in de teams blijven deze problemen onopgemerkt totdat ze worden ontdekt in code reviews, security scans of erger: tijdens een incident. Een Security Champions Program lost dit op door security-kennis direct bij ontwikkelaars te brengen, door security-best practices te integreren in dagelijkse workflows, en door een cultuur te creëren waarin security niet een rem is op innovatie maar een integraal onderdeel van kwaliteit. Voor Nederlandse overheidsorganisaties is dit extra belangrijk omdat publieke sectorapplicaties vaak met gevoelige data werken en omdat compliance-vereisten (AVG, BIO, NIS2) expliciet eisen dat beveiliging wordt geborgd in ontwikkelprocessen. Zonder security champions die deze vereisten begrijpen en kunnen vertalen naar concrete code en configuraties, blijven organisaties afhankelijk van externe security-teams die vaak te laat worden betrokken en die de context van het project onvoldoende kennen.

PowerShell Modules Vereist
Primary API: Microsoft Graph API, Azure DevOps API, GitHub API
Connection: Connect-MgGraph, Azure DevOps REST API
Required Modules: Microsoft.Graph, Az.Accounts

Implementatie

Dit artikel beschrijft hoe Nederlandse overheidsorganisaties een Security Champions Program opzetten voor DevOps-teams die werken met Microsoft 365, Azure, Power Platform en gerelateerde technologieën. We behandelen de governance en structuur van het programma: hoe worden security champions geselecteerd, welke rollen en verantwoordelijkheden hebben zij, en hoe worden zij ondersteund door centrale security-teams. Daarna gaan we in op de inhoudelijke training en ontwikkeling: welke security-kennis is nodig voor Microsoft 365- en Azure-ontwikkeling, hoe worden security best practices vertaald naar concrete richtlijnen en checklists, en hoe worden champions bijgeschoold wanneer nieuwe dreigingen of technologieën opkomen. Vervolgens behandelen we de praktische implementatie: hoe worden security champions ingebed in DevOps-workflows, hoe werken zij samen met security-teams, en welke tools en processen ondersteunen hun werk. Tot slot gaan we in op meting en verbetering: hoe wordt de effectiviteit van het programma gemeten, hoe worden successen gedeeld, en hoe wordt het programma continu verbeterd. Het bijbehorende PowerShell-script ondersteunt organisaties bij het inventariseren van security champions, het monitoren van security-activiteiten in DevOps-pipelines, en het genereren van rapportages over de impact van het programma.

Governance en structuur van het Security Champions Program

Een succesvol Security Champions Program begint bij heldere governance en structuur. De organisatie moet expliciet vastleggen waarom het programma bestaat, wat de doelen zijn, wie verantwoordelijk is voor het programma, en hoe het wordt gefinancierd en ondersteund. Voor Nederlandse overheidsorganisaties betekent dit dat bestuur en directie het programma moeten onderschrijven als onderdeel van de informatiebeveiligingsstrategie en dat er budget en tijd worden vrijgemaakt voor training, ondersteuning en beloning van security champions. Zonder bestuurlijke steun en expliciete toewijzing van middelen verzandt het programma al snel in goede bedoelingen zonder concrete resultaten.

De structuur van het programma moet passen bij de organisatiecultuur en -grootte. In kleinere organisaties kunnen security champions direct rapporteren aan de CISO of security officer, terwijl grotere organisaties wellicht een Security Champions Program Manager aanstellen die het programma coördineert, trainingen organiseert, en de verbinding legt tussen champions en centrale security-teams. Belangrijk is dat security champions een duidelijk punt van contact hebben voor vragen, ondersteuning en escalatie. Daarnaast moet er een community zijn waarin champions kennis en ervaringen kunnen delen, bijvoorbeeld via een Microsoft Teams-kanaal, regelmatige bijeenkomsten, of een interne wiki of knowledge base. Deze community zorgt ervoor dat champions niet geïsoleerd raken en dat goede praktijken worden gedeeld tussen teams.

De selectie van security champions is cruciaal voor het succes van het programma. Champions moeten intrinsiek gemotiveerd zijn voor security, bereid zijn om extra tijd te investeren in training en ondersteuning van collega's, en voldoende technische kennis hebben om security-aspecten te begrijpen en te implementeren. Het is niet nodig dat champions security-experts zijn vanaf het begin; het programma moet juist groei en ontwikkeling mogelijk maken. Wel moeten champions enige affiniteit met security hebben en bereid zijn om te leren. Idealiter worden champions geselecteerd uit elk ontwikkelteam, zodat elk team ten minste één persoon heeft die security-kennis heeft en als eerste aanspreekpunt kan fungeren voor security-vraagstukken. In grotere teams kunnen meerdere champions worden aangesteld, eventueel met verschillende specialisaties (bijvoorbeeld een champion voor authenticatie, een voor data protection, en een voor compliance).

Belangrijk is dat security champions expliciete tijd krijgen voor hun rol. Security is geen bijzaak die in vrije tijd moet worden opgepakt; champions moeten formeel tijd krijgen (bijvoorbeeld 10-20% van hun tijd) voor training, code reviews, security-activiteiten, en ondersteuning van collega's. Deze tijd moet worden vastgelegd in functiebeschrijvingen en werkplannen, en managers moeten worden getraind om deze tijd te respecteren en te ondersteunen. Zonder expliciete tijdstoewijzing raken champions overbelast en komt het programma niet van de grond. Daarnaast moeten champions worden erkend en beloond voor hun bijdrage, bijvoorbeeld door hun rol expliciet te maken in beoordelingsgesprekken, door certificeringen en trainingen te financieren, of door successen te delen in organisatiebrede communicatie.

Training en ontwikkeling van Security Champions

Security champions hebben specifieke training nodig om effectief te zijn in hun rol. Training moet zich richten op zowel algemene security-principes als specifieke kennis voor Microsoft 365, Azure en Power Platform-ontwikkeling. Algemene security-kennis omvat onderwerpen zoals secure coding practices, authenticatie en autorisatie, encryptie, input validation, error handling, logging en monitoring, en common vulnerabilities zoals OWASP Top 10. Specifieke Microsoft 365- en Azure-kennis omvat onderwerpen zoals Microsoft Entra ID (voorheen Azure AD) en Conditional Access, Microsoft Graph API security, Azure Key Vault voor secrets management, Azure App Service security, Power Platform security en data loss prevention, en compliance-vereisten voor AVG, BIO en NIS2 binnen Microsoft 365 en Azure.

Training moet praktisch en hands-on zijn. Theoretische kennis alleen is niet voldoende; champions moeten leren hoe ze security-best practices daadwerkelijk implementeren in code, configuraties en workflows. Training kan bestaan uit workshops waarin champions samenwerken aan praktijkcases, code review-sessies waarin bestaande code wordt geanalyseerd op security-aspecten, hands-on labs waarin verschillende attack vectors worden gedemonstreerd en verdedigd, en capture-the-flag-achtige oefeningen waarin champions hun kennis in praktijk brengen. Daarnaast moeten champions toegang krijgen tot security-resources zoals OWASP-richtlijnen, Microsoft Security Baselines, compliance-frameworks, en interne security-standaarden en -checklists.

Training moet ook continu zijn. Security is een snel veranderend vakgebied waarbij nieuwe dreigingen, kwetsbaarheden en best practices regelmatig opkomen. Champions moeten daarom regelmatig bijgeschoold worden, bijvoorbeeld door maandelijkse security-updates, kwartaalbijeenkomsten waarin nieuwe dreigingen en mitigaties worden besproken, jaarlijkse deep-dive trainingen over specifieke onderwerpen, en toegang tot security-conferenties en certificeringen. Het programma moet een leertraject hebben dat champions helpt om zich te ontwikkelen van beginners naar experts, bijvoorbeeld door certificeringen zoals Microsoft Certified: Azure Security Engineer Associate, of door interne security-certificeringen die zijn afgestemd op de organisatie-specifieke context en vereisten.

Naast formele training is peer learning essentieel. Champions leren veel van elkaar door ervaringen te delen, door samen te werken aan complexe security-vraagstukken, en door feedback te geven op elkaars werk. Het programma moet daarom regelmatige bijeenkomsten organiseren waarin champions cases bespreken, lessons learned delen, en elkaar ondersteunen bij het oplossen van security-problemen. Daarnaast kunnen meer ervaren champions mentor zijn voor nieuwe champions, waardoor kennis en ervaring worden doorgegeven en het programma duurzaam wordt verankerd in de organisatie.

Integratie van Security Champions in DevOps-workflows

Security champions zijn het meest effectief wanneer ze zijn ingebed in de dagelijkse DevOps-workflows. Ze moeten niet alleen worden geraadpleegd bij grote security-reviews, maar moeten actief betrokken zijn bij planning, design, ontwikkeling, testing en deployment. Tijdens planning en design kunnen champions security-requirements helpen identificeren, threat modeling uitvoeren, en security-architectuur meedenken. Tijdens ontwikkeling kunnen champions code reviews uitvoeren met focus op security, security-best practices toepassen, en collega's helpen bij security-vraagstukken. Tijdens testing kunnen champions security-testing uitvoeren, penetration testing ondersteunen, en vulnerability scans interpreteren. Tijdens deployment kunnen champions security-configuraties controleren, secrets management verifiëren, en monitoring en logging instellen.

Voor Microsoft 365- en Azure-ontwikkeling betekent dit dat security champions betrokken zijn bij het configureren van Microsoft Entra ID-applicaties en -permissions, bij het instellen van Conditional Access policies, bij het gebruik van Azure Key Vault voor secrets, bij het configureren van Power Platform-security settings, en bij het implementeren van data loss prevention en sensitivity labels. Champions moeten ook betrokken zijn bij het opzetten van CI/CD-pipelines zodat security-checks automatisch worden uitgevoerd, zoals static code analysis, dependency scanning, secret scanning, en compliance-checks. Door security vroeg en automatisch in te bouwen, worden problemen sneller opgemerkt en opgelost voordat code in productie komt.

Security champions werken ook samen met centrale security-teams. Champions zijn de ogen en oren van security-teams in de ontwikkelteams; zij signaleren security-problemen, vragen om ondersteuning wanneer complexe security-vraagstukken opkomen, en escaleren incidenten naar security-teams wanneer dat nodig is. Security-teams ondersteunen champions op hun beurt door training te verzorgen, door security-tools en -processen beschikbaar te stellen, door complexe security-vraagstukken te helpen oplossen, en door het Security Champions Program te coördineren en te verbeteren. Deze samenwerking zorgt ervoor dat security-kennis zowel gecentraliseerd als gedistribueerd is: security-teams behouden strategische en complexe expertise, terwijl champions praktische, team-specifieke security-kennis hebben.

Gebruik PowerShell-script security-champions-program.ps1 (functie Invoke-SecurityChampionsInventory) – Inventariseert security champions in de organisatie, monitort security-activiteiten in DevOps-pipelines, en genereert rapportages over de impact van het Security Champions Program..

Tools en processen voor Security Champions

Security champions hebben toegang nodig tot tools en processen die hen ondersteunen in hun werk. Belangrijke tools zijn security-scanning tools zoals GitHub Advanced Security, Azure DevOps Security Scans, en Microsoft Defender for Cloud, die automatisch kwetsbaarheden en misconfiguraties detecteren in code en configuraties. Champions moeten weten hoe ze deze tools gebruiken, hoe ze resultaten interpreteren, en hoe ze problemen oplossen die door de tools worden geïdentificeerd. Daarnaast hebben champions toegang nodig tot security-documentatie en -richtlijnen, bijvoorbeeld via een centrale wiki, SharePoint-site, of knowledge base waarin security-best practices, compliance-vereisten, en interne standaarden zijn gedocumenteerd.

Processen moeten duidelijk zijn en geautomatiseerd waar mogelijk. Champions moeten bijvoorbeeld weten wanneer ze security-reviews moeten uitvoeren (bijvoorbeeld voor elke pull request of voor elke deployment naar productie), welke checklist ze moeten gebruiken, en wanneer ze moeten escaleren naar security-teams. Processen moeten worden gedocumenteerd en geautomatiseerd waar mogelijk, bijvoorbeeld door security-checks automatisch uit te voeren in CI/CD-pipelines, door templates te gebruiken voor security-reviews, en door workflows te gebruiken voor escalatie en tracking van security-issues. Dit voorkomt dat champions elke keer opnieuw moeten bedenken wat ze moeten doen en zorgt voor consistentie tussen teams.

Champions moeten ook een platform hebben voor communicatie en samenwerking. Dit kan een Microsoft Teams-kanaal zijn waarin champions vragen stellen, cases delen, en elkaar ondersteunen, een regelmatige meeting waarin champions bijeenkomen om te discussiëren over security-vraagstukken, of een intern forum of wiki waarin knowledge wordt gedeeld. Daarnaast moeten champions een duidelijk proces hebben voor het melden van security-incidenten en -kwetsbaarheden, zodat problemen snel worden opgemerkt en opgelost zonder dat champions bang zijn voor negatieve gevolgen wanneer ze problemen melden.

Meting en continue verbetering van het Security Champions Program

De effectiviteit van het Security Champions Program moet worden gemeten om te beoordelen of het programma zijn doelen bereikt en om continu verbeteringen door te voeren. Belangrijke metrics zijn het aantal security champions per team, het percentage ontwikkelteams met ten minste één security champion, het aantal security-trainingen en -sessies die zijn gevolgd, het aantal security-code reviews dat is uitgevoerd, het aantal security-issues dat is geïdentificeerd en opgelost voordat code in productie kwam, de tijd die nodig is om security-issues op te lossen, en het aantal security-incidenten en -kwetsbaarheden in productie. Deze metrics geven inzicht in de groei van het programma, de activiteit van champions, en de impact op security-posture van de organisatie.

Naast kwantitatieve metrics zijn kwalitatieve feedback en success stories belangrijk. Champions en ontwikkelteams moeten regelmatig worden gevraagd naar hun ervaringen met het programma: wat werkt goed, wat kan beter, welke ondersteuning hebben ze nodig, en welke successen hebben ze geboekt. Deze feedback kan worden verzameld via surveys, interviews, of retrospectives, en moet worden gebruikt om het programma te verbeteren. Success stories moeten worden gedeeld in organisatiebrede communicatie om het programma zichtbaarheid te geven en om andere teams te inspireren om ook security champions aan te stellen of om meer te investeren in security.

Het programma moet regelmatig worden geëvalueerd en aangepast. Security is een snel veranderend vakgebied, en het programma moet meebewegen met nieuwe dreigingen, technologieën en best practices. Daarnaast verandert de organisatie zelf: nieuwe teams worden opgericht, bestaande teams worden gereorganiseerd, en nieuwe technologieën worden geadopteerd. Het programma moet daarom periodiek worden beoordeeld (bijvoorbeeld jaarlijks) om te evalueren of het nog voldoet aan de behoeften van de organisatie, of er aanpassingen nodig zijn in structuur, training, of processen, en of het programma moet worden uitgebreid of aangepast. Door continu te meten, te leren en te verbeteren, blijft het Security Champions Program relevant en effectief in het verankeren van security in DevOps-teams.

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 Security Champions Program Monitoring en Inventarisatie .DESCRIPTION Inventariseert security champions in de organisatie, monitort security-activiteiten in DevOps-pipelines, en genereert rapportages over de impact van het Security Champions Program. Dit script ondersteunt het artikel content/m365/devops/security-champions-program.json binnen het project "Nederlandse Baseline voor Veilige Cloud". .NOTES Filename: security-champions-program.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Last Modified: 2025-01-15 Version: 1.0 Related JSON: content/m365/devops/security-champions-program.json Requires: Microsoft 365-tenant, Azure DevOps of GitHub organisatie Modules: Microsoft.Graph, Az.Accounts .EXAMPLE .\security-champions-program.ps1 -ChampionsInventory Inventariseert security champions in de organisatie .EXAMPLE .\security-champions-program.ps1 -Monitoring Monitort security-activiteiten in DevOps-pipelines .EXAMPLE .\security-champions-program.ps1 -ChampionsInventory -Monitoring -DebugMode Voert beide functies uit met voorbeelddata (lokaal testen) #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph [CmdletBinding()] param( [Parameter(HelpMessage = "Inventariseer security champions in de organisatie")] [switch]$ChampionsInventory, [Parameter(HelpMessage = "Monitor security-activiteiten in DevOps-pipelines")] [switch]$Monitoring, [Parameter(HelpMessage = "Voer een veilige lokale test uit met voorbeelddata (geen cloudverbinding)")] [switch]$DebugMode, [Parameter(HelpMessage = "Pad naar het optionele rapportbestand")] [string]$OutputPath, [Parameter(HelpMessage = "Show what would happen without making changes")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' # ============================================================================ # HEADER # ============================================================================ Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Security Champions Program" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # ============================================================================ # CONFIGURATIE # ============================================================================ $SecurityChampionsGroupName = "Security Champions" $DevOpsSecurityChannelName = "Security Champions Community" $SecurityTrainingMinimumHours = 8 # ============================================================================ # FUNCTIES # ============================================================================ function Connect-RequiredServices { <# .SYNOPSIS Verbindt met benodigde Microsoft services #> [CmdletBinding()] param() if ($DebugMode) { Write-Host "DebugMode: er wordt geen verbinding gemaakt met Microsoft-services." -ForegroundColor Yellow return $true } Write-Verbose "Controleren van Microsoft Graph verbinding..." try { $context = Get-MgContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Microsoft Graph..." -ForegroundColor Yellow Connect-MgGraph -Scopes "User.Read.All", "Group.Read.All", "Team.ReadBasic.All" -ErrorAction Stop Write-Host "Verbonden met Microsoft Graph" -ForegroundColor Green } else { Write-Verbose "Reeds verbonden met Microsoft Graph" } } catch { Write-Error "Kon niet verbinden met Microsoft Graph: $_" throw } } function Get-SecurityChampionsInventorySample { <# .SYNOPSIS Voorbeelddata voor lokale DebugMode-tests #> return @( [PSCustomObject]@{ UserPrincipalName = "champion1@example.nl" DisplayName = "Jan van der Berg" Department = "Ontwikkeling" Team = "Development Team A" TrainingHours = 12 LastTrainingDate = (Get-Date).AddMonths(-2) Certifications = @("Microsoft Azure Security Engineer") ActiveProjects = 3 SecurityReviews = 15 }, [PSCustomObject]@{ UserPrincipalName = "champion2@example.nl" DisplayName = "Marieke de Vries" Department = "Power Platform" Team = "Citizen Development" TrainingHours = 16 LastTrainingDate = (Get-Date).AddMonths(-1) Certifications = @() ActiveProjects = 2 SecurityReviews = 8 }, [PSCustomObject]@{ UserPrincipalName = "champion3@example.nl" DisplayName = "Pieter Jansen" Department = "Azure DevOps" Team = "Infrastructure Team" TrainingHours = 20 LastTrainingDate = (Get-Date).AddMonths(-3) Certifications = @("Microsoft Azure Security Engineer", "OWASP Top 10") ActiveProjects = 5 SecurityReviews = 32 } ) } function Invoke-SecurityChampionsInventory { <# .SYNOPSIS Inventariseert security champions in de organisatie .DESCRIPTION Haalt een overzicht op van alle security champions, inclusief hun training, certificeringen, en activiteiten. .OUTPUTS Array van PSCustomObject met champion-informatie #> [CmdletBinding()] param() try { Write-Host "`nInventariseren van Security Champions..." -ForegroundColor Yellow Write-Host "=========================================" -ForegroundColor Yellow $champions = if ($DebugMode) { Write-Host "DebugMode: gebruik voorbeelddata voor champions inventarisatie." -ForegroundColor Yellow Get-SecurityChampionsInventorySample } else { # Zoek naar Security Champions groep in Azure AD Write-Host "Zoeken naar Security Champions groep..." -ForegroundColor Gray try { $group = Get-MgGroup -Filter "displayName eq '$SecurityChampionsGroupName'" -ErrorAction SilentlyContinue if (-not $group) { Write-Host " Waarschuwing: Security Champions groep niet gevonden: $SecurityChampionsGroupName" -ForegroundColor Yellow Write-Host " Tip: Maak een groep aan in Azure AD met de naam '$SecurityChampionsGroupName'" -ForegroundColor Yellow return @() } Write-Host " Groep gevonden: $($group.DisplayName)" -ForegroundColor Green # Haal leden van de groep op $members = Get-MgGroupMember -GroupId $group.Id -ErrorAction Stop Write-Host " Aantal leden gevonden: $($members.Count)" -ForegroundColor Green $championList = @() foreach ($member in $members) { $user = Get-MgUser -UserId $member.Id -Property DisplayName, UserPrincipalName, Department, JobTitle -ErrorAction SilentlyContinue if ($user) { # Vereenvoudigde champion-data (in productie zou dit uitgebreider zijn) $championList += [PSCustomObject]@{ UserPrincipalName = $user.UserPrincipalName DisplayName = $user.DisplayName Department = $user.Department ?? "Niet gespecificeerd" Team = $user.JobTitle ?? "Niet gespecificeerd" TrainingHours = $null # Zou uit trainingssysteem moeten komen LastTrainingDate = $null Certifications = @() # Zou uit certificeringssysteem moeten komen ActiveProjects = $null SecurityReviews = $null } } } Write-Host " Opmerking: Vul deze functie aan met organisatie-specifieke data" -ForegroundColor Yellow Write-Host " - Training hours uit trainingssysteem of HR-systeem" -ForegroundColor Yellow Write-Host " - Certificeringen uit certificeringsplatform" -ForegroundColor Yellow Write-Host " - Activiteiten uit Azure DevOps / GitHub / projectmanagement tools" -ForegroundColor Yellow $championList } catch { Write-Host " Fout bij ophalen van champions: $_" -ForegroundColor Red return @() } } # Toon samenvatting Write-Host "`nSamenvatting Security Champions:" -ForegroundColor Cyan Write-Host " Totaal aantal champions: $($champions.Count)" -ForegroundColor White if ($champions.Count -gt 0) { $teamsWithChampions = ($champions | Select-Object -Unique Team).Count Write-Host " Teams met champions: $teamsWithChampions" -ForegroundColor White $championsWithTraining = ($champions | Where-Object { $_.TrainingHours -ge $SecurityTrainingMinimumHours }).Count Write-Host " Champions met voldoende training (>=$SecurityTrainingMinimumHours uur): $championsWithTraining" -ForegroundColor White if ($champions.Count -gt 0) { $avgReviews = [math]::Round(($champions | Measure-Object -Property SecurityReviews -Average -ErrorAction SilentlyContinue).Average, 1) Write-Host " Gemiddeld aantal security reviews per champion: $avgReviews" -ForegroundColor White } } # Toon details per champion Write-Host "`nDetails per Security Champion:" -ForegroundColor Cyan foreach ($champion in $champions) { Write-Host "`n Naam: $($champion.DisplayName)" -ForegroundColor White Write-Host " E-mail: $($champion.UserPrincipalName)" -ForegroundColor Gray Write-Host " Afdeling: $($champion.Department)" -ForegroundColor Gray Write-Host " Team: $($champion.Team)" -ForegroundColor Gray if ($champion.TrainingHours) { Write-Host " Training: $($champion.TrainingHours) uur" -ForegroundColor Gray } if ($champion.LastTrainingDate) { Write-Host " Laatste training: $($champion.LastTrainingDate.ToString('yyyy-MM-dd'))" -ForegroundColor Gray } if ($champion.Certifications -and $champion.Certifications.Count -gt 0) { Write-Host " Certificeringen: $($champion.Certifications -join ', ')" -ForegroundColor Gray } if ($champion.SecurityReviews) { Write-Host " Security reviews: $($champion.SecurityReviews)" -ForegroundColor Gray } } if ($OutputPath -and $champions.Count -gt 0) { $reportLines = @() $reportLines += "Security Champions Inventarisatie" $reportLines += "=================================" $reportLines += "" $reportLines += "Datum: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" $reportLines += "Totaal aantal champions: $($champions.Count)" $reportLines += "" foreach ($champion in $champions) { $reportLines += "Naam: $($champion.DisplayName)" $reportLines += "E-mail: $($champion.UserPrincipalName)" $reportLines += "Afdeling: $($champion.Department)" $reportLines += "Team: $($champion.Team)" if ($champion.TrainingHours) { $reportLines += "Training: $($champion.TrainingHours) uur" } if ($champion.Certifications.Count -gt 0) { $reportLines += "Certificeringen: $($champion.Certifications -join ', ')" } if ($champion.SecurityReviews) { $reportLines += "Security reviews: $($champion.SecurityReviews)" } $reportLines += "" } try { $reportLines | Out-File -FilePath $OutputPath -Encoding UTF8 Write-Host "`nRapport weggeschreven naar: $OutputPath" -ForegroundColor Green } catch { Write-Host "`nWaarschuwing: rapport kon niet worden weggeschreven: $_" -ForegroundColor Yellow } } return $champions } catch { Write-Error "Fout tijdens inventarisatie: $_" throw } } function Get-SecurityActivitiesSample { <# .SYNOPSIS Voorbeelddata voor security-activiteiten monitoring #> return [PSCustomObject]@{ TotalSecurityReviews = 45 ReviewsLastMonth = 18 SecurityIssuesFound = 12 IssuesResolved = 10 AverageResolutionTime = 3.5 SecurityScansRun = 156 VulnerabilitiesFound = 8 VulnerabilitiesFixed = 7 SecurityTrainingCompleted = 5 TeamsWithChampions = 8 TeamsWithoutChampions = 3 } } function Invoke-Monitoring { <# .SYNOPSIS Monitort security-activiteiten in DevOps-pipelines .DESCRIPTION Analyseert security-activiteiten zoals code reviews, security scans, en kwetsbaarheidsbeheer om de impact van het Security Champions Program te meten. .OUTPUTS PSCustomObject met monitoring resultaten #> [CmdletBinding()] param() try { Write-Host "`nMonitoring Security Activiteiten..." -ForegroundColor Yellow Write-Host "===================================" -ForegroundColor Yellow $activities = if ($DebugMode) { Write-Host "DebugMode: gebruik voorbeelddata voor security activiteiten." -ForegroundColor Yellow Get-SecurityActivitiesSample } else { Write-Host "Controleren van security-activiteiten..." -ForegroundColor Gray # In productie zou hier data worden opgehaald uit: # - Azure DevOps REST API (voor code reviews en security scans) # - GitHub API (voor security alerts en code scanning) # - Microsoft Graph (voor Teams-activiteiten en training) # - SIEM/Security tools (voor incidenten en kwetsbaarheden) Write-Host " Opmerking: Vul deze functie aan met organisatie-specifieke data" -ForegroundColor Yellow Write-Host " - Azure DevOps REST API voor code reviews en security scans" -ForegroundColor Yellow Write-Host " - GitHub API voor security alerts en Dependabot" -ForegroundColor Yellow Write-Host " - Microsoft Graph voor Teams-activiteiten" -ForegroundColor Yellow Write-Host " - Security tools voor incidenten en kwetsbaarheden" -ForegroundColor Yellow [PSCustomObject]@{ TotalSecurityReviews = 0 ReviewsLastMonth = 0 SecurityIssuesFound = 0 IssuesResolved = 0 AverageResolutionTime = 0 SecurityScansRun = 0 VulnerabilitiesFound = 0 VulnerabilitiesFixed = 0 SecurityTrainingCompleted = 0 TeamsWithChampions = 0 TeamsWithoutChampions = 0 } } # Toon resultaten Write-Host "`nSecurity Activiteiten Overzicht:" -ForegroundColor Cyan Write-Host " Totaal security reviews: $($activities.TotalSecurityReviews)" -ForegroundColor White Write-Host " Reviews laatste maand: $($activities.ReviewsLastMonth)" -ForegroundColor White Write-Host " Security issues gevonden: $($activities.SecurityIssuesFound)" -ForegroundColor White Write-Host " Issues opgelost: $($activities.IssuesResolved)" -ForegroundColor White if ($activities.SecurityIssuesFound -gt 0) { $resolutionRate = [math]::Round(($activities.IssuesResolved / $activities.SecurityIssuesFound) * 100, 1) Write-Host " Oplossingspercentage: $resolutionRate%" -ForegroundColor $(if ($resolutionRate -ge 80) { "Green" } else { "Yellow" }) } Write-Host " Gemiddelde oplossingstijd: $($activities.AverageResolutionTime) dagen" -ForegroundColor White Write-Host " Security scans uitgevoerd: $($activities.SecurityScansRun)" -ForegroundColor White Write-Host " Kwetsbaarheden gevonden: $($activities.VulnerabilitiesFound)" -ForegroundColor White Write-Host " Kwetsbaarheden opgelost: $($activities.VulnerabilitiesFixed)" -ForegroundColor White Write-Host " Trainingen voltooid: $($activities.SecurityTrainingCompleted)" -ForegroundColor White Write-Host " Teams met champions: $($activities.TeamsWithChampions)" -ForegroundColor White Write-Host " Teams zonder champions: $($activities.TeamsWithoutChampions)" -ForegroundColor $(if ($activities.TeamsWithoutChampions -gt 0) { "Yellow" } else { "Green" }) if ($OutputPath) { $reportLines = @() $reportLines += "Security Champions Program Monitoring Rapport" $reportLines += "==============================================" $reportLines += "" $reportLines += "Datum: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" $reportLines += "" $reportLines += "Security Activiteiten:" $reportLines += " Totaal security reviews: $($activities.TotalSecurityReviews)" $reportLines += " Reviews laatste maand: $($activities.ReviewsLastMonth)" $reportLines += " Security issues gevonden: $($activities.SecurityIssuesFound)" $reportLines += " Issues opgelost: $($activities.IssuesResolved)" if ($activities.SecurityIssuesFound -gt 0) { $reportLines += " Oplossingspercentage: $([math]::Round(($activities.IssuesResolved / $activities.SecurityIssuesFound) * 100, 1))%" } $reportLines += " Gemiddelde oplossingstijd: $($activities.AverageResolutionTime) dagen" $reportLines += " Security scans: $($activities.SecurityScansRun)" $reportLines += " Kwetsbaarheden gevonden: $($activities.VulnerabilitiesFound)" $reportLines += " Kwetsbaarheden opgelost: $($activities.VulnerabilitiesFixed)" $reportLines += " Trainingen voltooid: $($activities.SecurityTrainingCompleted)" $reportLines += "" $reportLines += "Team Coverage:" $reportLines += " Teams met champions: $($activities.TeamsWithChampions)" $reportLines += " Teams zonder champions: $($activities.TeamsWithoutChampions)" try { $reportLines | Out-File -FilePath $OutputPath -Encoding UTF8 -Append Write-Host "`nMonitoring data toegevoegd aan rapport: $OutputPath" -ForegroundColor Green } catch { Write-Host "`nWaarschuwing: monitoring data kon niet worden toegevoegd: $_" -ForegroundColor Yellow } } return $activities } catch { Write-Error "Fout tijdens monitoring: $_" throw } } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { if (-not $DebugMode) { Connect-RequiredServices | Out-Null } $hasAction = $false if ($ChampionsInventory) { Invoke-SecurityChampionsInventory | Out-Null $hasAction = $true } if ($Monitoring) { Invoke-Monitoring | Out-Null $hasAction = $true } if (-not $hasAction) { Write-Host "Geen actieparameter opgegeven." -ForegroundColor Yellow Write-Host "" Write-Host "Beschikbare parameters:" -ForegroundColor Yellow Write-Host " -ChampionsInventory : Inventariseer security champions" -ForegroundColor Gray Write-Host " -Monitoring : Monitor security-activiteiten" -ForegroundColor Gray Write-Host " -DebugMode : Lokale test met voorbeelddata" -ForegroundColor Gray Write-Host " -OutputPath <pad> : Schrijf rapport naar bestand" -ForegroundColor Gray Write-Host "" Write-Host "Voorbeelden:" -ForegroundColor Yellow Write-Host " .\security-champions-program.ps1 -ChampionsInventory -DebugMode" -ForegroundColor Cyan Write-Host " .\security-champions-program.ps1 -ChampionsInventory -Monitoring" -ForegroundColor Cyan Write-Host " .\security-champions-program.ps1 -Monitoring -OutputPath .\security-champions-rapport.txt" -ForegroundColor Cyan } } catch { Write-Error "Script execution failed: $_" exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } # ============================================================================ # EXIT CODES # ============================================================================ # 0 = Success # 1 = Warning # 2 = Error

Risico zonder implementatie

Risico zonder implementatie
High: Zonder Security Champions Program blijven ontwikkelteams onbewust security-fouten maken die tot kwetsbaarheden en incidenten leiden. Security-teams kunnen niet alle code en configuraties achteraf controleren, waardoor problemen onopgemerkt blijven totdat ze worden misbruikt. Dit vergroot het risico op security-incidenten, datalekken, en compliance-schendingen met AVG, BIO en NIS2.

Management Samenvatting

Richt een Security Champions Program op waarbij ontwikkelaars worden opgeleid tot security champions die beveiliging proactief meenemen in hun dagelijkse werk. Dit verankert security-kennis direct bij ontwikkelteams, voorkomt security-problemen vroeg in het ontwikkelproces, en zorgt voor compliance met AVG, BIO en NIS2 zonder ontwikkelingstrajecten te vertragen.