Azure Cost Analysis biedt organisaties gedetailleerde inzichten in hun clouduitgaven, waardoor zij kunnen identificeren waar kosten vandaan komen, trends kunnen analyseren en kostenoptimalisatie kunnen uitvoeren. Deze functionaliteit vormt de basis voor effectief financieel beheer en transparantie in de cloud.
Aanbeveling
IMPLEMENTEREN VOOR TRANSPARANTIE
Risico zonder
Low
Risk Score
4/10
Implementatie
3u (tech: 1u)
Van toepassing op:
✓ Azure Subscriptions
Zonder gedetailleerde kostenanalyse lopen organisaties het risico om in het duister te tasten over hun clouduitgaven. Het ontbreken van inzicht maakt het onmogelijk om te identificeren welke services, resourcegroepen of projecten de meeste kosten genereren, waardoor kostenoptimalisatie onmogelijk wordt. Budgetoverschrijdingen worden pas ontdekt wanneer de factuur arriveert, zonder mogelijkheid om proactief in te grijpen. Daarnaast ontbreekt het zonder kostenanalyse aan transparantie naar stakeholders en management over waar publieke middelen aan worden besteed. Het onvermogen om kosten toe te wijzen aan specifieke afdelingen of projecten belemmert verantwoordelijkheidsverantwoording en maakt het onmogelijk om gefundeerde beslissingen te nemen over resourceallocatie. Bovendien kunnen ongebruikelijke kostenpatronen die kunnen wijzen op beveiligingsincidenten zoals cryptomining of misbruik van accounts, niet worden gedetecteerd zonder gedetailleerde kostenanalyse.
Met Azure Cost Analysis beschikken organisaties over uitgebreide tools om hun clouduitgaven te analyseren en te begrijpen. De functionaliteit maakt het mogelijk om kosten te filteren en te groeperen op basis van verschillende dimensies, waaronder service, resourcegroep, tag, locatie en tijdsperiode. Deze flexibiliteit stelt organisaties in staat om kosten te analyseren op het niveau dat het meest relevant is voor hun specifieke behoeften, of het nu gaat om het identificeren van de duurste services binnen een abonnement of het analyseren van kosten per afdeling via tags. Daarnaast biedt Cost Analysis historische trends en prognoses die organisaties helpen om toekomstige uitgaven te voorspellen en budgetten te plannen. De functionaliteit maakt het ook mogelijk om kosten te exporteren naar Excel of CSV voor verdere analyse, waardoor organisaties hun eigen rapportages en dashboards kunnen ontwikkelen die aansluiten bij hun specifieke rapportagevereisten.
PowerShell Modules Vereist
Primary API: Azure API Connection:Connect-AzAccount Required Modules: Az.CostManagement
Implementatie
Azure Cost Analysis is een ingebouwde functionaliteit binnen Azure Portal die organisaties uitgebreide tools biedt om hun clouduitgaven te analyseren en te begrijpen. De functionaliteit is automatisch beschikbaar voor alle Azure-abonnementen en vereist geen aanvullende configuratie om te activeren. Cost Analysis biedt verschillende weergaven en analyses die organisaties helpen om hun kosten te begrijpen, waaronder een kostenoverzicht dat toont hoeveel er is uitgegeven binnen een bepaalde tijdsperiode, kosten per service die inzicht geven in welke Azure-services de meeste kosten genereren, en kosten per resourcegroep die aantonen hoe kosten zijn verdeeld over verschillende projecten of toepassingen.
Een belangrijk onderdeel van Cost Analysis is de mogelijkheid om kosten te filteren en te groeperen op basis van verschillende dimensies. Organisaties kunnen kosten filteren op abonnement, resourcegroep, service, locatie, tag en tijdsperiode, waardoor zij kosten kunnen analyseren op het niveau dat het meest relevant is voor hun specifieke vraag of behoefte. Deze flexibiliteit maakt het mogelijk om bijvoorbeeld te identificeren welke services de meeste kosten genereren binnen een specifieke resourcegroep, of om kosten te analyseren per afdeling door gebruik te maken van tags. Daarnaast kunnen organisaties kosten groeperen op basis van meerdere dimensies tegelijkertijd, waardoor complexe analyses mogelijk zijn die dieper inzicht geven in kostenpatronen en trends.
Cost Analysis biedt ook historische trendanalyse die organisaties helpt om te begrijpen hoe hun uitgaven zich ontwikkelen over tijd. Deze trends kunnen worden gevisualiseerd in grafieken die kosten over dagen, weken, maanden of jaren tonen, waardoor organisaties seizoensgebonden variaties, groeitrends en anomalieën kunnen identificeren. Daarnaast biedt Cost Analysis prognosefunctionaliteit die gebruikmaakt van machine learning om toekomstige uitgaven te voorspellen op basis van historische data. Deze prognoses helpen organisaties om budgetten te plannen en om proactief maatregelen te nemen wanneer kosten naar verwachting zullen stijgen.
Een waardevolle functie van Cost Analysis is de mogelijkheid om kosten te exporteren naar verschillende formaten, waaronder Excel en CSV. Deze exportfunctionaliteit maakt het mogelijk om kostendata te gebruiken voor verdere analyse in externe tools, voor het opstellen van rapportages voor management of stakeholders, of voor het integreren met andere systemen voor financiële planning en budgetbeheer. Daarnaast kunnen organisaties aangepaste weergaven en rapporten opslaan binnen Cost Analysis, waardoor veelgebruikte analyses snel toegankelijk zijn zonder dat filters en groeperingen telkens opnieuw moeten worden geconfigureerd.
Cost Analysis maakt ook gebruik van kostenallocatie via tags, waardoor organisaties kosten kunnen toewijzen aan specifieke afdelingen, projecten, kostenplaatsen of andere organisatie-eenheden. Door consistente tagstructuren te gebruiken kunnen organisaties een gedetailleerd beeld krijgen van hoe kosten zijn verdeeld binnen de organisatie, wat essentieel is voor verantwoordelijkheidsverantwoording en budgetbeheer. Tags maken het mogelijk om kosten te analyseren op basis van organisatorische dimensies die verder gaan dan de technische indeling in abonnementen en resourcegroepen, waardoor Cost Analysis aansluit bij de manier waarop organisaties zijn gestructureerd en hoe verantwoordelijkheden zijn verdeeld.
Vereisten
Azure-abonnement met actieve resources
Toegang tot Azure Portal met de rol Cost Management Reader of hoger
Optioneel: Azure Cost Management API-toegang voor automatisering
Implementatie
Gebruik PowerShell-script cost-analysis-enabled.ps1 (functie Invoke-Implementation) – Implementeren.
Monitoring
Gebruik PowerShell-script cost-analysis-enabled.ps1 (functie Invoke-Monitoring) – Controleren.
Compliance en Naleving
Remediatie
Gebruik PowerShell-script cost-analysis-enabled.ps1 (functie Invoke-Remediation) – Herstellen.
Compliance & Frameworks
ISO 27001:2022: A.18.1.3 - Bescherming van records - Financiële monitoring
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 Cost Analysis Enabled
.DESCRIPTION
Controleert of Azure Cost Analysis beschikbaar is en correct wordt gebruikt.
.NOTES
Filename: cost-analysis-enabled.ps1
Author: Nederlandse Baseline voor Veilige Cloud
Version: 1.0
Related JSON: content/azure/cost-management/cost-analysis-enabled.json
#>
#Requires -Version 5.1#Requires -Modules Az.Accounts, Az.CostManagement
[CmdletBinding()]
param(
[Parameter()]
[switch]$Monitoring,
[Parameter()]
[switch]$Remediation,
[Parameter()]
[switch]$Revert,
[Parameter()]
[switch]$WhatIf
)
$ErrorActionPreference = 'Stop'
$script:PolicyName = "Azure Cost Analysis Enabled"
# ============================================================================
# FUNCTIONS
# ============================================================================
function Connect-RequiredServices {
<#
.SYNOPSIS
Maakt verbinding met benodigde Azure-services
#>
try {
if (-not (Get-AzContext)) {
Write-Host "Verbinden met Azure..." -ForegroundColor Cyan
Connect-AzAccount | Out-Null
}
$context = Get-AzContextWrite-Host "Verbonden met: $($context.Account.Id) - Subscription: $($context.Subscription.Name)" -ForegroundColor Green
}
catch {
Write-Error "Kan geen verbinding maken met Azure: $_"
throw
}
}
functionTest-CostAnalysisAccess {
<#
.SYNOPSIS
Test of Cost Analysis toegankelijk is
#>
try {
$subscriptions = Get-AzSubscription -ErrorAction SilentlyContinue
if (-not $subscriptions) {
return @{
IsCompliant = $false
Message = "Geen abonnementen gevonden of geen toegang"
}
}
$accessibleSubscriptions = 0foreach ($sub in $subscriptions) {
Set-AzContext -SubscriptionId $sub.Id | Out-Null
try {
# Test of Cost Management API toegankelijk is
$query = @{
type = "ActualCost"
timeframe = "TheLastMonth"
dataset = @{
granularity = "Monthly"
aggregation = @{
totalCost = @{
name = "PreTaxCost"function = "Sum"
}
}
}
}
$result = Invoke-AzRestMethod -Path "/subscriptions/$($sub.Id)/providers/Microsoft.CostManagement/query?api-version=2023-03-01" -Method POST -Payload ($query | ConvertTo-Json -Depth 10) -ErrorAction SilentlyContinue
if ($result.StatusCode -eq 200) {
$accessibleSubscriptions++
}
}
catch {
# API kan beperkt zijn, maar Cost Analysis in portal is altijd beschikbaar
# We beschouwen dit als compliant als er abonnementen zijn
}
}
return @{
IsCompliant = $true
TotalSubscriptions = $subscriptions.Count
AccessibleSubscriptions = $accessibleSubscriptions
Message = "Cost Analysis is beschikbaar voor $($subscriptions.Count) abonnement(en)"
}
}
catch {
return @{
IsCompliant = $false
Message = "Fout bij testen van Cost Analysis toegang: $_"
}
}
}
functionGet-CostAnalysisPermissions {
<#
.SYNOPSIS
Controleert of gebruikers de juiste rechten hebben
#>
try {
$subscriptions = Get-AzSubscription -ErrorAction SilentlyContinue
$results = @()
foreach ($sub in $subscriptions) {
Set-AzContext -SubscriptionId $sub.Id | Out-Null
try {
# Check voor Cost Management Reader rol
$roleAssignments = Get-AzRoleAssignment -Scope "/subscriptions/$($sub.Id)" -ErrorAction SilentlyContinue |
Where-Object { $_.RoleDefinitionName -in @("Cost Management Reader", "Cost Management Contributor", "Owner", "Contributor") }
$results += @{
SubscriptionName = $sub.Name
SubscriptionId = $sub.Id
HasAccess = ($roleAssignments.Count -gt 0)
RoleAssignments = $roleAssignments.Count
}
}
catch {
$results += @{
SubscriptionName = $sub.Name
SubscriptionId = $sub.Id
HasAccess = $false
Error = $_.Exception.Message
}
}
}
return$results
}
catch {
Write-Warning "Kan rechten niet controleren: $_"
return @()
}
}
# ============================================================================
# STANDARD FUNCTIONS
# ============================================================================
function Invoke-Implementation {
<#
.SYNOPSIS
Implementeert de configuratie
#>
[CmdletBinding()]
param()
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "$script:PolicyName - Implementatie" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Invoke-Remediation
}
function Invoke-Monitoring {
<#
.SYNOPSIS
Controleert de huidige configuratie status
#>
[CmdletBinding()]
param()
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "$script:PolicyName" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
try {
Connect-RequiredServices
# Test Cost Analysis toegang
$accessTest = Test-CostAnalysisAccessWrite-Host "`nToegang tot Cost Analysis:" -ForegroundColor Yellow
Write-Host " Status: $($accessTest.Message)" -ForegroundColor $(if ($accessTest.IsCompliant) { "Green" } else { "Yellow" })
if ($accessTest.TotalSubscriptions) {
Write-Host " Abonnementen: $($accessTest.TotalSubscriptions)" -ForegroundColor Cyan
}
# Check permissions
Write-Host "`nRechten controle:" -ForegroundColor Yellow
$permissions = Get-CostAnalysisPermissionsif ($permissions.Count -gt 0) {
foreach ($perm in $permissions) {
$status = if ($perm.HasAccess) { "OK" } else { "Waarschuwing" }
$color = if ($perm.HasAccess) { "Green" } else { "Yellow" }
Write-Host " $($perm.SubscriptionName): $status" -ForegroundColor $colorif ($perm.RoleAssignments) {
Write-Host " Roltoewijzingen: $($perm.RoleAssignments)" -ForegroundColor Gray
}
}
}
# Instructions
Write-Host "`nAzure Cost Analysis is automatisch beschikbaar voor alle abonnementen." -ForegroundColor Cyan
Write-Host "`nAanbevolen acties:" -ForegroundColor Yellow
Write-Host " 1. Open Azure Portal > Cost Management + Billing > Cost analysis" -ForegroundColor Gray
Write-Host " 2. Configureer aangepaste weergaven voor veelgebruikte analyses" -ForegroundColor Gray
Write-Host " 3. Zorg voor consistente tagstructuur voor kostenallocatie" -ForegroundColor Gray
Write-Host " 4. Voer wekelijkse kostenreviews uit" -ForegroundColor Gray
Write-Host " 5. Controleer of gebruikers de rol Cost Management Reader hebben" -ForegroundColor Gray
if ($accessTest.IsCompliant) {
Write-Host "`nSTATUS: COMPLIANT" -ForegroundColor Green
Write-Host "Cost Analysis is beschikbaar en toegankelijk." -ForegroundColor Green
exit 0
}
else {
Write-Host "`nSTATUS: WAARSCHUWING" -ForegroundColor Yellow
Write-Host "Controleer toegangsrechten en abonnementconfiguratie." -ForegroundColor Yellow
exit 1
}
}
catch {
Write-Host "`nERROR: $_" -ForegroundColor Red
exit 2
}
}
function Invoke-Remediation {
<#
.SYNOPSIS
Herstelt de configuratie naar de gewenste staat
#>
[CmdletBinding()]
param()
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "$script:PolicyName - Remediatie" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
try {
Connect-RequiredServices
Write-Host "`nAzure Cost Analysis is automatisch beschikbaar." -ForegroundColor Cyan
Write-Host "Geen technische configuratie vereist." -ForegroundColor Cyan
Write-Host "`nAanbevolen stappen voor effectief gebruik:" -ForegroundColor Yellow
Write-Host " 1. Verifieer toegangsrechten:" -ForegroundColor Gray
Write-Host " - Gebruikers hebben rol 'Cost Management Reader' nodig" -ForegroundColor Gray
Write-Host " - Voor exports: rol 'Cost Management Contributor' of hoger" -ForegroundColor Gray
Write-Host "`n 2. Configureer in Azure Portal:" -ForegroundColor Gray
Write-Host " - Navigeer naar: Cost Management + Billing > Cost analysis" -ForegroundColor Gray
Write-Host " - Maak aangepaste weergaven aan voor veelgebruikte analyses" -ForegroundColor Gray
Write-Host " - Configureer filters op service, resourcegroep, tags" -ForegroundColor Gray
Write-Host "`n 3. Tagstructuur:" -ForegroundColor Gray
Write-Host " - Ontwikkel consistente tagstructuur (afdeling, project, kostenplaats)" -ForegroundColor Gray
Write-Host " - Pas tags toe op alle resources voor kostenallocatie" -ForegroundColor Gray
Write-Host " - Overweeg Azure Policy voor automatische tagtoepassing" -ForegroundColor Gray
Write-Host "`n 4. Processen:" -ForegroundColor Gray
Write-Host " - Voer wekelijkse kostenreviews uit" -ForegroundColor Gray
Write-Host " - Monitor kostenprognoses en trends" -ForegroundColor Gray
Write-Host " - Onderzoek anomalieën direct" -ForegroundColor Gray
Write-Host "`nRemediatie voltooid. Gebruik -Monitoring om status te controleren." -ForegroundColor Green
exit 0
}
catch {
Write-Host "`nERROR: $_" -ForegroundColor Red
exit 2
}
}
function Invoke-Revert {
<#
.SYNOPSIS
Keert de configuratie terug
#>
[CmdletBinding()]
param()
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "$script:PolicyName - Revert" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "`nCost Analysis kan niet worden uitgeschakeld." -ForegroundColor Yellow
Write-Host "De functionaliteit is altijd beschikbaar in Azure Portal." -ForegroundColor Yellow
Write-Host "`nOm toegang te beperken:" -ForegroundColor Cyan
Write-Host " - Verwijder Cost Management Reader/Contributor rollen" -ForegroundColor Gray
Write-Host " - Beperk toegang tot specifieke abonnementen" -ForegroundColor Gray
exit 0
}
# ============================================================================
# MAIN EXECUTION
# ============================================================================
try {
if ($Revert) {
Invoke-Revert
}
elseif ($Monitoring) {
Invoke-Monitoring
}
elseif ($Remediation) {
Invoke-Remediation
}
else {
Write-Host "`nGebruik: -Monitoring | -Remediation | -Revert" -ForegroundColor Yellow
Write-Host "`nVoorbeelden:" -ForegroundColor Cyan
Write-Host " .\cost-analysis-enabled.ps1 -Monitoring" -ForegroundColor Gray
Write-Host " .\cost-analysis-enabled.ps1 -Remediation" -ForegroundColor Gray
}
}
catch {
Write-Host "`nFATAL ERROR: $_" -ForegroundColor Red
exit 2
}
finally {
Write-Host "`n========================================" -ForegroundColor Cyan
}
Risico zonder implementatie
Risico zonder implementatie
Low: Zonder gedetailleerde kostenanalyse beschikken organisaties niet over inzicht in hun clouduitgaven, waardoor kostenoptimalisatie onmogelijk wordt en budgetoverschrijdingen pas worden ontdekt wanneer de factuur arriveert. Het ontbreken van transparantie belemmert verantwoordelijkheidsverantwoording en maakt het onmogelijk om gefundeerde beslissingen te nemen over resourceallocatie. Daarnaast kunnen ongebruikelijke kostenpatronen die kunnen wijzen op beveiligingsincidenten zoals cryptomining niet worden gedetecteerd zonder gedetailleerde kostenanalyse. Het risico wordt geclassificeerd als laag tot medium, omdat het primair gaat om financiële transparantie zonder directe beveiligingsimpact, hoewel kostenanalyse wel kan helpen bij het detecteren van beveiligingsincidenten.
Management Samenvatting
Azure Cost Analysis biedt gedetailleerde inzichten in clouduitgaven via filters, groeperingen en historische trends. De functionaliteit is automatisch beschikbaar voor alle Azure-abonnementen en vereist geen aanvullende configuratie om te activeren. Organisaties moeten wekelijkse kostenreviews uitvoeren, aangepaste weergaven configureren en een consistente tagstructuur ontwikkelen voor kostenallocatie. Cost Analysis vormt de basis voor effectief financieel beheer en transparantie in de cloud.