TC$mC$ on erittC$in mielenkiintoinen ja kunnianhimoinen arkkitehtuuri, joka vie prosessieristyksen ja hiekkalaatikoinnin pitkC$lle. TC$ssC$ on ehdottomasti aineksia vankkaan "Zero Trust" -henkiseen mikropalveluverkkoon, jossa suoritettavan koodin annetaan juosta tC$ysin kontrolloidussa ja rajoitetussa ympC$ristC6ssC$. KC$ydC$C$n lC$pi ajatuksesi ja katsotaan, miten nC$mC$ ominaisuudet saataisiin parhaiten toteutettua. ### 1. Teknologiavalinta: FastAPI vs. Node.js (Fastify) Vaikka Python ja FastAPI ovat erinomaisia API-kerroksia, ehdottaisin harkitsemaan koko ohjauskerroksen rakentamista **Node.js:llC$ ja Fastifylla**. Syyt tC$hC$n: * **YhtenC$inen ekosysteemi:** Koska orkestroimme nimenomaan Node/JS-instanssej a, on usein helpompaa, kun hallintakerros ja kohdekerros puhuvat samaa kieltC$. * **V8 Inspector API:** Node-instanssien syvC$luotaava debuggaus ja muistin manipulointi onnistuu parhaiten V8 Inspector -protokollan kautta, jolle on natiivit ja erittC$in tehokkaat kirjastot suoraan Nodessa. * **Suorituskyky:** Fastify on C$C$rimmC$isen nopea ja soveltuu mainiosti tC$llaisen headless-ohjauskoneiston rakentamiseen, joka vaatii matalan viiveen I/O-operaatioita. Python ei ole vC$C$rC$ valinta, mutta Node + Fastify -kombinaatiolla sC$C$styt yhdeltC$ ylimC$C$rC$iseltC$ teknologiasillalta (inter-process communication on suoraviivaisempaa). ### 2. Endpointit ja elinkaaren hallinta (Kohdat 2.1 - 2.6) NC$mC$ ovat perusrakennuspalikoita ja tC$ysin toteutettavissa standardeilla kC$yttC6jC$rjestelmC$tason kutsuilla (`fork`, `exec`, `kill`). * **LC$hdekoodin lataus (2.1.1):** Verkkohaku vaatii vahvaa validointia. Koska kyseessC$ on hiekkalaatikko, koodi kannattaa ladata ohjauspalvelun (API:n) toimesta levylle/muistiin ja syC6ttC$C$ instanssille, jotta itse instanssi ei tarvitse verkkoyhteyksiC$ ulkomaailmaan edes oman koodinsa hakemiseen. * **Pause/Suspend (2.6):** POSIX-signaalit `SIGSTOP` (keskeytys) ja `SIGCONT` (jatko) toimivat suoraan Noden taustaprosesseihin ja jC$C$dyttC$vC$t instanssin CPU-ajan vC$littC6mC$sti. --- ### 3. SyvC$luotaavat ominaisuudet ja rajoitteet (Kysymysmerkit) TC$ssC$ pC$C$stC$C$n todelliseen matalan tason jC$rjestelmC$suunnitteluun. Ratkaisut jakautuvat kahteen leiriin: **V8-moottorin sisC$isiin ominaisuuksiin** ja **Linux-ytimen ominaisuuksiin (cgroups, namespaces)**. **3.1 & 3.5: Backdoor eval(), muistin manipulointi ja "ohjelman tajuamatta" tapahtuvat asiat** * **Miten:** C/C++ -puolella tC$mC$ tehtC$isiin `ptrace`:lla, jolloin prosessin muistiaviaruutta voisi peukaloida sen tajuamatta. Node.js:ssC$ (ja V8:ssa) muisti on kuitenkin roskienkeruun piirissC$ oleva dynaaminen keko (heap), joten raa'alla `ptrace`:lla muuttujien arvojen muuttaminen on kC$ytC$nnC6ssC$ mahdotonta ilman moottorin kaatumista. * **Ratkaisu:** **Node.js Inspector (V8 Inspector API)**. Voit kC$ynnistC$C$ Node-instanssit `--inspect`-lipulla ja yhdistC$C$ hallinta-API:sta WebSocketilla suoraan instanssin sisC$osiin. TC$mC$ antaa tC$yden GDB-tyylisen kontrollin: voit asettaa breakpointeja, evaluoida mielivaltaista koodia lennosta, lukea muuttujia ja muuttaa niitC$. Koska tC$mC$ tehdC$C$n debuggerin kautta, instanssin oma koodi ei "nC$e" asioiden muuttuvan, vaan V8 hoitaa muunnoksen turvallisesti. **3.2 & 3.3: Debug-info muistista, sC$ikeistC$ ja aliprosesseista** * KC$yttC6jC$rjestelmC$n `/proc/[pid]/...` (Linuxissa) on luotettavin lC$hde. SieltC$ saat suoraan todellisen RAM-kulutuksen (RSS) ja CPU-kC$ytC6n ilman, ettC$ itse JS-koodin tarvitsee raportoida niitC$. * **Aliprosessit:** Kun instanssi kC$ynnistetC$C$n, sille kannattaa asettaa oma **Process Group (PGID)**. NC$in voit listata kaikki prosessit, joiden PGID vastaa pC$C$instanssia, ja nC$et vC$littC6mC$sti, onko se pystyttC$nyt taustalle omia aliprosessejaan. **3.4: Aliprosessien pause/resume, kill ja zombien siivous** * KC$yttC$mC$llC$ mainittua PGID:tC$, voit lC$hettC$C$ `SIGSTOP` tai `SIGKILL` kokonaiselle prosessiryhmC$lle kerralla. NC$in estC$t tilanteet, joissa yksittC$inen karannut aliprosessi jC$C$ zombina eloon, kun pC$C$prosessi tapetaan. **3.6: CPU ja reaaliajan maksimirajoitukset (Enforcement)** * **ClC$ tee tC$tC$ manuaalisella suspend/resume -luupilla.** KC$yttC6jC$rjestelmC$n ydin osaa tC$mC$n paljon paremmin. * **Ratkaisu:** **Linux cgroups (v2)**. Voit luoda jokaiselle instanssille oman `cgroupin` ja asettaa sinne `cpu.max` -arvon (esim. max 10% CPU-aikaa per sekunti). Kernel hoitaa "suspendoimisen ja jatkamisen" mikrosekuntien tarkkuudella ilman, ettC$ orkestraattorin tarvitsee koskaan lC$hettC$C$ signaaleja. Prosessin ajo vain hidastuu rajoitettuun maksimiin. **3.7 & 3.8: I/O-rajoitukset ja verkkorajoitukset / Firewall** * **Verkko (Network Namespaces):** Cgroupsin lisC$ksi jokainen instanssi tulisi ajaa omassa verkko-nimiavaruudessaan (`netns`). Voit luoda virtuaalisen verkkolaitteen (veth-pair) API-palvelimen ja instanssin vC$lille. TC$mC$n jC$lkeen voit kC$yttC$C$ tavallista `iptablesia` tai `nftablesia` luomaan "Zero Trust" -palomuurin. Voit esimerkiksi estC$C$ kaiken ulospC$in suuntautuvan liikenteen kokonaan, lukuun ottamatta yhtC$ tiettyC$ IP:tC$ tai porttia. * **I/O (seccomp-bpf):** Voit rajoittaa instanssia kC$yttC$mC$llC$ `seccomp`:ia, jolla estetC$C$n tiettyjen system callien kC$yttC6 (esim. kielletC$C$n hakemistojen poistaminen tai rajoitetaan tiedostojen lukuoikeuksia chroot/pivot_root-ympC$ristC6n avulla). **3.9: Pakotetut proxyt ja ylikirjoitukset** * **Verkko:** Koska instanssi on omassa verkko-nimiavaruudessaan, voit asettaa sen reititystauluun (routing table) sC$C$nnC6n, joka ohjaa kaiken (esim. satama 80/443) liikenteen pakotetusti ohjauspalvelimesi hallitseman lC$pinC$kyvC$n proxyn lC$pi (transparent proxy `iptables` NAT -sC$C$nnC6illC$). * **I/O-ylikirjoitus (LD_PRELOAD):** Jos haluat interceptata tiedosto-operaatio ita instanssin tajuamatta, voit kC$yttC$C$ `LD_PRELOAD`-tekniikkaa syC6ttC$mC$llC$ instanssiin pienen C-kirjaston ennen Noden kC$ynnistystC$, joka ylikirjoittaa standardit `open/read/write` -kutsut ja ohjaa ne minne haluat. ### Yhteenveto ehdotetusta arkkitehtuurista: 1. **API & Ohjaus:** **Node.js (Fastify)** - ohjaa instansseja suoraan ja toimii lukkona. 2. **Hiekkalaatikko:** Jokainen instanssi kC$ynnistetC$C$n Linuxin `unshare`-komennolla (tai vastaavalla C/Node-kirjastolla) omiin **PID-, Mount-, ja Network Namespaceihin** sekC$ sidotaan omaan **cgroupiin**. 3. **Resurssien hallinta:** Cgroups rajoittaa CPU:n ja I/O:n. 4. **Verkko/Palomuuri:** Namespacen sisC$inen reititys iptablesilla + lC$pinC$kyvC$ proxy. 5. **Debug & Muistin peukalointi:** Websocket-yhteys instanssin V8 Inspector API:in, jonka kautta ajetaan backdooreja ja luetaan lennosta heapin tilaa.