Recherche de site Web

Comment surveiller le consentement des autorisations de l'administrateur d'application dans AzureAD


Dans ce didacticiel, je vais vous montrer comment utiliser une combinaison de Microsoft Graph PowerShell, Managed Identified et Azure Automation pour créer un moyen sécurisé de rapporter chaque semaine par e-mail les consentements de l'administrateur de l'application aux autorisations de l'API Graph. Cela aidera toutes les équipes de sécurité des informations à identifier si un administrateur a accordé plus que les autorisations nécessaires à une application dans Azure AD.

Qu'est-ce que le consentement de l'administrateur ?

Le consentement d’autorisation d’administrateur est un consentement « à l’échelle du locataire » qui est accordé à une application dans Azure AD pour des autorisations spécifiques. Cela signifie que l'éditeur de cette application pourra accéder aux données auxquelles il a accès, ainsi qu'à toute personne pouvant s'authentifier auprès de cette application. En raison de cette nature, les autorisations d’administrateur sont hautement privilégiées et les opérations doivent être surveillées.

Par exemple, je suis un administrateur Azure où je gère une application personnalisée hébergée dans Azure et certaines ressources associées dans l'abonnement Azure. Je n'ai pas accès pour gérer les objets d'annuaire dans Azure AD, mais l'application personnalisée que je gère doit accéder et modifier certains objets d'annuaire Azure AD. Pour répondre à cette exigence, je demande à l'administrateur Azure AD d'enregistrer une application (ou un principal de service) dans Azure AD et d'y accorder l'autorisation user.readwrite.all, permettant ainsi à mon application de modifier les objets utilisateur dans Azure AD. Par inadvertance, une voie d'attaque a maintenant été créée dans laquelle un utilisateur non autorisé (moi) pourrait potentiellement modifier des ressources pour lesquelles je ne suis pas autorisé à le faire, car j'ai un contrôle total sur l'application personnalisée.

Heureusement pour nous, les administrateurs, chaque fois qu'un consentement d'administrateur est accordé à une application, un journal est stocké dans le journal d'audit des applications d'entreprise avec toutes les informations dont nous avons besoin pour enquêter sur l'action et prendre une décision éclairée sur sa validité.

Qui peut accorder des autorisations d’administrateur dans Azure AD ?

Il existe 2 rôles dans Azure AD qui offrent la possibilité d'accorder l'autorisation d'administrateur pour les applications, à savoir :

  • Administrateur global
  • Administrateur de rôle privilégié

D’un point de vue pratique, aucun des deux rôles n’est moins privilégié que l’autre. Même si, à première vue, le rôle d'administrateur global détient plus de droits, le rôle d'administrateur privilégié peut simplement élever les privilèges selon les besoins sans détenir lui-même autant d'autorisations explicites.

Autorisations de script

Le script que j'ai écrit pour surveiller ces journaux de consentement des autorisations d'administrateur utilise 3 autorisations qui doivent être attribuées à l'identité gérée utilisée pour authentifier Azure Automation exécutant le script, à savoir :

  • auditlog.read.all
  • application.lire.tout
  • mail.envoyer

Pour créer une identité gérée et attribuer les autorisations ci-dessus, consultez mon didacticiel sur l'utilisation des identités gérées avec Microsoft Graph PowerShell :

Comment utiliser les identités gérées avec Microsoft Graph PowerShell

Script de rapport de consentement des autorisations d'administrateur

Vous trouverez ci-dessous le script qui filtrera le journal des applications d'entreprise pour obtenir le consentement des autorisations, les rassemblera dans un rapport et les enverra par courrier électronique à la destination. Assurez-vous de modifier les champs suivants :

  • Managed_Identity_ID
  • ADRESSE DU DESTINATAIRE
  • ADRESSE DE L'EXPÉDITEUR
<#
AUTHOR: Daniel Bradley
LINKEDIN: https://www.linkedin.com/in/danielbradley2/
TWITTER: https://twitter.com/DanielatOCN
WEBSITE: https://ourcloudnetwork.com/
Info: This script was written by Daniel Bradley for the ourcloudnetwork.com blog
#>

# Declare variables
$ManagedIdentityId = "!"
$RecipientAddress = "!"
$SenderAddress = "!"

#Connect to Microsoft Graph
Connect-MgGraph -Identity -ClientId "$ManagedIdentityId"

# Get date minus 7 days
$a = $(get-date).AddDays(-7).ToString("yyyy-MM-dd")

# Get application consent logs
$uri = "https://graph.microsoft.com/beta/auditLogs/directoryAudits?`$filter=ActivityDateTime ge $a and ActivityDisplayName eq 'Consent to application'"
$logs = Invoke-MgGraphRequest -uri $uri -Method Get -OutputType PSObject | select -expand value

# Create Report object
$Report = [System.Collections.Generic.List[Object]]::new()

# Loop through each log
ForEach ($log in $logs) {

    # null temporary variable
    $id = $null
    $app = $null

    # Get current app id
    $id = ($log.additionalDetails) | Where-Object {$_.Key -eq 'AppID'}

    # Get Application Name
    if ($log.targetResources.type -eq "ServicePrincipal"){
        $App = Get-MgServicePrincipal -Filter "AppId eq '$($id.value)'"
    } else {
        $app = Get-MgApplication -Filter "AppId eq '$($id.value)'"
    }
    
    # Extract consented permissions
    $perms = (($log.targetResources.modifiedproperties) | Where-Object {$_.DisplayName -eq 'ConsentAction.Permissions'}).newvalue
    $perms -match "(?<=Scope:)(.*?)(?=, CreatedDateTime:)" | out-null
    $permissions = $matches[1]   

    # build report object
    $obj = [PSCustomObject][ordered]@{
        "date"          = $log.activityDateTime
        "App Name"      = $app.DisplayName
        "Admin Consent" = (($log.targetResources.modifiedProperties) | Where-Object {$_.DisplayName -eq 'ConsentContext.IsAdminConsent'}).NewValue
        "Permissions"   = $permissions
        "Consented by"  = $log.initiatedBy.user.userPrincipalName
    }
    $report.Add($obj)
 }

# Convert report to HTML
$report = $report | ConvertTo-Html
$Report = $report -replace '<table>', '<table border="1">'

# Prepare report as attachment
$encodedBytes = [System.Text.Encoding]::UTF8.GetBytes($report)
$encodedText = [System.Convert]::ToBase64String($encodedBytes)

# Build message params
$params = @{
	message = @{
		subject = "Automated - Application Permissions Consents"
		body = @{
			contentType = "Text"
			content = "Please see the attached. Do no reply to this email."
		}
		toRecipients = @(
			@{
				emailAddress = @{
					address = "$RecipientAddress"
				}
			}
		)
    attachments = @(
			@{
				"@odata.type" = "#microsoft.graph.fileAttachment"
				name = "report.html"
				contentType = "text/plain"
				contentBytes = $encodedText
			}
    )
	}
	saveToSentItems = "false"
    
}

# Send message
Send-MgUserMail -UserId $SenderAddress -BodyParameter $params

Automatisation du rapport avec Azure Automation

Azure Automation vous permet de planifier l'exécution régulière du script de rapport. L'idée est d'exécuter le rapport chaque semaine pour évaluer quelles applications ont été autorisées avec quelles autorisations. Pour ce faire, vous aurez besoin d'un abonnement Azure ainsi que d'un administrateur global ou du compte d'administrateur de rôle privilégié pour gérer les consentements d'autorisation initiaux pour l'identité gérée requis pour permettre l'exécution de ce script.

Comme je suis entré plus en détail dans un autre tutoriel pour cette étape, pour cela vous devriez voir mon post suivant :

Comment exécuter des scripts Microsoft Graph PowerShell avec Azure Automation

Articles connexes