Trezor

Trezor je centrální úložiště hesel, API tokenů, client secretů a certifikátů. Do šablon, cronů a smart eventů se místo skutečné hodnoty píše jen odkaz na položku trezoru. Hodnota se dosadí až na serveru za běhu a nikdy se nedostane do prohlížeče, do logů ani do exportu šablony.

Dostupné od 5.17 (výpočty a smart eventy), certifikáty od 5.19, generování párů klíčů od 5.19, odkazy v cronech od 5.19.

Šifrovací klíč TAS_DATABASE_ENCRYPTION_KEY je jediná cesta k obsahu trezoru. Při jeho ztrátě nelze dešifrovat žádnou položku a všechny hodnoty se musí zadat znovu – ani záloha databáze nepomůže. Zálohujte ho odděleně od databáze a nikdy ne do repozitáře.

Co Trezor umí uložit

Typ

Záložka

K čemu

Tajný klíč

Tajné klíče

Hesla, API tokeny, client secrety, connection stringy

Certifikát

Certifikáty

X.509 certifikáty (mTLS, podepisování) a vygenerované páry klíčů

Externí zdroj

Externí zdroje

Hodnoty vložené přes .env nebo Docker secrets – jen ke čtení

Kde ho najdu a kdo do něj vidí

AdministraceBezpečnost a autentizace → dlaždice Trezor.

Záložka

URL

Tajné klíče (výchozí)

/administration/vault

Certifikáty

/administration/vault/certificates

Externí zdroje

/administration/vault/external-sources

Role

Co může

Administrátor (-1)

Vidí seznam všech položek, ale zobrazit, upravit a smazat může jen ty, které sám vložil (sloupec Vložil). U cizích řádků nevidí žádnou akci. Záložku Externí zdroje nevidí.

Super administrátor (-10)

Vše výše + libovolnou položku + záložku Externí zdroje.

Ostatní role

Bez přístupu, i při přímém zadání URL.

Tajné klíče

Vytvoření

Tlačítko Vytvořit tajný klíč. Vyplňuje se Název, Hodnota (maskovaná) a volitelně Popis.

Název volte bez diakritiky a mezer, ideálně s prefixem systému: erp-api-token, sftp-partner-password, msgraph-client-secret. Popis vyplňujte vždy – z hodnoty už nikdy nepoznáte, kam patří.
Dvojice název + typ je unikátní. Uložení pod existujícím názvem původní položku přepíše. Pokud stejný název existuje v .env, uložení skončí chybou.

Úprava

Editovat lze pouze hodnotu. Pole je při otevření vždy prázdné, hodnotu je nutné zadat celou znovu. Název a popis změnit nejdou – položku je potřeba smazat, založit znovu a přepsat všechny odkazy.

Zobrazení a smazání

Akce Zobrazit ukáže maskovanou hodnotu s tlačítkem pro kopírování. Každé zobrazení se zapisuje do logu včetně toho, kdo a co četl.

Před smazáním systém hledá reference na šablonových úkolech – vault.get('název') ve výpočtech a {{vault:název}} v parametrech smart eventů. Pokud něco najde, mazání odmítne.

Kontrola referencí nepokrývá crony, konfiguraci pluginů ani dynamicky sestavené názvy (vault.get(nazevPromenne)). Secret používaný cronem půjde smazat bez varování a cron pak spadne na chybě „secret nenalezen". Před mazáním si použití v cronech ověřte ručně.

Certifikáty

Nahrání certifikátu

Tlačítko Nahrát certifikát, přípony .pem, .cer, .crt, .der. Server soubor rozparsuje jako X.509 a sám doplní Platnost od / Platnost do a do popisu issuer a subject.

Editace certifikátu neexistuje – nová verze se nahraje pod stejným názvem a původní se tím přepíše.

Privátní klíč přes „Nahrát certifikát" nenahrajete – uložte ho jako tajný klíč, nebo použijte generování páru klíčů. PKCS#12 (.pfx, .p12) a certifikáty chráněné heslem podporované nejsou.
Chyba Unsupported PEM block type = v souboru je jiný blok než CERTIFICATE. Chyba Invalid certificate: cannot parse X.509 content = soubor není X.509.

Generování páru klíčů

Tlačítko Vygenerovat pár klíčů na záložce Certifikáty. Typické použití je podepisování JWT.

  • RSA – 4096 bitů, PEM (spki / pkcs8)
  • ECDSA – křivka P-256
  • Formát – PEM nebo JWK

Vzniknou dvě položky typu certificate: název.public a název.private. Veřejný klíč se zobrazí hned po vygenerování a lze ho kdykoli otevřít znovu. Privátní klíč se v UI nikdy nezobrazí – použitelný je jen odkazem.

Postup pro podepisování JWT:
1. Vygenerujte pár (např. partner-api, RSA, PEM).
2. Obsah partner-api.public předejte protistraně.
3. Ve smart eventu nastavte privateKey na {{vault:partner-api.private}} a algorithm na RS256.
Generování selže, pokud už položka se stejným základním názvem nebo variantou .public / .private existuje – v databázi i v .env.

Externí zdroje (.env)

Záložka viditelná jen pro super administrátora. Obsahuje hodnoty vložené do prostředí serveru:

TAS_SECRET_<NÁZEV>=hodnota
TAS_SECRET_<NÁZEV>_FILE=/run/secrets/nazev # varianta pro Docker secrets

Název položky trezoru je pak <NÁZEV>, tedy část za prefixem TAS_SECRET_.

  • Záložka je jen ke čtení – změna jde jen zásahem do konfigurace prostředí.
  • .env secrety se načítají při startu aplikace, změna se projeví až po restartu.
  • .env má přednost před databází. Existuje-li TAS_SECRET_ERP_TOKEN i databázový secret ERP_TOKEN, použije se vždy ten z .env.
Priority se dá využít při nasazení: konzultant nastaví integraci proti databázovému secretu na testu, zákazník si na produkci stejný název přebije přes .env a hodnota se do databáze vůbec nedostane.

Jak se na položku odkazuji

Kde

Zápis

Co se stane

Smart eventy, parametry cronů, schémata pluginů

{{vault:název}}

Server token před spuštěním nahradí hodnotou

Výpočty (JS na úkolu)

vault.get('název')

Vrací neprozraditelnou referenci, ne řetězec

Oba zápisy prohledávají tajné klíče i certifikáty a respektují přednost .env. Uvnitř tokenu {{vault:…}} nesmí být mezery.

Vkládání odkazu přes ikonu

U podporovaných polí je vpravo ikona pro vložení proměnné (tooltip Přidat proměnnou). Po kliknutí se nabídnou zdroje: Proměnné ({proměnná}), Trezor ({{vault:název}}), AI zdroje ({{ai-content:název}}) a Dokumenty ({{documents:název}}). Odkaz se vloží na pozici kurzoru.

  • Smart eventy – nabízí všechny čtyři zdroje.
  • Crony – ikona se objeví jen u polí typu heslo a nabízí pouze Trezor.
Obsahuje-li pole typu heslo platný token {{vault:…}}, zobrazí se čitelně místo teček – aby bylo vidět, na kterou položku odkazuje.

Použití v cronech (od 5.19)

  1. Otevřete detail cronu v administraci.
  2. U pole s citlivou hodnotou (např. clientSecret u MS Graph mailových cronů) klikněte na ikonu vložení proměnné.
  3. Vyberte tajný klíč – do pole se vloží {{vault:název}}.
  4. Uložte.

Cron si tokeny při každém běhu rekurzivně dosadí – projde celý objekt parametrů včetně vnořených objektů a polí. V uložené konfiguraci zůstává jen token.

Použití ve smart eventech

Do libovolného textového pole v parametrech smart eventu lze vložit {{vault:název}}. Server před spuštěním projde konfiguraci rekurzivně a dosadí v tomto pořadí:

  1. odkazy do trezoru {{vault:název}},
  2. AI obsah {{ai-content:název}},
  3. proměnné šablony {proměnná}.

Typicky: hlavička Authorization u HTTP smart eventu, heslo u FTP smart eventu, API klíč u AI konektorů.

SmartEventJwtGenerator (od 5.19)

Podepíše krátkodobý JWT token privátním klíčem z trezoru.

Parametr

Povinný

Popis

privateKey

ano

PEM nebo JWK, typicky {{vault:název.private}}

algorithm

ano

RS256RS512, ES256ES512, PS256PS512, HS256HS512, EdDSA

payload

ano

Obsah tokenu; proměnné i odkazy do trezoru se vyhodnotí před podpisem

expiresInSeconds

ne

Platnost tokenu, výchozí 300

Algoritmus musí odpovídat klíči. Pro pár vygenerovaný jako RSA použijte RS* nebo PS*, pro ECDSA (P-256) ES256. Při chybě se do výstupní proměnné uloží stav 500 a text JWT generation failed: …

Použití ve výpočtech

Funkce vault.get() je dostupná pouze ve výpočtu na úkolu a prohledává tajné klíče i certifikáty. Pokud položka neexistuje, volání skončí chybou.

Vrací objekt VaultSecretRef, ne řetězec. Reference je záměrně neprozraditelná – při převodu na text, JSON.stringify() nebo výpisu do logu vrátí vždy jen [VaultSecretRef].

const ref = vault.get('erp-api-token');
proc.info(`${ref}`); // zaloguje "[VaultSecretRef]", ne hodnotu
JSON.stringify({ ref }); // {"ref":"[VaultSecretRef]"}
Hodnotu nelze ve výpočtu ručně poskládat do řetězce – to není omezení k obejití, ale smysl celého mechanismu. Vždy použijte některé z API níže.

HTTP volání (axios)

const client = axios.getAxios({ baseURL: 'https://erp.example.com', timeout: 10000 })
  .setVaultHeader('Authorization', vault.get('erp-api-token'), 'Bearer ');

const orders = client.get('/orders');

Metoda

Popis

setVaultHeader(name, ref, prefix?)

Secret do hlavičky, volitelně s prefixem ('Bearer ')

setVaultQueryParam(name, ref, prefix?)

Secret do query parametru

requestWithVaultField(config, fields)

Secret do těla požadavku, vrací data

requestRawWithVaultField(config, fields)

Totéž, ale vrací i status

applySslConfig({ ca, cert, key, … })

Klientské certifikáty pro mTLS (od 5.18.13)

OAuth client credentials:

const client = axios.getAxios({ baseURL: 'https://api.example.com', timeout: 10000 });

const tokens = client.requestWithVaultField(
  {
    method: 'POST',
    url: '/oauth/token',
    data: { grant_type: 'client_credentials', client_id: 'my-app' },
  },
  [{ fieldName: 'client_secret', ref: vault.get('oauth-client-secret') }],
);

mTLS – ca, cert i key přijímají řetězec, Buffer i VaultSecretRef:

const client = axios.getAxios({ baseURL: 'https://soap.partner.cz', timeout: 10000 });

client.applySslConfig({
  ca: vault.get('partner-ca'),
  cert: vault.get('partner-client-cert'),
  key: vault.get('partner-client-key'),
});
rejectUnauthorized je ve výchozím stavu true – snižovat ho lze jen výjimečně a vědomě. Volba ciphers (např. 'DEFAULT@SECLEVEL=0') řeší protistrany se slabým podpisovým digestem, typicky chybu „ca md too weak".

FTP / SFTP

Konfigurace se předává bez hesla, heslo jde samostatně jako reference:

const client = ftp.getFtpClientWithVaultPassword(
  { host: 'sftp.partner.cz', port: 22, user: 'tas', protocol: 'sftp' },
  vault.get('sftp-password'),
);

JWT

jwt.sign() i jwt.verify() přijímají jako klíč běžný řetězec nebo VaultSecretRef (od 5.18.3):

const token = jwt.sign({ sub: 'tas', scope: 'read' }, vault.get('partner-api.private'), { algorithm: 'RS256' });
jwt.secureSign() a jwt.secureVerify() si klíč dohledávají samy, ale prohledávají pouze tajné klíče. Vygenerované páry jsou uložené jako certifikáty, takže přes ně dostupné nejsou – použijte vault.get() + jwt.sign().

Certifikát jako text

const pem = lib.getCertificate('partner-ca', 'utf8');

Druhý parametr je kódování výsledku, výchozí binary.

Zrušené funkce

Validace šablony na ně upozorní:

Zrušeno

Náhrada

lib.getSecret()

vault.get()

lib.getPublicKey()

vault.get()

lib.setSecret()

Správa přes Trezor v administraci nebo přes .env

Hlídání expirace

Cron B2bAndSecretStoreValidationCron (alias Secret store & API token validation) hlídá, co v nejbližší době expiruje. Výchozí plán je 00 00 05 * * * (denně v 05:00) a ve výchozím stavu je vypnutý.

Parametr

Výchozí

Popis

expiringDays

7

Kolik dní dopředu se hlídá

sendMail

true

Poslat notifikační e-mail

mailAddresses

["error@teamassistant.cz"]

Příjemci – na produkci vždy přenastavte

Tajné klíče nemají expiraci. Cron prochází jen položky s vyplněným validTo, tedy v praxi certifikáty a API tokeny. Rotaci hesel a tokenů je nutné hlídat procesně.

Doporučené postupy

  • Vlastnictví – citlivé položky zakládejte pod super administrátorským účtem, ať zůstanou spravovatelné i po odchodu konzultanta z projektu.
  • Rotace – při výměně hesla stačí změnit hodnotu v Trezoru, odkazy v šablonách i cronech zůstávají beze změny.
  • Verzované názvy certifikátů – např. partner-ca-2026, aby nová verze nepřepsala tu původní bez varování.
  • Migrace mezi prostředími – exportovaná šablona obsahuje jen odkazy {{vault:…}}. Položky Trezoru se stejnými názvy je nutné na cílovém prostředí vytvořit ručně, nepřenášejí se.
  • ZálohováníTAS_DATABASE_ENCRYPTION_KEY zálohujte odděleně od databáze a mimo repozitář.

Časté potíže

Projev

Příčina

Řešení

Dlaždice Trezor chybí

Aktivní zastupování, nebo chybí role -1 / -10

Ukončit zastupování, ověřit roli

U řádku nejsou žádné akce

Administrátor není vlastníkem položky

Nechat provést super administrátora

Záložka Externí zdroje není vidět

Chybí role super administrátora

Vyžádat roli -10

Nová hodnota v .env se neprojevila

.env se čte při startu

Restartovat aplikaci

Změna v Trezoru se neprojevila

Hodnota je přebita .env secretem stejného názvu

Změnit hodnotu v .env, nebo přejmenovat databázový secret

Nelze uložit secret – už existuje

Kolize názvu s .env secretem

Zvolit jiný název

Nelze smazat secret – je stále používán

Odkaz ve výpočtu nebo smart eventu

Odstranit reference, pak mazat

Cron po smazání secretu hlásí nenalezeno

Kontrola referencí crony nepokrývá

Obnovit secret pod původním názvem

Invalid certificate při nahrávání

Soubor není X.509 (např. privátní klíč)

Uložit jako tajný klíč, nebo použít generování páru

Unsupported PEM block type

PEM obsahuje jiný blok než CERTIFICATE

Vyexportovat samotný certifikát

Certifikát nahraný pod stejným názvem „zmizel"

Uložení přepisuje původní položku

Používat verzované názvy

Do hlavičky se dostane [VaultSecretRef]

Reference byla ručně poskládána do řetězce

Použít setVaultHeader() / requestWithVaultField()

JWT smart event hlásí chybu podpisu

Algoritmus neodpovídá klíči

RSA → RS* / PS*, ECDSA P-256 → ES256

jwt.secureSign() nenajde klíč

Prohledává jen tajné klíče, pár je certifikát

Použít vault.get() + jwt.sign()

Po obnově databáze nejde nic dešifrovat

Jiný TAS_DATABASE_ENCRYPTION_KEY

Obnovit původní klíč, jinak zadat hodnoty znovu

Technické detaily

Auditní stopa – co se loguje

Do kategorie administrace: vytvoření tajného klíče, přečtení hodnoty, změna hodnoty, smazání, vygenerování páru klíčů.

Do kategorie audit: nahrání a smazání certifikátu.

U každého záznamu je uživatel, název i ID položky. Samotná hodnota se do logu nikdy nezapisuje.

Dvě věci pro auditory: operace nad tajnými klíči a nad certifikáty jsou ve dvou různých kategoriích, je nutné projít obě. A čtení hodnoty externího zdroje se neloguje vůbec, přestože vrací hodnotu v otevřené podobě.

REST API

Všechny endpointy vyžadují přihlášení a roli administrátora. Seznamové endpointy nikdy nevracejí hodnotu.

GET /vault – seznam tajných klíčů

U detailu, změny hodnoty a mazání platí kontrola vlastnictví – kdo není super administrátor, dostane u cizí položky FORBIDDEN.

Pozor: POST /vault/generate-key-pair vrací v odpovědi i obsah privátního klíče. UI ho nezobrazuje, ale při přímém volání API s tím počítejte.

Proměnné prostředí

TAS_DATABASE_ENCRYPTION_KEYpovinná, šifrovací klíč, 64 hex znaků (32 bajtů)

Přípony .public a .private neměňte na běžícím prostředí – už vygenerované páry jsou pojmenované podle původní hodnoty a odkazy v konfiguraci by přestaly sedět.

Migrace stávajících prostředí

Při povýšení na verzi s Trezorem proběhnou dvě datové migrace automaticky:

1. Dynamické secrety z tabulky CONFIG se převedou na položky typu secret.

Po migraci ověřte v záložce Certifikáty, že se přenesly všechny očekávané certifikáty – zejména pokud byly ve složce i privátní klíče nebo řetězy v jiném formátu.

Frantisek Brych Updated by Frantisek Brych

Nastavení mobilní aplikace pro vaše prostředí

Contact

Team assistant (opens in a new tab)

Powered by HelpDocs (opens in a new tab)