Gérer une base KeePass avec PowerShell

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

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 :

Gérer base KeePass avec PowerShell

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 !

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5574.Voir tous les posts

6 thoughts on “Gérer une base KeePass avec PowerShell

  • 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

    Répondre
    • 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

      Répondre
      • 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 🙂

        Répondre
  • Bonjour Florian
    Le problème à disparu après une réparation de Powershell 7.2.1

    Répondre
  • Bonjour Florian!!
    Comment si prendre l orsquil sagit d une authentification Windows (-UseNetworkAccount)?
    Merci.

    Répondre

Répondre à Florian Burnel Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.