Wachtwoord beheer PowerShell (KeePass)

Wij kennen het allemaal, een computer dat kuren vertoond en niet meer doet wat het zou moeten doen. Een tijd geleden bevond ik mijzelf in een situatie waarin mijn computer niet meer aan wilde gaan. Uiteindelijk bleek het om een hardnekkige slaapstand te gaan en was het gelukkig niets permanent. Maar deze situatie heeft mij wel aan het denken gezet. Ben ik goed voorbereid als mijn lieftallige laptop wel zijn laatste adem heeft geblazen?

Eigenlijk staat al mijn belangrijke werk als back-up in de cloud dus daar maak ik mij niet heel veel zorgen om. Maar het zijn juiste de dingen waar je niet direct aan denkt die vervelend kunnen zijn. Één van die dingen was voor mij mijn wachtwoorden. Ik maakte namelijk veel gebruik van de Windows Credential Manager (Windows Referentiebeheer) om verschillende wachtwoorden in op te slaan zodat ik ze vervolgens makkelijk kon benaderen in scripts. Het werkte prima maar op het moment dat ik er een export of een back-up van wilde maken kwam ik al snel tot de conclusie dat dit beter moest kunnen.

Een vriend van mij (senict) raadde KeePass aan. Een credential manager tool dat niet alleen veilig is maar ook goed te gebruiken is in mijn specifieke wensen.

Installatie KeePass

Download (Op het moment van schrijven was 2.41 de laatste versie) en installeer KeePass door simpelweg de stappen van de installatie wizard te volgen. Als het eenmaal geïnstalleerd is moeten wij alleen nog een database aanmaken zodat wij onze entries erin op kunnen slaan. De naam/locatie van je database is belangrijk want deze gaan wij later in de demo gebruiken, ik heb gekozen voor “KeePassDB”. Het eindresultaat zou er ongeveer zo uit moeten zien.

Entry aanmaken

Met Ctrl+I (of het sleuteltje bovenin) kun je een nieuwe entry aanmaken in jouw database. Een simpel klusje maar om dit nou te herhalen voor alle wachtwoorden in mijn WCM zie ik niet zo zitten. To the bat mobile! uh…To PowerShell!

Installatie Module

Open een PowerShell sessie als administrator en run Install-Module -Name PoShKeePass om de module te installeren. We hebben nu toegang tot een aantal handige commands. Met  Get-Command -Module PoshKeePass krijg je een overzicht van je nieuwste aanwinsten. De volgende stap is het aanmaken van entries (wachtwoorden).

Entry aanmaken met PowerShell

Nu wij de module tot onze beschikking hebben kunnen wij ook gebruik maken van de commando om een entry aan te maken. Deze heeft een aantal parameters nodig.

New-KeePassEntry -KeePassEntryGroupPath "Database/General" -Title "EntryTitle" -UserName "EntryUserName" -URL "EntryUrl" -KeePassPassword (ConvertTo-SecureString -AsPlainText -Force -String "EntryPassword") -IconName World -DatabaseProfileName "KeePassDB"

KeePassEntryGroupPath is de groep waarin wij de entry willen plaatsen. Zoals de naam al aangeeft is het een pad dus voor gelaagdheid voeg je ook de “/” toe aan de string. In het voorbeeld komt de entry dus in de “General” groep terecht.

Title spreekt voor zich. Het is de naam die wij de entry willen geven, deze kunnen wij in PowerShell gebruiken om het object aan te spreken.

UserName is de daadwerkelijke gebruikersnaam dat je koppelt aan het wachtwoord.

Url spreekt voor zich.

KeePassPassword wordt al iets ingewikkelder omdat deze niet een standaard string slikt. De parameter verwacht een SecureString en daarom zetten wij het wachtwoord eerst om met de commando  ConvertTo-SecureString -AsPlainText -Force -String "EntryPassword"

Ten behoeve van de demo heb ik het wachtwoord er nu “hardcoded” in staan. Dit is niet veilig dus gebruik het niet op deze manier in een oplossing!

IconName is simpelweg welk icoontje je erbij wilt hebben. Dankzij de module kun je makkelijk zien welke icoontjes beschikbaar zijn.

DatabaseProfileName is de naam van de database waar wij de entry in willen maken. Zoals eerder vermeld heb ik gekozen voor “KeePassDB”.

Windows credential manager kopiëren naar KeePass met PowerShell

Tot slot wil ik mijn WCM items kopiëren naar mijn KeePass. De eeste stap is dan het ophalen van mijn WCM items.

[void][Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime]
$vault = New-Object Windows.Security.Credentials.PasswordVault 
$vault.RetrieveAll() | % {
    $_.RetrievePassword()
    $_.Resource
    $_.UserName
    $_.Password       
}

https://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=606

Nice, maar het valt mij gelijk op dat ik niet voor alle items daadwerkelijk een wachtwoord heb (het kan zijn dat dit voor jou wel het geval is). Aan deze items heb ik niet zo veel dus zet ik er een IF statement tussen om die eruit te filteren.

[void][Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime]
$vault = New-Object Windows.Security.Credentials.PasswordVault 
$vault.RetrieveAll() | % {
    $_.RetrievePassword()
    if($_.Password -ne " "){        
        $_.Resource
        $_.UserName
        $_.Password    
    }        
}

Nu blijft er nog maar een handeling over, Let’s mix things up!

$masterKey = Get-Credential
[void][Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime]
$vault = New-Object Windows.Security.Credentials.PasswordVault 
$vault.RetrieveAll() | % {
    $_.RetrievePassword()
    if($_.Password -ne " "){
        $_.UserName
        New-KeePassEntry -KeePassEntryGroupPath 'Database/General' -Title $_.UserName -UserName $_.UserName -URL $_.Resource -KeePassPassword (ConvertTo-SecureString -AsPlainText -Force -String $_.Password) -IconName World -DatabaseProfileName KeePassDB -MasterKey $masterKey 
    }
}

Het eindresultaat is een gevulde KeePass.

KeePass entries gebruiken in PowerShell

Om nu de credentials op te halen en te gebruiken in PowerShell voeg ik dit stukje code toe aan mijn scripts.

if ($kpCred -eq $null) {
    $kpCred = Get-KeePassEntry -Title "sharepoint_xcdr"
    $cred = New-Object System.Management.Automation.PSCredential ($kpCred.UserName, $kpCred.Password)
}

De variable  $cred is nu gevuld met de gebruikersnaam en (secured) wachtwoord dat gekoppeld is aan de entry “sharepoint_xcdr” wat in dit geval de titel is van mijn SharePoint credentials in KeePass. Omdat je voor het ophalen van je entries de MasterKey wachtwoord moet ingeven heb ik er een IF statement voor gezet zodat dit maar eenmalig hoeft tijdens de PowerShell sessie.