Gérer une base KeePass avec PowerShell
Sommaire
I. Présentation
Dans ce tutoriel, nous allons voir comment gérer une base KeePass avec PowerShell et le module PoshKeePass, au travers différents exemples qui vont permettre d'ajouter des identifiants, des groupes, etc. Dernièrement, j'ai utilisé ce module pour alimenter une base KeePass avec des comptes Active Directory créés à la volée et qui devait être répartie dans différents groupes de la base KeePass.
Pour interagir avec une base KeePass depuis PowerShell, il y a au moins deux possibilités :
- Le module SecretManagement.KeePass qui est une extension du module Secret Management
Ce module fonctionne très bien, et il s'appuie sur l'excellent module Secret Management. Néanmoins, il est encore trop limité, car, par exemple, il n'est pas possible d'écrire dans un sous-groupe de la base KeePass, ni même de créer un groupe dans base KeePass, etc... Vous pouvez lire mon tutoriel à son sujet ici : PowerShell et le module Secret Management KeePass.
- Le module PoshKeePass
Même s'il n'a pas été mis à jour récemment (dernière version en mars 2019), il fonctionne toujours et il permet d'interagir avec une base KeePass de façon avancée : création et mise à jour d'entrées et de groupes, générer des mots de passe avec le générateur de KeePass, etc.
Lien vers le site du module : GitHub - PoshKeePass
II. Installer le module PoshKeePass
Commençons par installer ce module PowerShell avec la commande suivante :
Install-Module -Name PoshKeePass
Ensuite, il suffira de l'importer pour vérifier sa présence :
Import-Module PoShKeePass
Le temps de vous exercer à l'utilisation de ce module PowerShell, je vous recommande d'agir sur une base KeePass vierge / de test afin d'éviter les mauvaises surprises. Voici la liste des commandes disponibles dans ce module :
Get-Command -Module PoShKeePass
III. Enregistrer une base KeePass
Pour ce tutoriel, je vais utiliser une base KeePass créée à partir de KeePass 2.50, ce qui est la dernière version à ce jour. Cette base de données KeePass nommée "IT-Connect.kdbx" peut-être déverrouillée à partir d'un mot de passe maître. Je l'ai créée manuellement avec le client KeePass, mais on pourrait effectuer la création avec New-KeePassDatabase.
Nous devons l'inscrire au sein du module PoshKeePass, car si on liste les bases KeePass déclarées, on peut voir que la liste est vide actuellement.
Get-KeePassDatabaseConfiguration
Pour inscrire une base KeePass, le cmdlet "New-KeePassDatabaseConfiguration" doit être utilisé et il faut spécifier plusieurs paramètres :
- -DatabaseProfileName : le nom de la base de données au niveau de la configuration du module (le nom que vous voulez, en fait)
- -DatabasePath : le chemin complet vers le fichier KDBX correspondant à la base KeePass
- -UseMasterKey : la méthode d'authentification, en l'occurrence ici un mot de passe maître. Il est possible d'utiliser l'authentification Windows (-UseNetworkAccount) et une clé (-KeyPath).
Ce qui donne :
New-KeePassDatabaseConfiguration -DatabaseProfileName "IT-Connect" -DatabasePath "C:\TEMP\POWERSHELL\IT-Connect.kdbx" -UseMasterKey
Si vous vous trompez, vous pouvez supprimer le profil et le recréer. Il suffit de le supprimer en l'appelant par son nom :
Remove-KeePassDatabaseConfiguration -DatabaseProfileName "IT-Connect"
La base KeePass est bien enregistrée, nous pouvons passer à la suite.
IV. Créer un groupe dans la base KeePass
Pour commencer, nous allons créer un groupe nommé "Active-Directory" au sein de la base KeePass, sous le groupe principal nommé "IT-Connect" et qui correspond à la racine de la base KeePass. Pour interagir avec la base KeePass, nous devons préciser le mot de passe maître à chaque fois, dans chaque commande, par l'intermédiaire du paramètre "-MasterKey".
Note : nous pourrions stocker ce secret dans le secret store à partir du module secret management pour éviter d'avoir à le mettre en clair dans la ligne de commande.
Pour que ce soit plus simple, on va stocker le mot de passe maître sous la forme d'une chaîne sécurisée représentée par la variable $KeePassMasterKey.
$KeePassMasterKey = ConvertTo-SecureString -String "VotreMotDePasse" -AsPlainText -Force
Ensuite, pour créer le groupe dans la base KeePass, c'est le cmdlet "New-KeePassGroup" qui va être utile. Il va falloir préciser le nom du profil à utiliser (-DatabaseProfileName) afin d'appeler la base enregistrée précédemment, ainsi que le nom du groupe à créer (-KeePassGroupName) et le nom du groupe parent (-KeePassGroupParentPath). On peut aussi choisir un icône pour ce groupe grâce au paramètre -IconName.
New-KeePassGroup -DatabaseProfileName "IT-Connect" -KeePassGroupName "Active-Directory" -IconName UserKey ` -MasterKey $KeePassMasterKey -KeePassGroupParentPath "IT-Connect"
Si la commande ne retourne pas d'erreur, c'est que le groupe a été créé avec succès ! On peut le vérifier avec la commande Get-KeePassGroup :
Get-KeePassGroup -DatabaseProfileName "IT-Connect" -KeePassGroupPath "IT-Connect/Active-Directory" -MasterKey $KeePassMasterKey
Pour que ce soit plus parlant dans le cadre de cette démo, voici le résultat visuellement dans KeePass. Si la base KeePass est ouverte au moment de la création du groupe, il faut la fermer puis la rouvrir. Il faut savoir aussi qu'après chaque action, le module PoshKeePass sauvegarde automatiquement.
Voyons comment ajouter une nouvelle entrée au sein du groupe "Active-Directory".
V. Créer une entrée KeePass avec PowerShell
Le cmdlet New-KeePassEntry permet d'ajouter une nouvelle entrée à la base KeePass. Pour créer une nouvelle entrée dans le groupe "Active-Directory" nommée "Domaine it-connect.local - Compte de Prénom NOM" (-Title), avec le nom d'utilisateur "prenom.nom" (-UserName), le mot de passe "MotDePasseDuCompteAAjouter" (-KeePassPassword), l'URL "https://www.it-connect.fr" (-URL) et la note "Détails sur le compte" (-Notes), il faut exécuter cette commande :
New-KeePassEntry -DatabaseProfileName "IT-Connect" -KeePassEntryGroupPath "IT-Connect/Active-Directory" -Title "Domaine it-connect.local - Compte de Prénom NOM" ` -UserName "prenom.nom" -KeePassPassword $(ConvertTo-SecureString -String "MotDePasseDuCompteAAjouter" -AsPlainText -Force) -URL "https://www.it-connect.fr" ` -Notes "Détails sur le compte" -MasterKey $KeePassMasterKey
Une fois l'entrée créée, on peut la rechercher en listant les entrées du groupe "IT-Connect/Active-Directory" :
Get-KeePassEntry -DatabaseProfileName "IT-Connect" -KeePassEntryGroupPath "IT-Connect/Active-Directory" -MasterKey $KeePassMasterKey
Si vous avez besoin que cette sortie affiche le mot de passe en clair, le paramètre -AsPlainText doit être ajouté :
Get-KeePassEntry -DatabaseProfileName "IT-Connect" -KeePassEntryGroupPath "IT-Connect/Active-Directory" -MasterKey $KeePassMasterKey -AsPlainText
Bien sûr, si l'on ouvre la base KeePass avec le client directement, on peut retrouver notre entrée avec les bonnes informations :
Sachez que l'on pourrait obtenir tout le contenu de la base KeePass avec la commande suivante :
Get-KeePassEntry -DatabaseProfileName "IT-Connect" -MasterKey $KeePassMasterKey
Puisque les entrées sont retournées avec plusieurs propriétés (titre, nom d'utilisateur, etc...), nous pourrions faire un filtre pour rechercher toutes les entrées avec le terme "it-connect.local" dans le titre :
Get-KeePassEntry -DatabaseProfileName "IT-Connect" -MasterKey $KeePassMasterKey | Where { $_.Title -match "it-connect.local"}
VI. Modifier une entrée KeePass avec PowerShell
Malheureusement, j'ai oublié de préciser quelque chose au niveau des notes de l'entrée KeePass que l'on vient de créer, car je souhaitais aussi préciser son adresse e-mail. Dans ce cas, on va pouvoir mettre à jour l'entrée KeePass créée précédemment.
Pour commencer, il faut que l'on récupère les informations sur l'entrée à modifier. Ces informations (sous forme d'un objet), nous allons les stocker dans la variable $EntryToUpdate :
$EntryToUpdate = Get-KeePassEntry -DatabaseProfileName "IT-Connect" -MasterKey $KeePassMasterKey -Title "Domaine it-connect.local - Compte de Prénom NOM"
La mise à jour s'effectue avec le cmdlet "Update-KeePassEntry" et l'on va utiliser notre variable avec le paramètre "-KeePassEntry". Ensuite, je précise le paramètre "-Notes" avec la nouvelle valeur à ajouter (elle va écraser la précédente). Le paramètre "-Force" va permettre d'effectuer la mise à jour de l'entrée sans demander la confirmation.
Update-KeePassEntry -DatabaseProfileName "IT-Connect" -KeePassEntry $EntryToUpdate -Notes "Détails sur le compte : [email protected]" ` -KeePassEntryGroupPath "IT-Connect/Active-Directory" -MasterKey $KeePassMasterKey -Force
Voilà, l'entrée est mise à jour dans la base KeePass !
VII. Générer un mot de passe KeePass avec PowerShell
Terminons ce tutoriel par l'utilisation du cmdlet "New-KeePassPassword" qui présent l'avantage de pouvoir exploiter le générateur de mots de passe de KeePass à partir de PowerShell. Le mot de passe généré est stocké dans une chaîne protégée et peut-être inséré directement dans une entrée KeePass. Pour cela, il faudra le stocker dans une variable puis utiliser cette variable au sein du paramètre -KeePassPassword du cmdlet New-KeePassEntry.
Voici un exemple pour générer un mot de passe de 14 caractères, avec des majuscules, des minuscules, des chiffres et des caractères spéciaux à l'exception des caractères "oO0lI".
$KeePassPwd = New-KeePassPassword -UpperCase -LowerCase -Digits -SpecialCharacters -ExcludeCharacters 'oO0lI' -Length 14
Désormais, vous êtes en mesure d'administrer une base KeePass à partir de PowerShell ! A vous de jouer !
Bonjour Florian
Encore un super tuto, mais j’ai une erreur quand je passe le mot de passe aux fonctions, même à partir d’un prompt.
New-Object: Exception calling « .ctor » with « 1 » argument(s): « Could not load type ‘System.Security.Cryptography.ProtectedMemory’ from assembly ‘System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’. »
MethodInvocationException: Exception calling « Open » with « 3 » argument(s): « Could not load type ‘System.Security.Cryptography.ProtectedMemory’ from assembly ‘System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’. »
Aurais tu une idée?
Version utilisé: PowerShell 7.2.1
Bonjour David,
Peux-tu me montrer le bout de code que tu utilises et qui génère cette erreur pour que j’essaie de mon côté ?
Merci
Florian
Pour info :
En utilisant une variable pour le MDP
$KeePassMasterKey = ConvertTo-SecureString -String « VotreMotDePasse » -AsPlainText -Force
New-KeePassGroup -DatabaseProfileName « IT-Connect » -KeePassGroupName « Active-Directory » -IconName UserKey -MasterKey $KeePassMasterKey -KeePassGroupParentPath « IT-Connect »
Ou en entrant le MDP via le prompt quand on omet l’option -MasterKey
New-KeePassGroup -DatabaseProfileName « IT-Connect » -KeePassGroupName « Active-Directory » -IconName UserKey -KeePassGroupParentPath « IT-Connect ».
==> même erreur
Mais je vais plutôt utiliser « Secret Management + KeePass » à l’aide de ton tuto 🙂
Bonjour Florian
Le problème à disparu après une réparation de Powershell 7.2.1
Bonjour David,
Bon, tant mieux! Amuse-toi bien !
Bonjour Florian!!
Comment si prendre l orsquil sagit d une authentification Windows (-UseNetworkAccount)?
Merci.