Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

[Active Directory] – Supervision du groupe « DNS Admins » avec Powershell

Lorsque l’on souhaite superviser la modification de groupes à privilèges dans l’Active Directory il faut surveiller les Events suivants:

  • EventId 4732: Ajout d’un membre dans le groupe
  • EventId 4733: Retrait d’un membre dans le groupe

Script

A l’aide des quelques lignes de Powershell ci dessous, vous pourrez superviser la modification de ce groupe.

Pour cela il vous est possible de l’intégrer dans une boucle à intervalle de 30 secondes (c’est le plus petit intervalle de temps que j’ai eu l’occasion d’essayer sur un AD de production) et d’envoyer les alertes par Mail ou dans un canal Teams via Microsoft Graph ou un relai SMTP.

 

Note:

Il faudra toutefois prendre soins de remplacer la commande « Write-Host » (présente pour le lab) par la méthode qui vous convient le mieux (Variable, sortie dans un fichier de logs, envoie de mail…).

# Variables
$Date = Get-Date
$FullDate = $Date.ToString("yyyy-MM-dd")
$PDC = $AllDC = Get-ADDomainController -Filter * | where {$_.OperationMasterRoles -contains "PDCEmulator"}
$PDC = $PDC.Name

# Check Modification Time for DNS Admins
$DnsAdminsProperties = Get-ADGroup "DNSAdmins" -Properties Modified -Server $PDC
$LastModifiedDay = ($DnsAdminsProperties.modified).ToString("yyyy-MM-dd")
$Details = $DnsAdminsProperties.modified
$StorageDns = $Details

# Looking for check if a modification was made today
If (($LastModifiedDay -eq $FullDate) -and ($Details -ne $LastModificationTimeDns)) {
    $EventDnsAdmin = Get-WinEvent -ComputerName $PDC -FilterHashtable @{LogName='Security';Id=4732,4733} -MaxEvents 200 | where {$_.TimeCreated -match $Details}
    $EventDnsAdmin | foreach {
        $TimeCreated = $_.TimeCreated
        $DnsAdminAction = $_
        If($DnsAdminAction.Properties[2].value -eq 'DnsAdmins') {
            $By = $DnsAdminAction.Properties[6].value
            $Account = $DnsAdminAction.Properties[0].value
            Switch ($DnsAdminAction.ID) {
                4732 {
                    Write-Host "$Account was added by $By on DnsAdmins Group at $Details"
                    }
                4733 {
                    Write-Host "$Account was removed by $By on DnsAdmins Group at $Details"
                    }
                }
            }
        }
    $LastModificationTimeDns = $StorageDns
    }
Else {
    $LastModificationTimeDns = $StorageDns
    }
    
# Release
$DnsAdminsProperties = $null
$LastModifiedDay = $null
$Details = $null

[Powershell] – Pense bête pour l’installation du module Microsoft.Graph version Beta

Il m’arrive régulièrement de devoir jouer avec les modules Powershell en fonction des scripts que j’écris, selon le contexte je n’emploie pas toujours les mêmes.

Malheureusement pour moi, j’ai récemment eu besoin d’utiliser la version Beta de Microsoft.Graph qui m’a demandé d’enlever quelques autres modules présents sur mon poste.

L’opération n’est pas compliqué mais je n’aime pas chercher sans cesse les commandes, voici donc un petit pense bête pour supprimer le module Microsoft.Graph et ses dépendances pour réinstaller la version beta.

Suppression du module et ses dépendances.

# Remove All
Uninstall-Module Microsoft.Graph -AllVersions

Get-InstalledModule Microsoft.Graph.* | ? Name -ne "Microsoft.Graph.Authentication" | Uninstall-Module -AllVersions
Uninstall-Module Microsoft.Graph.Authentication -AllVersions

 

Avant de lancer la réinstallation on n’oublie pas de passer la commande. 

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

 

Sinon on aura le droit à ce petit message 🙂

Et enfin on pousse le beta

Install-Module Microsoft.Graph.Beta -Repository PSGallery -Force

 

[Entra ID] Récupération des différents types de sign-in pour un audit de sécurité

Lors d’un audit de sécurité Entra ID (Azure AD), il est essentiel de distinguer les différents types de connexions afin d’avoir une vision claire des usages et d’identifier les connexions suspectes ou inutiles. Microsoft Graph centralise ces informations, mais elles ne sont pas toujours triviales à exploiter directement.

En pratique, quatre types principaux de sign-ins sont à connaître :

  • Interactive user
    Une connexion initiée par un utilisateur réel, typiquement via le portail Microsoft 365, Outlook, Teams ou un autre service nécessitant l’authentification interactive.
    Ces sign-ins sont soumis aux politiques MFA et aux conditions d’accès.

  • Non-interactive user
    Une connexion réalisée par un utilisateur, mais sans interaction directe, souvent pour des scripts, applications ou services automatisés utilisant un mot de passe ou un token stocké.
    Exemples : tâches planifiées, scripts PowerShell ou outils tiers accédant à Exchange ou SharePoint via un compte utilisateur.

  • Service Principal (SPN)
    Une authentification effectuée par une application enregistrée dans Entra ID. Les SPN sont utilisés par des services et scripts qui se connectent au nom de l’application, indépendamment d’un utilisateur.
    Exemples : intégrations SaaS, scripts automatisés via une App Registration, pipelines CI/CD.

  • Managed Identity
    Utilisée par les ressources Azure (VM, Functions, App Service, etc.) pour s’authentifier automatiquement auprès d’Azure AD sans gérer de credentials.
    Ces identités sont sécurisées, éphémères et ne nécessitent pas de mot de passe stocké.

Microsoft Graph ne propose pas un filtre unique pour tous les distinguer facilement. Pour obtenir une vue précise, il faut filtrer les sign-ins selon l’attribut signInEventTypes.

Prérequis

Commandes PowerShell par type de sign-in

Pour récupérer les sign-ins d’une application ou d’un utilisateur, on utilise la cmdlet Get-MgBetaAuditLogSignIn avec un filtre sur signInEventTypes :

$StartDate = (Get-Date).AddDays(-30)
$Application = Get-MgApplication -Filter "DisplayName eq 'MonApp'"

# Interactive
Get-MgBetaAuditLogSignIn -Filter "AppId eq '$($Application.AppId)' and createdDateTime ge $StartDate and signInEventTypes/any(t: t eq 'interactiveUser')"

# Non-interactive
Get-MgBetaAuditLogSignIn -Filter "AppId eq '$($Application.AppId)' and createdDateTime ge $StartDate and signInEventTypes/any(t: t eq 'nonInteractiveUser')"

# Service Principal
Get-MgBetaAuditLogSignIn -Filter "AppId eq '$($Application.AppId)' and createdDateTime ge $StartDate and signInEventTypes/any(t: t eq 'servicePrincipal')"

# Managed Identity
Get-MgBetaAuditLogSignIn -Filter "AppId eq '$($Application.AppId)' and createdDateTime ge $StartDate and signInEventTypes/any(t: t eq 'managedIdentity')"