Get-xHashiCorp_Vault_ClientToken.ps1

<#
     .SYNOPSIS
        Retrieves HashiCorp Vaul Client token from OIDC Auth provider.
    .DESCRIPTION
        Retrieves HashiCorp Vaul Client token from OIDC Auth provider which allows to query HashiCorp Vault for secrets.
        Dependencies:
            * System which executes a script must have Microsoft Framework 4.6.1 and above installed.
            * SecureMFA_SupportTools.dll file must be present in script directory.
            * SecureMFA_SupportTools.json configuration file must be present in script directory.
                                     
            Below is Json config file sections which needs to be updated with your environment settings:
                {
                    "serialkey": "f01145697",
                    "hashicorp_auth_endpoint": "http://hscvault.adatum.labnet:8200/v1/auth/oidc/oidc/auth_url",
                    "hashicorp_token_endpoint": "http://hscvault.adatum.labnet:8200/v1/auth/oidc/oidc/callback",
                    "hashicorp_oidc_role": "kv-mgr9",
                    "hashicorp_oidc_uri": "uri:securemfa:testapp2:nativeapp:test",
                    "proxy_server": "http://proxy.adatum.labnet:8080",
                    "proxy_bypass_localaddresses": "false"
                }
 
    .PARAMETER ProxyFromConfig
        Decryption parameter is required for systems which use secret key encryption with AES256.
        ‘encryption_passphrase’ value must match setting which is defined in SecureMFA OTP provider configuration. Otherwise displayed OTP codes will not be valid.
 
    .NOTES
        Version: 1.0.0.3
        Author: SecureMfa.com
        Creation Date: 01/10/2019
        Purpose/Change: Incorporated into module
   
    .EXAMPLE
        C:\PS> Get-xHashiCorp_Vault_ClientToken
 
        This command will retrieve client token from HashiCorp Vault using OIDC auth configuration.
 
    .EXAMPLE
        C:\PS> Get-xHashiCorp_Vault_ClientToken -Proxy SystemDefaults
          
        This command will execute CLI commands using default systems proxy settings.
 
    .EXAMPLE
        C:\PS> Get-xHashiCorp_Vault_ClientToken -Proxy UseConfig
          
        This command will execute CLI commands using proxy settings from SecureMFA PS Module json config file.
     
    .EXAMPLE
        C:\PS> Get-xHashiCorp_Vault_ClientToken -Proxy none
          
        This command will execute CLI commands without proxy settings.
     
#>


#>

Function Get-xHashiCorp_Vault_ClientToken {
Param
(
    [Parameter(Mandatory=$false)]
    [ValidateSet('SystemDefaults','UseConfig','none')]
    [string]$Proxy='SystemDefaults'
)

DynamicParam
{
    # create a dictionary to return, and collection of parameters
    $paramDictionary = New-Object -Type System.Management.Automation.RuntimeDefinedParameterDictionary
    $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute]
 
    # create a new [string] parameter for all parameter sets, and decorate with a [ValidateSet]
    $dynParam = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Profile", [String], $attributeCollection)
    $attributes = New-Object System.Management.Automation.ParameterAttribute
    $fname = "Profiles.json"
    $paramOptions = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList (ConvertFrom-Json (Get-Content (join-path $PSScriptRoot $fname) -Raw))
 
    $attributeCollection.Add($attributes)
    $attributeCollection.Add($paramOptions)
    $paramDictionary.Add("Profile", $dynParam)
 
    return $paramDictionary
}

Process
{
    #Static Parameters
    $Event_Source = "SecureMFA_SupportTools"
    #Checking Dependencies
    #EventLog source dependency
    $ErrMsg = "ResetOTP EventLog source is missing. Please execute following PS command 'New-EventLog -Source SecureMFA_SupportTools -LogName Application' on the system before using the app."
    if (((Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application).pschildname | where { $_ -eq $Event_Source} | measure).Count -eq 0) 
    {write-host $ErrMsg -ForegroundColor red; pause; break}
    #Config file dependency
    if ( $PSBoundParameters.Keys.Contains("Profile") )
    {
        $configfile = (Join-Path -Path $PSScriptRoot -ChildPath ($PSBoundParameters.Profile + '_SecureMFA_SupportTools.json'))
    }
    else {$configfile = (Join-Path -Path $PSScriptRoot -ChildPath SecureMFA_SupportTools.json)}
    #Test config file path.
    $ErrMsg = "$configfile file is missing. Please copy a file to script directory and try again."
    if (!(Test-Path $configfile)) { write-host $ErrMsg -ForegroundColor red; pause; break }
    #DLL file dependency
    $dllpath = (Join-Path -Path $PSScriptRoot -ChildPath SecureMFA_SupportTools.dll)
    $ErrMsg = "$configfile file is missing. Please copy a file to script directory and try again."
    if (!(Test-Path $dllpath)) { write-host $ErrMsg -ForegroundColor red; pause; break }

    #Read JSON file Configuration
    $json = Get-Content -Raw $configfile | ConvertFrom-Json
    $serialkey = $json.serialkey
    $hashicorp_auth_endpoint = $json.hashicorp_auth_endpoint
    $hashicorp_token_endpoint = $json.hashicorp_token_endpoint
    $hashicorp_oidc_role = $json.hashicorp_oidc_role
    $hashicorp_oidc_uri = $json.hashicorp_oidc_uri
    $webproxy = $json.proxy_server
    $bypassproxyonlocal; if($json.proxy_bypass_localaddresses -eq "true") {$bypassproxyonlocal = 1} else {$bypassproxyonlocal = 0}

    Try {

        [System.Reflection.Assembly]::LoadFile($dllpath) | Out-Null    
        [string]$access_token = $null

        #Set proxy settings for CLI
        if ($proxy -eq 'UseConfig') 
            {
            [system.net.webrequest]::defaultwebproxy = new-object system.net.webproxy($webproxy)
            [system.net.webrequest]::defaultwebproxy.credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
            [system.net.webrequest]::defaultwebproxy.BypassProxyOnLocal = $bypassproxyonlocal
            }
        elseif ($proxy -eq 'none') {netsh winhttp reset proxy | out-null ; [system.net.webrequest]::defaultwebproxy = $null}
        else {netsh winhttp import proxy source=ie | out-null}

        #Retreve client token using Hasicorp Vaul OIDC auth flow
        $atoken = [SecureMFA_SupportTools.IDPAUTH]::RetrieveHashicorpAccesToken($hashicorp_auth_endpoint, $hashicorp_oidc_role, $hashicorp_oidc_uri,$hashicorp_token_endpoint,$serialkey,[ref]$access_token) | Out-String

        try {$hashiauthtoken = ConvertFrom-Json $access_token -ErrorAction Stop;$validJson = $true;} catch {$validJson = $false;}
    
        #Validate client token
        $client_token = $access_token 
        $token = $null

        if ($validJson) {
            $client_token = $hashiauthtoken.auth.client_token
            write-host "Issued Hashicorp Vault client token: $client_token" -ForegroundColor Cyan
            #Return client token as auth header object for API
            $token = @{"X-Vault-Token" = "$client_token"}
        }  
    
        return $atoken,$token

        }

    #On error acction
    catch [System.Exception] { 
            $completed = get-date
            $line = $_.InvocationInfo.ScriptLineNumber
            $msg = $_.Exception.Message 

            Write-Host -ForegroundColor Red "Error: $msg"
            Write-EventLog –LogName Application –Source $Event_Source –EntryType Error –EventID 5559 –Message “$msg Executed by: $env:username Computer: $env:computername Line: $line”                 
            }    

    pause
    }
}