wvdsremote — DSL za inventar/povezavo
Vtičnik wvdsremote ponuja deklarativno označevanje, s katerim je inventar gostiteljev v celoti definiran v wiki besedilu in izrisan kot enotna, temizirana površina za povezovanje. Poverilnice nikoli niso v označevanju — gostitelj referencira skrivnost trezorja izključno prek ID-ja; vrednost je šifrirano shranjena v vtičniku wkvault in se dešifrira le na strežniški strani.
Dejanska vzpostavitev povezave (prehod brskalnika oziroma izvorni odjemalec) sledi v poznejši fazi razvoja. Trenutno površina izriše kartice s pravilnim stanjem; gumbi so še neaktivni.
Dve vstopni točki
| Oblika | Namen |
|---|---|
Vsebnik <wk:remote> … </wk:remote> | Definira skupine in gostitelje (na ravni bloka). |
Vrstično {{wk:remote host="id"}} | Vdela posamezen gradnik za povezavo za že registriranega gostitelja. |
Vsebnik je vir za avtorja: ob shranjevanju strani se njegovi gostitelji prevzamejo v
inventar; vrstični gradnik nato razreši ID host.
Vozlišča in atributi (shema v1)
<group>
| Atribut | Obvezno | Privzeto | Pomen |
|---|---|---|---|
label | ne | „(brez skupine)“ | Naslov razdelka |
icon | ne | – | Razred Font Awesome, vzorec fa-… |
collapsed | ne | false | Razdelek na začetku strnjen |
Otroci: <host>.
<host>
| Atribut | Obvezno | Privzeto | Pomen |
|---|---|---|---|
id | da | – | Stabilna oznaka gostitelja (slug a–z 0–9 -); hkrati vrstična referenca |
address | da | – | Ciljni naslov (ime gostitelja/IP) |
protocol | da | – | rdp ssh vnc |
secret | ne¹ | – | ID skrivnosti trezorja (le referenca) |
name | ne | = id | Prikazano ime |
port | ne | 3389/22/5900 | 1–65535 (privzeto glede na protokol) |
tier | ne | protected | auto protected (raven trezorja) |
note | ne | – | Povezana wiki stran (naslov kartice postane povezava) |
icon | ne | odvisno od protokola | Razred Font Awesome |
security | ne | – | le rdp: any|nla|tls|rdp|vmconnect |
ignore-cert | ne | true | Preverjanje potrdila izklopljeno (namerno privzeto za laboratorij) |
¹ secret je formalno neobvezen; <access> brez shranjene skrivnosti se izriše kot
onemogočen gumb.
Otroci: <access>, <link>, <tag>.
<access>
| Atribut | Obvezno | Pomen |
|---|---|---|
mode | da | browser agent rdp-launch ssh-launch clipboard |
label | ne | Napis gumba (privzeto glede na način) |
rdp-launch le pri protocol=„rdp“, ssh-launch le pri protocol=„ssh“; agent
le pri protocol=„rdp“ ali „ssh“ (VNC teče izključno prek prehoda brskalnika); sicer gumb napake.
<link>
| Atribut | Obvezno | Pomen |
|---|---|---|
page | da | Ciljna wiki stran (le interna) |
label | ne | Besedilo povezave |
<tag>
Besedilno vozlišče brez atributa: klasifikacija, izrisana kot čip.
Stanja kartice gostitelja
| Stanje | Sprožilec | Prikaz |
|---|---|---|
| unlocked | Samodejna raven oziroma trezor odklenjen in berljiv | Gumbi dostopa aktivni |
| locked | protected in trezor zaklenjen | Gumb „Odkleni trezor“ |
| secret-missing | Skrivnost manjka/neznana | Gumb onemogočen („skrivnost ni shranjena“) |
| no-permission | Ni pravice branja | Gostitelj skrit ali „brez dostopa“ (nastavitev hide_denied) |
| error-config | Obvezna vrednost neveljavna / browser brez prehoda | Kartica napake s konkretnim vzrokom |
| empty | Ni vidnih gostiteljev | Besedilo praznega stanja |
Varnost
- V shemi ne obstaja atribut
password/pass/pwd— takšni atributi se označijo z
opozorilom in nikoli ne obdelajo.
- Notranji blok se razčlenjuje utrjeno: brez DTD/entitet (DOCTYPE se zavrne), brez
omrežnega dostopa — napadi XML External Entity (XXE) so izključeni.
- Vsi izpisi so ubežani za HTML; povezave opomb kažejo izključno interno; vrednosti skrivnosti
- in* ID-ji skrivnosti se nikoli ne pojavijo v izrisanem HTML.
Popoln primer
<wk:remote>
<group label="Produkcija" icon="fa-server">
<host id="prod-db01" name="DB Primary" address="198.51.100.10" protocol="rdp"
port="3389" secret="prod-db01-admin" tier="protected"
security="nla" note="sl:wiki:runbooks:db-failover">
<access mode="browser" label="Brskalnik (RDP)"/>
<access mode="rdp-launch" label="mstsc"/>
<link page="sl:wiki:runbooks:db-failover" label="Runbook za izpad"/>
<tag>kritis</tag><tag>db</tag>
</host>
<host id="prod-ssh01" name="Jump Host" address="198.51.100.20" protocol="ssh"
secret="prod-ssh01-ops" tier="auto">
<access mode="browser"/>
<access mode="ssh-launch"/>
</host>
</group>
</wk:remote>
Vrstično v runbooku:
{{wk:remote host="prod-db01"}}
Povezovanje
Aktiven gumb dostopa pokliče pooblaščeno končno točko connect
(?call=wvdsremote_connect): preverijo se CSRF, članstvo @wvdse in ACL, skrivnost pa se
dešifrira iz trezorja na strežniški strani.
- Brskalnik (
mode=browser): strežnik zgradi šifriran, kratkotrajen žeton guacamole-lite
(AES-256-CBC); brskalnik z njim odpre sejo Guacamole prek prehoda. Geslo v golem besedilu nikoli ne potuje proti brskalniku — potuje le nepregleden žeton.
- Agent (
mode=agent): strežnik zgradi overjen žeton (AES-256-GCM); brskalnik ga
POSTa lokalnemu agentu za vbrizgavanje (http://127.0.0.1:<port>/launch — localhost je
"potencialno zaupanja vreden", zato dosegljiv tudi s strani https). Agent žeton dešifrira,
preveri TTL + enkratni ''nonce'' ter poverilnice vbrizga izvorno (RDP prek ''cmdkey''→''mstsc''
z naknadnim brisanjem poverilnice; SSH prek PuTTY). **Brez golega besedila v brskalniku** —
prikazano kot varnostna značka "vbrizgano (izvorno, lokalni agent)". Pogoj: zagnan
''wvdsragent'' ter nastavljena ''agent_url''/''agent_shared_key_path''.
* **Izvorno (''rdp-launch''/''ssh-launch''/''clipboard''):** strežnik dostavi datoteko ''.rdp''
oziroma URI ''ssh://'' (brez vdelanega gesla) ter geslo za **odložišče**
(samodejno počiščenje po 30 s). Ta pot namerno izpostavi geslo odjemalcu — prikazano kot
varnostna značka "odložišče (golo besedilo)".
Operativni pogoj: prehod (guacamole-lite + guacd prek Dockerja, deploy/gateway/), sveženj
guacamole-common-js pod vendor/ ter konfiguracijski vrednosti guac_base_url
(wss://…) in guac_shared_key_path (zunaj ključka).
Varnostne meje (namerne): žeton guacamole-lite je AES-256-CBC brez MAC (omejitev
formata) — kompenzirano s kratkim TTL, strežniškim nonce (prehod zavrne potekle/ponovljene
žetone) in vsiljenim razčlenjevanjem JSON. Žeton agenta je nasprotno AES-256-GCM
(overjen), enkraten (nonce) in s kratkim TTL; agent se veže izključno na
127.0.0.1. Meja zaupanja poti agenta: lokalni wvdsragent nujno vidi golo besedilo
(potrebno za vbrizgavanje) — upravljavčev računalnik je sidro zaupanja; v produkciji je treba
binarno datoteko agenta podpisati z Authenticode. Pot clipboard/launch namerno za kratek čas
postavi geslo v odložišče. Deljeni ključi (prehod in agent) so surovi (ne DPAPI) zunaj ključka,
ker ju mora proces Node oziroma .NET prebrati.
Opombe
- ID-ji gostiteljev naj bodo globalno enolični; če dve strani definirata isti ID, vnos v
inventarju dobi nazadnje shranjena stran.
- Vrstični gradnik predpostavlja, da je bil gostitelj predhodno shranjen prek vsebnika.
- Gnezdeni vsebniki v shemi v1 niso predvideni.
Različičenje
Nabor atributov in vozlišč tvori shemo v1. Nova vozlišča/atributi se dodajajo le aditivno; spremembe, ki lomijo združljivost, dvignejo različico sheme. Ta stran je merodajna referenca.