OpenBao – politiky, tokeny a reálne použitie

Root token, ktorý sme vygenerovali pri inicializácií OpenBao servera, síce môžeme použivať pre prečítanie secretov, ale z hľadiska bezpečnosti, je to veľmi zlý nápad. V tomto článku si ukážeme, ako si vyrobiť read-only politiku pre načítanie konkrétneho secretu, ako vyrobiť token s obmedzenou platnosťou a ako ho potom použiť v powershell scripte.

Tu je stručná postupnosť krokov, ktoré dnes vykonáme:

  1. Vyrobíme read-only politiku pre načítanie konkrétneho secret
  2. Vyrobime “approle” ktoru naviažeme na politku, ktorú sme vyrobili v 1. bode
  3. Z AppRole zoberieme role_id a vygenerujeme secret_id.
  4. Obe IDs uložíme do Windows Credential Managera,
  5. Script potom:
    1. Načíta role_id a secret_id z Credential Managera
    2. Zavolá auth/approle/login, dostane token s platnosťou 15 min a uloží ho do dočasnej premennej
    3. Pomocou vygenerovaného tokenu si načíta username a password uložené v secret
    4. Zneplatní token
    5. Vymaže dočasnú premennú (token)

Read-Only politika a jej naviazanie na App rolu

Otvoríme si powershell nastavíme práva:

  • “read” pre čítanie obsahu samotného secret (v našom prípade meno a heslo do vCenter servera, ktoré sme do secretu pridali v minulom článku)
  • “read” a “list” pre čítanie metadát ako sú verzie alebo kedy bol naposledy secret zmenený
$policy = @'
path "virtualization/data/vCenter" {
  capabilities = ["read"]
}
path "virtualization/metadata/vCenter" {
  capabilities = ["read","list"]
}
'@
$policy | bao policy write vCenter-read - | Out-Null

Zapneme AppRole auth metódu (iba raz na začiatku)

bao auth enable approle

Príklad výstupu:

Success! Enabled approle auth method at: approle/

Vytvorime si konkrétnu AppRole autentifikačnú metódu s dobou platnosti tokenu 15min (od jeho vytvorenia) s maximálnou možnou dobou predlženia na 30min.

bao write auth/approle/role/pwsh-vCenter `
  token_policies="vCenter-read" `
  token_ttl="15m" `
  token_max_ttl="30m" | Out-Null

Načítame si RoleID, vygenerujeme SecretID a uložíme ich do premenných.

$ROLE_ID   = bao read -field=role_id auth/approle/role/pwsh-vCenter/role-id
$SECRET_ID = (bao write -format=json -f auth/approle/role/pwsh-vCenter/secret-id | ConvertFrom-Json).data.secret_id

Využitie Windows Credential Managera pre uloženie $ROLE_ID a $SECRET_ID

Aby sme uložili ROLE_ID ale hlavne SECRET_ID bezpečne, pre ďalšie použitie, využijeme možnosti Windows Credential Managera.

Nainštalujeme ho Powershell príkazom:

Install-Module -Name CredentialManager -Scope CurrentUser -Force -ErrorAction Stop

Ak nemáme prístup na internet, môžeme tento modul nakopírovaním z powershellgallery.com.

Po inštalácii ho naimportujeme…

Get-Module CredentialManager -ListAvailable | Import-Module

…do premennej si uložíme meno targetu napr. “OpenBao-vCenter”…

$target = "OpenBao-vCenter"

…a do tohto targetu jednoducho uložíme $ROLE_ID a $SECRET_ID.

New-StoredCredential -Target $target -UserName $ROLE_ID -Password $SECRET_ID -Persist LocalMachine

Príklad výstupu:

Flags          : 0
Type           : Generic
TargetName     : OpenBao-vCenter
Comment        : Updated by: psguy on: 30. 8. 2025
LastWritten    : 30. 8. 2025 22:05:16
PaswordSize    : 72
Password       : 9309ab41-9261-488e-d032-b54b552f00f9
Persist        : LocalMachine
AttributeCount : 0
Attributes     : 0
TargetAlias    :
UserName       : 2b8195a4-b4e2-c12f-a45f-95815c801115

Ak to chceme mať “fancy”, tak si informáciu o uložení môžeme nechať vypísať tak, aby sme videli iba prvé 3 a posledné 3 znaky z “Password”. ;-)

New-StoredCredential -Target $target -UserName $ROLE_ID -Password $SECRET_ID -Persist LocalMachine | Out-Null
$mask = if ($SECRET_ID.Length -gt 6) { $SECRET_ID.Substring(0,3) + '...' + $SECRET_ID.Substring($SECRET_ID.Length-3) } else { '***' }
Write-Host "AppRole pripravena a ulozena v Credential Manageri ako Target '$target'."
Write-Host "   role_id   : $ROLE_ID"
Write-Host "   secret_id : $mask (Cela hodnota SECRET_ID bola bezpecne ulozena)"

Poznámka: Ak uvažuje o tom, že budete spúšťať scripty automatizovane, myslite na to, že ukladať heslá do Credential Managera musíte pod tým účtom, pod ktorým budú dané scripty bežať.

Použitie

Naimportujeme si powershell modul CredentialManager (ak ho ešte nemáme)

Import-Module CredentialManager -ErrorAction Stop

Načítame si ROLE_ID a SECRET_ID

$stored = Get-StoredCredential -Target "OpenBao-vCenter"
$ROLE_ID   = $stored.UserName
$SECRET_ID = $stored.GetNetworkCredential().Password

Prihlásime sa do openbao, vygenerujeme si token platný 15min (podľa app role) a uložíme ho do premennej

$loginJson = bao write -format=json auth/approle/login role_id=$ROLE_ID secret_id=$SECRET_ID 2>$null
$token = ($loginJson | ConvertFrom-Json).auth.client_token

Pre použitie tokenu v tejto session, si ho uložíme do env premennej…

$env:BAO_TOKEN = $token

…a načítame si “username” a “password”.

$secretJson = bao kv get -mount=virtualization -format=json vCenter
$secret = $secretJson | ConvertFrom-Json
$username = $secret.data.data.username
$password = $secret.data.data.password

Teraz už využívame $username a $password tak ako sme zvyknutý. Napr.

Connect-VIServer -Server vcsa01.zakaznik.local -User $username -Password $password

alebo

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ($username, $securePassword)
Connect-VIServer -Server vcsa01.zakaznik.local -Credential $creds

Po úspešnom ukončení úlohy, je z bezpečnostného hľadiska dobré zrušiť token a zmazať env premennú

bao token revoke $token | Out-Null
Remove-Item Env:\BAO_TOKEN -ErrorAction SilentlyContinue

Poznámka: Čas, ako dlho je ešte token platný, zistíme príkazom: bao token lookup

Záver

OpenBao ma veľa možností využitia. Jednu z nich sme si dnes ukázali. Ak sa na chvíľku zamyslíte, kde by ste si ešte tento bezpečný spôsob prihlasovania vedeli predstaviť?

 

Súvisiace články:

OpenBao – vytvorenie configu a základné nastavenie

OpenBao – centrálna správa, uchovávanie a distribúcia citlivých dát

OpenBao – HA cluster

OpenBao – PKI

 

 

 

Author: Martin

Infrastructure engineer | virtualization & cloud enthusiast | vSphere specialist | blogger | Veeam Vanguard 2021,2022,2023 | VMware vExpert 2017 - 2025 | VMCE | VCP-VCF Architect, VCP-DCV, NV, TKO, VCAP-DCV, CompTIA Security+ | Slovak VMUG Leader | Slovak VUG Leader | husband&father