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:
- Vyrobíme read-only politiku pre načítanie konkrétneho secret
- Vyrobime “approle” ktoru naviažeme na politku, ktorú sme vyrobili v 1. bode
- Z AppRole zoberieme role_id a vygenerujeme secret_id.
- Obe IDs uložíme do Windows Credential Managera,
- Script potom:
- Načíta role_id a secret_id z Credential Managera
- Zavolá auth/approle/login, dostane token s platnosťou 15 min a uloží ho do dočasnej premennej
- Pomocou vygenerovaného tokenu si načíta username a password uložené v secret
- Zneplatní token
- 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 – centrálna správa, uchovávanie a distribúcia citlivých dát













