Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

Azure – Combiner les informations de sécurité SSPR et MFA

SSPR et MFA

Face aux nombreuses attaques informatique ces dernières années, les entreprises répondent en renforçant la sécurité de leur système d’information (SI).

SSPR (Self-Service Password Reset) et MFA (Multi-factor authentication) y contribuent.

SSPR permet à un utilisateur de réinitialiser son mot de passe dans Azure de façon autonome via des méthodes de récupération qu’il aura configuré préalablement, SMS, appel téléphonique, questions secrètes..

MFA demande à un utilisateur un deuxième moyen de prouver son identité, c’est par exemple parfois le cas suite à un achat en ligne, un code à usage unique (OTP) pour valider la transaction est envoyé par SMS à un téléphone dont le numéro a été communiqué au fournisseur de service en amont. D’autres méthodes existent tel que l’application Microsoft Authenticator ou l’appel d’un numéro de téléphone.

 

On observe donc que certaines méthodes d’authentification sont communes entre SSPR et MFA, les utilisateurs seront donc invités à renseigner plusieurs fois les mêmes informations ce qui détériore leurs expériences et par conséquent amoindris leurs adhésions à ces outils.

 

Combiner les informations de sécurité SSPR et MFA

 

Il existe dans Azure un paramètre qui permet de combiner les informations de sécurité SSPR et MFA.
Se connecter avec un compte administrateur global à portal.azure.com > User settings > Manage user feature settings

 

Choisir ensuite All dans User can use the combined security information registration experience

Selected permet d’activer ce paramètre pour des utilisateurs nominatif

 

Pour aller plus loin

Documentation officielle Microsoft sur la combinaison des informations de sécurité SSPR et MFA

Active Directory GPO – Comment modifier les paramètres Internet Explorer

Oh, la belle bleue (même si elle est verte) !

 

Modifier les paramètres Internet Explorer (IE) via GPO permet de simplifier grandement le déploiement d’un paramètre spécifique IE, si tenté que la GPO soit intuitive à configurer..

Rappelons dans un premier temps comment accèder aux settings IE, une fois la GPO ouverte pour modification : User Configuration > Preferences > Control Panel Settings > Internet Settings > New

 

La même fenêtre des options IE que sur une machine local s’affiche avec la particularité d’avoir des paramètres soulignés en vert d’un trait plein et d’autre souligné en rouge d’un trait en pointillé.

 

 

Signification et modification

 

Les codes couleurs fonctionnent comme ceci :

  • Les traits verts correspondent aux paramètres qui sont activés et s’appliqueront sur les machines
  • Les traits rouges correspondent aux paramètres non désactivés et qui ne s’appliqueront pas sur les machines

 

Comment faire pour basculer un paramètre activé à désactivé puisque les raccourcis habituels ne semblent pas fonctionner ?

C’est grâce aux touches F5, F6, F7 et F8 qu’il est possible de changer le statut d’un paramètre :

  • F5 : active tous les paramètres de l’onglet
  • F6 : active uniquement le paramètre qui a été modifié en dernier
  • F7 : désactive uniquement le paramètre qui a été modifié en dernier
  • F8 : désactive tous les paramètres de l’onglet

 

PowerShell – Créer une fonction de logging

À l’image du chien qui est le meilleur ami de l’homme, le fichier de log est le meilleur ami de l’informaticien qui débug.

Générer des logs lorsqu’un code PowerShell s’exécute permet de savoir si une fonction a été correctement exécutée et si ce n’est pas le cas de savoir précisément à quel endroit un problème est survenu, ce qui va sans dire est d’une aide considérable lors d’un débug.

 

La fonction de log

function Get-CurrentLineNumber #Fonction qui permet de récupérer la ligne actuelle dans un script, elle sera utilisée par le script qui appelle la fonction de log
{ 
    Return $MyInvocation.ScriptLineNumber
}


function Write-Log #Fonction qu'il faudra appeler lorsque l'on voudra faire du logging
{
    [CmdletBinding()] #Déclaration des paramètres qu'il faudra fournir à la fonction pour qu'elle puisse s'exécuter
    param
    (
        [Parameter(Mandatory=$true)] #Indique que ce paramètre est obligatoire
        [ValidateNotNullOrEmpty()] #Indique que ce champ ne peut pas être vide ou null
        [string]$LogFile, #Paramètre qui contient le chemin complet du script qui appelle la fonction de log

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$LogLine, #Paramètre qui contient la ligne à laquelle la fonction de log est appelée

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$LogMessage, #Paramètre qui contient le log 

        [Parameter(Mandatory=$false)]
        [ValidateNotNullOrEmpty()]
        [string]$LogPath, #Paramètre qui contient le chemin complet du fichier de log
 
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Information','Warning','Error')] #Valeurs disponibles pour qualifier le log
        [string]$LogSeverity #Paramètre qui va quantifier la nature du log parmi les valeurs disponibles
    )

    Begin
    {
        if (!$LogPath) #Code qui permet de générer un dossier de log ainsi que le fichier de log de façon dynamique si le paramètre LogPath est vide
        {
            $CurrentDateFormatForLog = Get-Date -Format "yyyy-MM-dd_HH" #Recupère la date du jour pour la mettre à la fin du nom de fichier de log
            $LogFolderName = "Logs" #Nom du fichier de log
            $LogFolderPath = $PSScriptRoot + "\" + $LogFolderName #Détermine dynamiquement la localisation du dossier de log qui doit se trouver dans le même dossier que le script PowerShell qui appelle la fonction de log
            
            if (!(Test-Path -Path $LogFolderPath))#Vérifie l'existence d'un dossier de log dans le même dossier que le script qui appelle la fonction de log
            {
                New-Item -ItemType Directory -Path $LogFolderPath | Out-Null #Si le dossier de log n'existe pas, le créé
            }
            
            $LogPath = $LogFolderPath + "\" + "Log_" + $CurrentDateFormatForLog + ".csv" #Détermine le nom du chemin complet du fichier de log
        }
    }
    
    Process
    {
        [pscustomobject]@{ #Génére un objet PowerShell dont chaque ligne représente une colonne du fichier de log
            Date = Get-Date -Format "yyyy-MM-dd HH:mm:ss" #Première colonne qui contient la date à laquelle la fonction de log s'est exécuté
            Severity = $LogSeverity #Deuxième colonne qui contient la nature du log
            File = $LogFile #Troisième colonne qui contient le nom du script PowerShell qui appelle la fonction de log
            Line = $LogLine #Quatrième colonne qui contient la ligne à laquelle la fonction de log a été appelée
            Message = $LogMessage #Cinquième colonne qui contient le log
            
        } | Export-Csv -Path $LogPath -Append -NoTypeInformation -Delimiter ";" -Encoding UTF8 #Code qui permet de transformer l'objet PowerShell en fichier de log (csv)
    }
}

 

Exemple d’utilisation de la fonction de log

. .\Write-Log_article.ps1 #Permet de déclarer (dot source) la fonction de log pour qu'elle puisse être utilisée

try #Appelle de la fonction de log pour indique l'utilisateur a bien été trouvé 
{
    $User = Get-ADUser -Identity "maybe" #Cherche un utilisateur dont le samAccountName est maybe
    Write-Log -LogSeverity "Information" -LogMessage "L'utilisateur a bien été récupéré" -LogFile $PSCommandPath -LogLine $(Get-CurrentLineNumber)
    #$PSCommandPath permet de trouver le chemin complet du script qui est en train de s'exécuter
    #Get-CurrentLineNumber fonction déclarée dans le script de log qui permet de récupérer la ligne courante du script qui appelle la fonction de log
}

catch #Appelle la fonction de log si l'utilisateur n'a pas été trouvé et envoie en tant que message de log l'erreur généré par la cmdlet Get-ADUser
{
    Write-Log -LogSeverity "Error" -LogMessage $_.Exception.Message -LogFile $PSCommandPath -LogLine $(Get-CurrentLineNumber) 
}

 

 

Le résultat

Une fois le script PowerShell Call_me_maybe.ps1 appelé, le dossier de log est généré

 

Le fichier de log est généré

 

Le log est généré