Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

[RDP] Forcer le changement du mot de passe expiré en RDP

Vous pouvez vous rendre compte que votre mot de passe administrateur est expiré lorsque vous essayez de vous connecter en RDP sur le domaine en ayant le message suivant: « This user account’s password has expired. The password must change in order to logon. Please update the password or contact your system administrator or technical support.« 

Les étapes ci-dessous s’appliquent si vous n’avez pas activé l’authentification au niveau du réseau (NLA) sur vos serveurs auxquels vous essayez de vous connecter via RDP.

Pour changer votre mot de passe procéder comme suit : 

1. Créez un paramètre de connexion RDP:  Exécuter mstsc –> puis enregistrez la connexion

2. Enregistrez-la connexion par exemple sous le nom « ChangePassword.rdp » puis cliquez droit sur le fichier pour l’ouvrir avec bloc-notes et ajoutez à la fin (en dernière ligne) cette ligne: enablecredsspsupport:i:0

3. Maintenant, réessayez: vous accéderez à l’écran de connexion qui vous permettra de renouveler/remplacer le mot de passe de connexion.

Après avoir modifié le mot de passe, vous recevez une confirmation du changement

4. Lorsque vous avez terminé, supprimez le fichier « ChangePassword.rdp« 

Ne pas utiliser ce fichier sauf si vous êtes obligé de changer à nouveau votre mot de passe car la désactivation du CredSSP diminue la sécurité des connexions RDP. 

Azure AD : Convertir un GUID Azure AD en SID en utilisant PowerShell

Besoin :

On souhaite identifier le SID d’un groupe Azure AD mais l’attribut n’existe pas.

 

Solution :

J’ai utilisé ce script PowerShell pour convertir le GUID en SID :

<pre class="wp-block-syntaxhighlighter-code">function Convert-AzureAdObjectIdToSid {
<#
.SYNOPSIS
Convert an Azure AD Object ID to SID
 
.DESCRIPTION
Converts an Azure AD Object ID to a SID.
Author: Oliver Kieselbach (oliverkieselbach.com)
The script is provided "AS IS" with no warranties.
 
.PARAMETER ObjectID
The Object ID to convert
#>

    param([String] $ObjectId)

    $bytes = [Guid]::Parse($ObjectId).ToByteArray()
    $array = New-Object 'UInt32[]' 4

    [Buffer]::BlockCopy($bytes, 0, $array, 0, 16)
    $sid = "S-1-12-1-$array".Replace(' ', '-')

    return $sid
}

$objectId = "73d664e4-0886-4a73-b745-c694da45ddb4"
$sid = Convert-AzureAdObjectIdToSid -ObjectId $objectId
Write-Output $sid

# Output:

# S-1-12-1-1943430372-1249052806-2496021943-3034400218</pre>

N.B : il faut renseigner le GUID dans la variable $objectId pour que le script retourne son SID

Active Directory : Lister tous les comptes dont le mot ne passe n’expire jamais

Dans toute annuaire Active Directory il existe une mauvaise pratique, celle dont je voudrais vous parler aujourd’hui est la non expiration des mots de passe pour un / des comptes du domaine. 

Pourquoi ?

Il existe plusieurs arguments au fait qu’un mot de passe qui n’expire jamais est une mauvaise pratique, je mettrais en avant ici les deux qui me posent le plus problème:

  • Tout d’abord un mot de passe qui n’expire jamais a plus de chance d’être « découvert » dans des attaques de type brute force; si on se concentre sur ces comptes en particulier, le fait qu’il n’y ai pas de rotation de mot de passe, laisse une plus grande période de temps à l’attaquant pour le découvrir.
  • Si le compte est compromis, l’attaquant a par définition un accès « constant » au SI, puisque tant que la rotation du mot de passe n’aura pas lieu, ce dernier conservera son accès.

Que faire ?

Bien qu’il ne soit pas une bonne pratique d’autoriser la non expiration des mots de passe, je les croise tous le jours dans tout Active Directory, avec toujours « une bonne raison » de l’avoir fait.

En revanche, même s’il n’est pas possible de s’en séparer, il est tout de même bon de mettre en oeuvre quelques bonne pratiques lorsque l’on est dans cette situation :

  • Lister les comptes dont le mot de passe n’expire jamais.
  • Documenter la cause de cette configuration.
  • Documenter leur emploi (raison d’utilisation, application dans lesquelles ils sont utilisés, machines sur lesquelles ils sont utilisés).
  • Documenter la date du dernier changement de mot de passe (même si elle peut être retrouvée dans l’AD).
  • Documenter une procédure de changement de mot de passe (documentation applicative, processus de dépendance…).
  • Indiquer une personne / équipe en mesure de pouvoir réaliser le changement de mot de passe (il se peut qu’il y ai des développeurs, prestataires externes, éditeurs qui se servent de ce mot de passe). 
  • Réaliser une rotation du mot de passe manuellement.

Lister les comptes avec Powershell.

# Variables
$RootFolder = "C:\Temp"
$Workefolder = "$RootFolder\NeverExpires"
$LogFolder = "$RootFolder\Logs"
$LogFile = "$LogFolder\NeverExpires.txt"
$AllFolders = $RootFolder, $Workefolder, $LogFolder

# Check and create if needed
foreach ($Folder in $AllFolders) {
    If (!(Test-Path $Folder)) {
        Try {
            New-Item $Folder -ItemType Directory -ErrorAction Stop
            }
        Catch {
            Write-Warning $($_)
            }
        }
    }

# Import module
Try {
    Import-Module ActiveDirectory -ErrorAction Stop
    }
Catch {
    Write-Output "Failed to import module ActiveDirectory" | Add-Content $LogFile
    Exit
    }

# Get Active Directory users that have a password that never expires
Try {
    $AllEnabledUsers = Get-ADUser -Filter {Enabled -eq $true} -Properties PasswordNeverExpires -ErrorAction Stop
    $PasswordNeverExpires = $AllEnabledUsers.Where({$_.PasswordNeverExpires -ne $false})
    }
Catch {
    Write-Output "Failed to collect users" | Add-Content $LogFile
    }

# Export result
$PasswordNeverExpires | Export-Csv "$Workefolder\PasswordNeverExpires.csv" -Delimiter ";" -Encoding UTF8