Vse deluje, dokler izvajalec gradnje ne potrebuje istega gnezda gostitelja, ki ga uporablja gost VPN, in takrat nihče ne zna pojasniti, zakaj lahko opravilo bere ključe prehoda. Vse je bilo nameščeno na enem stroju, ker se je prilegalo, in vsak gost je dobil širok dostop, ker je bila to najhitrejša pot do delovanja. Rezultat je gostitelj, katerega meja zaupanja je napajalni kabel. Razdelitev vlog zahteva manj dela, kot se sliši, in se začne z njihovim poimenovanjem.

Tri vloge, ki trenutno delijo vse

Vstop VPN, nabor zasebnih storitev in izvajalec gradnje želijo različne stvari. Prvi potrebuje javna vrata in ozko omrežje na zasebni strani. Drugi potrebuje trajno shrambo in skrivnosti aplikacije. Tretji izvaja kodo, ki jo je napisal nekdo drug.

Prav to, da imajo vse tri enak dostop, naredi simptom zmeden, saj lahko potem katera koli od njih vpliva na druge. Opravilo gradnje, ki doseže gnezdo hipervizorja, je opravilo, ki lahko ustavi VPN. Gost s storitvami, ki ima pot v upravljavsko omrežje, lahko spremeni konfiguracijo stikala. Težava so dovoljenja, seznam procesov pa je le kraj, kjer se to pokaže. Če najprej poimenujete vloge, dobi vsako dovoljenje svoj prostor.

Spodnja skica je izhodišče za to razdelitev, ne obljuba visoke razpoložljivosti. Obravnavajte jo kot hipotezo za preverjanje, ne kot končno zasnovo.

Razdelite tri vloge, ne treh procesov

Trije gostje na enem gostitelju dajo tri nabore dovoljenj in tri omrežne položaje. Ne dajo treh domen odpovedi, in zasnova bi morala to povedati na glas.

Ločitev pomaga le, če kompromitacija enega gosta drugim ne podeli dostopa samodejno, to pa je nastavitev hipervizorja, ne dogovor o poimenovanju. Če VM poimenujete prehod, to drugega gosta ne ustavi pri doseganju gostitelja. Berite konfiguracijo navideznega stikala namesto imena gostitelja in nato potrdite, da vsak gost sedi tam, kjer mislite.

host
├─ vpn-gw      10.60.10.2/24   public 51820/udp only
├─ services    10.60.0.10/24   no route to the management network
└─ ci-runner   10.60.20.2/24   outbound only, no host socket

Zapišite topologijo in jo nato preverite z orodji, ki jo upravljajo. Gost, ki se pojavi na napačnem mostu, je ugotovitev, ne podrobnost. Popravite omrežje, preden spremenite konfiguracijo katere koli storitve.

Naj gost VPN odpre samo vrata, ki so njegova

Objavite vrata predora na usmerjevalniku in nič drugega. Upravljavska vrata gosta spadajo na upravljavsko pot, ne na internet, in tja spada tudi vmesnik hipervizorja samega.

Omrežje na zasebni strani naj doseže storitve, ki jih oddaljeni uporabniki potrebujejo, in se tam ustavi. Preverjanje pristnosti aplikacije ostane vključeno, ker je predor prenos, ne prijava. Usmerjevalno tabelo gosta VPN ohranite tako majhno, da jo opišete v enem stavku. Če je ne morete opisati tako preprosto, se je meja že zabrisala.

virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'

Karkoli posluša na gostitelju in ni potrebno za upravljanje, ne bi smelo poslušati sploh. To vključuje API hipervizorja, ki ga je lahko pustiti izpostavljenega na javnem vmesniku.

Opravila gradnje potrebujejo drugačno vrsto meje

Opravilo CI izvaja ukaze, ki jih nadzoruje shramba, zato je njegovo zaupanje odvisno od tega, kdo lahko potisne kodo. Izvajalec lupine te ukaze izvaja kot uporabnik izvajalnika na gostitelju, kar je najširša razpoložljiva meja.

Izvajalci v vsebnikih so ožji, in privilegirani vsebnik ni eden od ozkih. Izvajalnik imejte v lastnem gostu z lastnim omrežnim obsegom in mu dajte le dostop do artefaktov in uvajanja, ki ga opravila potrebujejo. Enkratni delavci zmanjšajo shranjeno stanje; ne zmanjšajo dosegljivosti ali izpostavljenosti skrivnostim. Oboje še vedno potrebuje izrecne omejitve.

Gost s storitvami ima podatke, zato mora njegov načrt varnostnega kopiranja delovati. Ohranite shrambe, prenose in zbirko podatkov v istem urniku. Preizkusite obnovitev, namesto da berete stanje opravila.

Načrtujte odpoved, ki jo vse tri delijo

En gostitelj je ena domena odpovedi. Ponovni zagon odstrani predor in vsako zasebno storitev v istem trenutku, in prav takrat je pot navznoter najbolj pomembna.

Ohranite dostop do konzole, ki ni odvisen od gosta VPN, naj bo to fizična konzola, upravljavski vmesnik zunaj pasu ali ponudnikova konzola. Posnetek, shranjen na istem disku, ni neodvisna kopija, in tudi varnostna kopija, ki teče znotraj gosta, ki ga varuje, ni. Nato preizkusite hladen zagon kot zaporedje, ne kot kontrolni seznam: gostitelj, navidezna omrežja, pot predora in ena poimenovana aplikacija pod običajnim računom.

virsh list --all
systemctl is-active libvirtd
curl -sS -m 5 -o /dev/null -w '%{http_code}\n' https://10.60.0.10/
ss -ltnp | grep -E ':51820|:443'

Vrstni red zagona procesov ne dokaže ničesar o poteh in DNS, zato preizkusite pot, ne stanj enot. Pot je tisto, kar oddaljeni uporabnik v resnici potrebuje.

Sorodni članki