Utiliser des fournisseurs AnyIdentity personnalisés nécessite la création de scripts d'action, qui sont placés dans la section Script de chaque action lors du processus de création de modèle.
Les scripts d'action sont des scripts PowerShell exécutés par Devolutions PAM, et les mêmes meilleures pratiques applicables à n'importe quel script PowerShell doivent être respectées. Cependant, il y a des nuances spécifiques à considérer lors de la rédaction des scripts d'action.
La maîtrise de PowerShell scripting est essentielle pour créer des fournisseurs AnyIdentity. Il est recommandé que les personnes possèdent au moins un niveau intermédiaire en scripting avant de tenter de créer des scripts d'action.
Chaque script d'action doit inclure un ensemble de paramètres à travers lesquels le fournisseur AnyIdentity passe des valeurs. Bien que les spécificités puissent varier, les scripts d'action doivent partager un ensemble commun de paramètres pour se connecter au point de terminaison du fournisseur d'identité. Ci-dessous un exemple de comment les définir :
[Parameter(Mandatory)]
[string]$IdentityProviderEndpoint,
[Parameter(Mandatory)]
[string]$IdentityProviderEndpointUserName,
[Parameter(Mandatory)]
[securestring]$IdentityProviderEndpointPassword
Bien qu'il y ait de la flexibilité dans la nomination des paramètres au sein des scripts d'action (à condition qu'ils correspondent à ce qui est spécifié lors du processus de création du modèle dans AnyIdentity), il est conseillé d'utiliser un ensemble standard de paramètres pour maintenir la cohérence et la clarté dans les conventions de nommage.
Dans cet exemple, chaque paramètre est marqué comme obligatoire, forçant le fournisseur à les utiliser. Assurez-vous d'utiliser le type securestring
pour le paramètre IdentityEndpointPassword
, car AnyIdentity le rend obligatoire pour empêcher la transmission et le traitement des mots de passe en clair.
Lors de la construction du modèle AnyIdentity, ces paramètres du point de terminaison du fournisseur d'identité correspondent à ceux définis pendant le processus de création du modèle.

Lorsqu'il faut fournir la possibilité de transmettre une valeur à un paramètre de script sans l'exiger, ce paramètre est considéré comme optionnel et n'est utilisé que lorsqu'une valeur lui est attribuée.
Lors de la création d'un modèle AnyIdentity, il est possible de définir les propriétés des fournisseurs et des comptes, et de spécifier si elles sont obligatoires ou optionnelles.

Les paramètres dans le script d'action pour le fournisseur mentionné ci-dessus peuvent être structurés comme suit, chacun correspondant aux propriétés du modèle AnyIdentity et des valeurs par défaut assignées aux paramètres optionnels.
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$IdentityProviderEndpoint,
[Parameter(Mandatory)]
[string]$IdentityProviderEndpointUserName,
[Parameter(Mandatory)]
[securestring]$IdentityProviderEndpointPassword,
[Parameter()]
[string]$Instance = '.',
[Parameter()]
[int]$Port = 1433
)
Write-Host "Using the instance of [$Instance] and the port of [$Port] here in the code somewhere."
Si ce script PowerShell est exécuté en dehors d'AnyIdentity sans que les paramètres optionnels soient spécifiés, il fonctionnera comme prévu en utilisant les valeurs par défaut.
.\actionscript.ps1 -IdentityProviderEndpoint 'hostname' -IdentityProviderEndpointUserName 'admin' -IdentityProviderEndpointPassword (ConvertTo-SecureString -String 'P@$$word' -AsPlainText -Force)

Cependant, lors de la construction du modèle AnyIdentity et en fournissant uniquement les paramètres obligatoires, en se reposant sur les valeurs par défaut internes du script, AnyIdentity les remplace par les siennes.

Lorsque AnyIdentity exécute un script d'action, elle passe invariablement des valeurs à tous les paramètres. Dans les cas où aucune valeur n'est définie, AnyIdentity passe une valeur null
, ou si le paramètre est de type entier, une valeur 0
.
Pour contourner cela, il ne faut pas définir de valeurs par défaut dans les paramètres du script. Au lieu de cela, les conditions dans le script doivent déterminer les valeurs par défaut.
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$IdentityProviderEndpoint,
[Parameter(Mandatory)]
[string]$IdentityProviderEndpointUserName,
[Parameter(Mandatory)]
[securestring]$IdentityProviderEndpointPassword,
[Parameter()]
[string]$Instance,
[Parameter()]
[int]$Port
)
if (!$Instance) { $Instance = '.' }
if (!$Port) { $Port = 1433 }
Write-Output "Using the instance of [$Instance] and the port of [$Port] here in the code somewhere."
Bien qu'il ne soit généralement pas recommandé par les meilleures pratiques PowerShell, fournir des valeurs par défaut pour les paramètres de cette manière est une exigence pour AnyIdentity.

Les scripts d'action sont finalement exécutés dans l'environnement AnyIdentity. Tout résultat qu'ils génèrent est interprété, stocké et/ou affiché dans l'interface web de Devolutions Server.
Pour s'assurer que les scripts d'action produisent la sortie attendue, il est recommandé qu'ils renvoient la sortie de seulement quatre manières :
Utiliser le mot-clé
throw
pour générer une erreur d'arrêt en utilisant le flux d'erreur.Utiliser l'applet de commande
Write-Error
pour générer une erreur non bloquante en utilisant le flux d'erreurs.Utiliser l'applet de commande
Write-Output
pour retourner des informations au flux de sortie.Envoyer directement des informations au flux de sortie.
Ci-dessous se trouvent des exemples de scripts d'action et les résultats correspondants dans la fonctionnalité Tester le script de la zone Résultats d'AnyIdentity.
Write-Verbose -Message 'This is a verbose message.'
Write-Information -MessageData 'information action'
Write-Output 'output stream here'
Write-Host 'write-host output here'
Write-Error 'error'

Write-Verbose -Message 'This is a verbose message.'
Write-Information -MessageData 'information action'
Write-Output 'output stream here'
'output stream here directly'
Write-Host 'write-host output here'

Pour assurer qu'un script d'action renvoie des informations à AnyIdentity, il est conseillé de ne pas utiliser `Write-Verbose`, `Write-Information`, ou `Write-Host`.
L'action initiale exécutée par un fournisseur AnyIdentity est l'action de détection de compte, qui répertorie les comptes sur un fournisseur d'identité et alimente la base de données du Devolutions Server pour une gestion ultérieure.
-
Paramètres d'entrée requis
Le script d'action de détection de compte est relativement simple, car il nécessite principalement des paramètres de script courants pour les points de terminaison. Aucun paramètre supplémentaire n'est nécessaire sauf si l'identité du fournisseur l'exige.
-
Sortie requise
Chaque script d'action de détection de compte doit retourner un ou plusieurs objets de type
PSCustomObject
, chaque objet représentant un compte individuel et contenant trois propriétés :id
,username
etsecret
.La propriété
id
doit servir d'identificateur unique pour chaque compte. Bien que cet identificateur soit généralement un nom d'utilisateur, il peut être tout identifiant unique pour le compte.La propriété
username
doit servir d'étiquette pour chaque compte. Cette étiquette est généralement un nom d'utilisateur, mais peut être tout identificateur qui représente le compte.La propriété
secret
est l'identifiant du mot de passe. Cela peut prendre la forme d'une chaîne chiffrée ou d'un mot de passe en clair, qui est ensuite utilisée pour comparer avec d'autres secrets via l'action de battement de cœur.
Si le code du fournisseur d'identité ne retourne pas nativement cet objet avec les propriétés spécifiées, il est nécessaire de le convertir en créant un
PSCustomObject
. Vous trouverez ci-dessous un exemple pour accomplir cela.## some code that returns an object for each account $accounts = Get-AccountFromIdentityProvider ## Create custom fields for Select-Object to return the id and username properties instead of name, and name $selectProps = @( @{'n'='id';e={$_.name}} ## "convert" the name property from the account to id @{'n'='username';e={$_.name}} ## "convert" the name property from the account to username @{'n'='secret';e={$_.password_hash}} ## "convert" the password_hash property from the account to secret ) ## Pass each account to Select-Object to return the property names $accounts | Select-Object -Property $selectProps
Lors de la création d'un modèle AnyIdentity et de son test (instructions fournies ci-dessous) avec une configuration de balayage, les champs Nom d'utilisateur et Identifiant unique sont renseignés avec les valeurs de propriété pour les propriétés
username
etid
du script d'action.

Après la récupération de tous les comptes du fournisseur d'identité par l'action de détection de compte, une action de battement de cœur est initiée. Cela lit la valeur actuelle du mot de passe d'un compte et la compare à la valeur stockée par le PAM. Si les deux valeurs diffèrent, un changement est détecté.
-
Paramètres d'entrée requis
En plus des paramètres communs du point de terminaison, un script d'action de battement de cœur doit inclure au moins deux paramètres :
username
etsecret
, qui sont respectivement unstring
et unsecurestring
. -
Sortie requise
Un script d'action de pulsation renvoie un seul objet booléen (
$true
ou$false
) pour indiquer si la valeur actuelle du mot de passe d'un compte correspond à la valeur connue des modules PAM.
Ci-dessous un exemple d'un script d'action de balisage.
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$IdentityProviderEndpoint,
[Parameter(Mandatory)]
[string]$IdentityProviderEndpointUserName,
[Parameter(Mandatory)]
[securestring]$IdentityProviderEndpointPassword,
[Parameter(Mandatory)]
[string]$UserName,
[Parameter(Mandatory)]
[securestring]$Secret
)
## Code to query for a single user account here. Let's say it is $account.
## Convert the password to a secure string.
$secPw = $account.password | ConvertTo-SecureString -AsPlainText -Force
## Compare the results.
$secPw -eq $Secret
Lorsque AnyIdentity exécute l'action de moniteur d'activité et que le script d'action retourne une valeur $false
, indiquant que le nouveau mot de passe dans AnyIdentity diffère du mot de passe sur le fournisseur d'identité, l'action de rotation du mot de passe est déclenchée.
Cette action est responsable de synchroniser les mots de passe générés par le module PAM avec le fournisseur d'identité.
-
Paramètres d'entrée requis
En plus des paramètres communs du point de terminaison, un script d'action de rotation de mot de passe doit inclure un paramètre :
NewPassword
. C'est un paramètresecurestring
qui permet à AnyIdentity de transmettre la nouvelle valeur du mot de passe au script d'action. -
Sortie requise
Le script de rotation du mot de passe ne doit retourner une valeur booléenne
$true
que si le changement de mot de passe est réussi.
Ci-dessous, un exemple de base d'un script d'action de rotation de mot de passe.
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$IdentityProviderEndpoint,
[Parameter(Mandatory)]
[string]$IdentityProviderEndpointUserName,
[Parameter(Mandatory)]
[securestring]$IdentityProviderEndpointPassword,
[Parameter(Mandatory)]
[securestring]$NewPassword
)
## $result = Dowhatevertochangethepasword
if ($Result) {
$True
} else {
Write-Error "Failed to update secret."
}