Dashboard Power BI de vos environnements Azure

Microsoft propose un tableau Power BI pour superviser vos ressources Azure qui se nomme Continuous Cloud Optimization Power BI Dashboard (CCO Dashboard pour les intimes). Développé à l’aide du langage Power Query M, il extrait les informations directement à partir des différentes API Azure Advisor RESTAzure Security Center REST APIAzure Graph REST APILog Analytics API et pas mal d’APIs REST Azure IaaS. Il présente les informations dans un format simplifié pour suivre les recommandations potentielles d’Azure Advisor ou d’Azure Security Center, vous permettant ainsi de filtrer par abonnements, groupes de ressources, balises ou ressources particulières.

Les prérequis sont assez légers, Power BI version Desktop, version octobre 2018, Windows 10 version 14393.0 ou ultérieur. Je ne saurais que vous recommander la vraie version Desktop de Power BI et non celle distribuée via le Windows Store, j’ai eu un problème avec les customs connectors.

Au niveau des droits, voici les providers sollicités:

Resource Provider Permissions
Azure Advisor Microsoft.Advisor/generateRecommendations/action
Microsoft.Advisor/Recommendations/Read
Azure Security Microsoft.Security/tasks/read
Microsoft.Security/Alerts/Read
Microsoft.Security/Policies/Read
Microsoft.Security/locations/alerts/read

Bien que certains des fournisseurs de ressources puissent être activés par défaut, vous devez vous assurer qu’au moins les fournisseurs de ressources Microsoft.Advisor et Microsoft.Security sont enregistrés dans tous les abonnements que vous prévoyez d’analyser à l’aide de CCO Dashboard.

Il faut également générer un première recommandations de l’Advisor de Azure soir via le portail ou ce script Powershell:

<#
.SYNOPSIS
Generates Azure Advisor recommendations for all the subscriptions to the given Azure Account.
.DESCRIPTION
Generates Azure Advisor recommendations for all the subscriptions to the given Azure Account.
The script calls Login-AzureRmAccount to require authentication before it can start generating/updating Azure Advisor recommendations.
.EXAMPLE
GenerateAllSubsAdvisorRecommendations.ps1
#>


        Login-AzureRmAccount

        if (-not (Get-Module AzureRm.Profile))
        {
            Import-Module AzureRm.Profile
        }

        $azureRmProfileModuleVersion = (Get-Module AzureRm.Profile).Version
        # refactoring performed in AzureRm.Profile v3.0 or later
        if ($azureRmProfileModuleVersion.Major -ge 3)
        {
            $azureRmProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
            if (-not $azureRmProfile.Accounts.Count)
            {
                Write-Error "Please run Login-AzureRmAccount before calling this function."
                break
            }
        }
        else
        {
            # AzureRm.Profile < v3.0
            $azureRmProfile = [Microsoft.WindowsAzure.Commands.Common.AzureRmProfileProvider]::Instance.Profile
            if (-not $azureRmProfile.Context.Account.Count)
            {
                Write-Error "Please run Login-AzureRmAccount before calling this function."
                break
            }
        }
        
        $Timeout = 60
        $currentAzureContext = Get-AzureRmContext
        $profileClient = New-Object Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient($azureRmProfile)
        Write-Debug ("Getting access token for tenant" + $currentAzureContext.Subscription.TenantId)
        $token = $profileClient.AcquireAccessToken($currentAzureContext.Subscription.TenantId)
        $headers = @{"Authorization"="Bearer " + $token.AccessToken}
        Write-Debug $token.AccessToken
    
        $SubsList = Get-AzureRmSubscription | where {$_.state -eq "Enabled"}


        foreach ($sub in $SubsList)
        {
            $uri = ("https://management.azure.com/subscriptions/$sub/providers/Microsoft.Advisor/generateRecommendations?api-version=2017-03-31")
            Write-Debug ("POST {0}" -f $uri)
            $response = Invoke-WebRequest -Uri $uri -Method Post -Headers $headers
            $statusUri = $response.Headers.Location
            Write-Debug ("GET {0}" -f $statusUri)

            $secondsElapsed = 0
            while ($secondsElapsed -lt $Timeout)
            {
                $response = Invoke-WebRequest -Uri $statusUri -Method Get -Headers $headers
                if ($response.StatusCode -eq 204) {break}
                Write-Verbose ("Waiting for generation to complete for subscription {0}..." -f $sub)
                Start-Sleep -Seconds 1
                $secondsElapsed++
            }

            $result = New-Object PSObject -Property @{"SubscriptionId" = $sub; "Status" = "Success"; "SecondsElapsed" = $secondsElapsed}

            if ($secondsElapsed -ge $Timeout)
            {
                $result.Status = "Timed out"
            }

            Write-Output $result


        }

Azure Security Center doit également être activé, soit en version gratuite ou standard. Le niveau standard est gratuit les 30 premiers jours. L’utilisation au-delà des 30 jours est facturée automatiquement en fonction de la tarification ci-dessous (au 17 décembre 2018).

FONCTIONNALITÉS NIVEAU GRATUIT NIVEAU STANDARD
Stratégie de sécurité, évaluation et recommandations Disponible Disponible
Solutions partenaires connectées Disponible Disponible
Recherche et collecte des événements de sécurité ‐ ‐Non disponible Disponible
Accès aux machines virtuelles juste-à-temps ‐ ‐Non disponible Disponible
Contrôles d’application adaptatifs ‐ ‐Non disponible Disponible
Détection avancée des menaces ‐ ‐Non disponible Disponible
Alertes intégrées et personnalisées ‐ ‐Non disponible Disponible
Informations sur les menaces ‐ ‐Non disponible Disponible
TYPE DE RESSOURCE NIVEAU GRATUIT NIVEAU STANDARD
Machine virtuelle Gratuit 0,017 €/Serveur/Heure
Données incluses – 500 Mo/Jour
Services d’application Gratuit 0,017 €/App Service/Heure
SQL DB Non disponible 0,018 €/Serveur/Heure
MySQL (version préliminaire) Non disponible 0,009 €/Serveur/Heure*
PostgreSQL (version préliminaire) Non disponible 0,009 €/Serveur/Heure*
Stockage (version préliminaire) Non disponible 0 €/10 000 transactions*

Un custom role peut également être crée pour l’Azure RBAC via ce script Powershell:

<#
.SYNOPSIS
This script creates a new AzureRmRole and assign it to all the subscriptions for a given Azure Account with enough permissions 
.DESCRIPTION
This script creates a new AzureRmRole and assign it to all the subscriptions for a given Azure Account with enough permissions
The new AzureRmRole name is defined in $RoleName variable and can be customized
. SECURITY
The script calls Login-AzureRmAccount to require authentication before it can start generating/updating Azure Advisor recommendations.
.EXAMPLE
PowerBIDashboardReadPermissionsRole.ps1
List roles
(Get-AzureRmRoleDefinition | FT Name, Description).count
List custom Roles
Get-AzureRmRoleDefinition | ?{$_.IsCustom -eq $true} | FT Name, IsCustom 
#delete custom role
#Get-AzureRmRoleDefinition "Continuous Optimization Power BI Dashboard Reader" | Remove-AzureRmRoleDefinition
actions
Listing Resource Providers Operations
Get-AzureRMProviderOperation "Microsoft.Advisor/*" | FT OperationName, Operation , Description -AutoSize
Get-AzureRMProviderOperation "Microsoft.Security/*" | FT OperationName, Operation , Description -AutoSize
Get-AzureRMProviderOperation "Microsoft.ResourceHealth/*" | FT OperationName, Operation , Description -AutoSize
#>

Login-AzureRmAccount

$RoleName = "Continuous Optimization Power BI Dashboard Reader"
Get-AzureRmRoleDefinition $RoleName | Remove-AzureRmRoleDefinition


$SubsList = Get-AzureRmSubscription

$role = Get-AzureRmRoleDefinition "Contributor"
$role.Id = $null
$role.Name = $RoleName
$role.Description = $RoleName
$role.Actions.Clear()
#Azure Advisor Resource Provider Permissions
$role.Actions.Add("Microsoft.Advisor/generateRecommendations/action")
$role.Actions.Add("Microsoft.Advisor/Recommendations/Read")
#Azure Security Resource Provider Permissions
$role.Actions.Add("Microsoft.Security/tasks/read")
$role.Actions.Add("Microsoft.Security/Alerts/Read")
$role.Actions.Add("Microsoft.Security/Policies/Read")
$role.Actions.Add("Microsoft.Security/locations/alerts/read")
#Azure ResourceHealth Resource Provider Permissions
$role.Actions.Add("Microsoft.Resourcehealth/AvailabilityStatuses/read")
$role.Actions.Add("Microsoft.Resourcehealth/AvailabilityStatuses/current/read")

$role.AssignableScopes.Clear()

foreach($Sub in $SubsList)
{
$temp = $Sub.SubscriptionID
$role.AssignableScopes.Add("/subscriptions/$temp")
}

New-AzureRmRoleDefinition -Role $role

Ouvrons le template Power BI qui va nous demander en premier lieu le nom du tenant en xxx.onmicrosoft.com et de s’authentifier en Organizational Account.

Et là, c’est le drame, accès refusé…

Cela provient des Managements Groups, pour corriger le problème annulez tout et, il faut éditer la requête en ne chargeant pas les Managements Groups. Vous aurez peut être une erreur, cliquez sur FIX THIS et REFRESH et la dashboard va apparaître.


Bref, j’ai déployé ces Dashboard chez mes clients, ce qui me permet d’avoir un overview complet des ressources Azure des mes clients. La visualisation est très sympa notamment pour:

  • VMs: regroupement par taille, resource group, …
  • Réseau: les VNETs, subnet (in use, disponible !), VNET peerings (super cool !)
  • L’advisor et Security Center

Bref, un must have 🙂

Partagez si ça vous plait !
0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest

0 Commentaires
Commentaires en ligne
Afficher tous les commentaires
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x