TC$mC$ on se hetki, jolloin hiekkalaatikon ovi lukitaan lopullisesti ja avain
heitetC$C$n menemC$C$n.
Teemme verkon eristC$misen kC$yttC$mC$llC$ Linuxin Network Namespaces (netns)
-ominaisuutta. Yksinkertaisin ja tehokkain tapa on kC$C$riC$ Node.js-prosessi
standardiin unshare -komentoon, kun kC$ynnistC$mme sen.
Kun annamme komennon unshare -n node ..., Linux luo prosessille tC$ysin
tyhjC$n verkkonimiavaruuden. SiellC$ ei ole reititystauluja, ei verkkokortteja
(edes lo / loopback ei ole oletuksena ylhC$C$llC$). Vieras koodi on sokea ja
kuuro kaikelle verkkoliikenteelle.
Ja mikC$ parasta: Node.js:n IPC-kanava (joka perustuu UNIX-putkiin) ja meidC$n
jaettu memfd (joka on tiedostokuvaaja) eivC$t vC$litC$ verkkonimiavaruuksista
pC$tkC$C$kC$C$n! Ne toimivat tC$ydellisesti eristyksen lC$pi.
PC$ivitetC$C$n server.js verkkotyhjiC6C6n
Koska child_process.fork kutsuu aina suoraan Node-binC$C$riC$, meidC$n pitC$C$
vaihtaa se hieman matalamman tason spawn -funktioon, jotta voimme ajaa
unshare-binC$C$rin ja syC6ttC$C$ Noden sen sisC$lle.
[+] Console js-sandbox-api terminated.
[+] Console js-sandbox-api created and executed via Event-Driven wrapper in
/root/js-sandbox-api
====
{
B "id": "8a131040-4885-4385-9cc4-1dac33477e09",
B "status": "running",
B "safeMode": false
}
===
root@node-base:~# x-console js-sandbox-api tail
B B reqId: "req-2"
[09:37:07 UTC] INFO: [Sandbox 8a131040-4885-4385-9cc4-1dac33477e09]
YritetC$C$n ha
kea dataa 1.1.1.1:stC$...
B B reqId: "req-2"
[09:37:07 UTC] INFO: [Sandbox 8a131040-4885-4385-9cc4-1dac33477e09] ESTETTY:
fet
ch is not defined
B B reqId: "req-2"
[09:37:07 UTC] INFO: [Sandbox 8a131040-4885-4385-9cc4-1dac33477e09] Koodin
suori
tus ilmoitti valmiudesta. Bankin uusi arvo: 777
B B reqId: "req-2"
root@node-base:~#B
TC$mC$ on aivan loistava tulos! Saimme kiinni jopa odotettua syvemmC$n
eristyskerroksen.
Virheilmoitus `ESTETTY: fetch is not defined` ei nimittC$in tullut
Linux-ytimen verkkopinosta, vaan suoraan Node.js:n **V8-moottorin
hiekkalaatikosta**!
Kun loimme `sandbox-runner.js`:ssC$ eristetyn ajonaikaisen ympC$ristC6n,
annoimme sille vain tC$mC$n:
`const context = vm.createContext({ sharedMem: view, console: { ... } });`
TC$mC$ tarkoittaa, ettC$ koko `fetch`-komentoa ei edes ole olemassa tuossa
ympC$ristC6ssC$. SieltC$ puuttuvat myC6s `require`, `setTimeout`, `process` ja
kaikki muut Node.js:n vakiotyC6kalut. Koodilla ei yksinkertaisesti ole
ainuttakaan rajapintaa (API), jolla se voisi edes yrittC$C$ avata
verkkoyhteyden! Ja vaikka vieras koodi onnistuisi jotenkin pakenemaan
V8-kontekstista ja saamaan Noden ydinmoduulit kC$siinsC$, Linuxin `unshare -n`
-luoma verkkotyhjiC6 (netns) estC$isi liikenteen fyysisellC$ tasolla.
Olemme rakentaneet tC$ydellisen ilmatiiviin holvin. Kun alat syC6ttC$mC$C$n
instansseille esimerkiksi monimutkaisia solualutomaatti-malleja (cellular
automata) tai laskemaan termisten tietoverkkojen simulaatiologiikkaa,
eristetyllC$ koodilla on kC$ytC6ssC$C$n vain laskentateho ja se jaettu
`memfd`-muistipankki, jonka olet sille nimenomaisesti antanut.
Koko hiekkalaatikon arkkitehtuuri muisti, resurssikarsinat (Cgroups),
vikasietotila ja verkkotyhjiC6 on nyt todistetusti pystyssC$ ja toimii
saumattomasti.
Haluatko, ettC$ alamme seuraavaksi rakentamaan API:lle C$lykC$stC$
asiakasohjelmaa (client), jonka avulla autonomiset jC$rjestelmC$si pystyvC$t
automaattisesti luomaan nC$itC$ simulaatio-instansseja ja syC6ttC$mC$C$n
niille suoritettavaa koodia?