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.
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 |
Kde ho najdu a kdo do něj vidí
Administrace → Bezpečnost a autentizace → dlaždice Trezor.
Záložka | URL |
Tajné klíče (výchozí) |
|
Certifikáty |
|
Externí zdroje |
|
Role | Co může |
Administrátor ( | 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 ( | 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.
erp-api-token, sftp-partner-password, msgraph-client-secret. Popis vyplňujte vždy – z hodnoty už nikdy nepoznáte, kam patří..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.
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.
.pfx, .p12) a certifikáty chráněné heslem podporované nejsou.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.
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..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í.
.envsecrety se načítají při startu aplikace, změna se projeví až po restartu..envmá přednost před databází. Existuje-liTAS_SECRET_ERP_TOKENi databázový secretERP_TOKEN, použije se vždy ten z.env.
.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ů |
| Server token před spuštěním nahradí hodnotou |
Výpočty (JS na úkolu) |
| 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.
{{vault:…}}, zobrazí se čitelně místo teček – aby bylo vidět, na kterou položku odkazuje.Použití v cronech (od 5.19)
- Otevřete detail cronu v administraci.
- U pole s citlivou hodnotou (např.
clientSecretu MS Graph mailových cronů) klikněte na ikonu vložení proměnné. - Vyberte tajný klíč – do pole se vloží
{{vault:název}}. - 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í:
- odkazy do trezoru
{{vault:název}}, - AI obsah
{{ai-content:název}}, - 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 |
| ano | PEM nebo JWK, typicky |
| ano |
|
| ano | Obsah tokenu; proměnné i odkazy do trezoru se vyhodnotí před podpisem |
| ne | Platnost tokenu, výchozí |
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]"}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 |
| Secret do hlavičky, volitelně s prefixem ( |
| Secret do query parametru |
| Secret do těla požadavku, vrací |
| Totéž, ale vrací i |
| 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 |
|
|
|
|
| Správa přes Trezor v administraci nebo přes |
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 |
|
| Kolik dní dopředu se hlídá |
|
| Poslat notifikační e-mail |
|
| Příjemci – na produkci vždy přenastavte |
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_KEYzá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 | 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 |
Nová hodnota v |
| Restartovat aplikaci |
Změna v Trezoru se neprojevila | Hodnota je přebita | Změnit hodnotu v |
Nelze uložit secret – už existuje | Kolize názvu s | 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ž | 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 | Reference byla ručně poskládána do řetězce | Použít |
JWT smart event hlásí chybu podpisu | Algoritmus neodpovídá klíči | RSA → |
| Prohledává jen tajné klíče, pár je certifikát | Použít |
Po obnově databáze nejde nic dešifrovat | Jiný | 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_KEY – povinná, š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.
Updated
by Frantisek Brych