Sve radi sve dok graditelj ne zatraži isti socket domaćina koji koristi VPN gost, a tada niko ne može objasniti zašto posao može čitati ključeve pristupnika. Sve je instalirano na jednoj mašini jer je tako stajalo, a svaki gost je dobio širok pristup jer je to bio najbrži način da sve proradi. Rezultat je domaćin čija je granica povjerenja sam kabel za napajanje. Podjela uloga traži manje posla nego što zvuči, a počinje njihovim imenovanjem.

Tri uloge koje trenutno dijele sve

Ulaz u VPN, skup privatnih usluga i graditelj buildova žele različite stvari. Prvi treba javni port i usku mrežu na privatnoj strani. Drugi treba trajno skladište i tajne aplikacije. Treći izvršava kod koji je napisao neko drugi.

Davanje istog pristupa sva tri dijela čini simptom zbunjujućim, jer tada svaki od njih može uticati na ostale. Build posao koji može dohvatiti hypervisor socket je posao koji može zaustaviti VPN. Gost sa uslugama koji ima rutu do upravljačke mreže može promijeniti konfiguraciju prekidača. Problem su privilegije, a lista procesa je samo mjesto gdje se to pokaže. Imenovanje uloga prvo daje svakoj privilegiji svoje mjesto.

Skica ispod je početna tačka za tu podjelu, a ne obećanje visoke dostupnosti. Tretirajte je kao hipotezu koju treba provjeriti, a ne kao gotov dizajn.

Podijelite tri uloge, a ne tri procesa

Tri gosta na jednom domaćinu daju tri skupa privilegija i tri mrežna položaja. Oni ne daju tri domene otkaza, i dizajn to treba glasno reći.

Razdvajanje pomaže samo ako kompromitovanje jednog gosta ne daje automatski pristup ostalima, a to je postavka hypervisora, a ne konvencija imenovanja. Nazvati VM pristupnikom ne sprječava drugog gosta da dođe do domaćina. Čitajte konfiguraciju virtuelnog prekidača umjesto imena domaćina, pa potvrdite da svaki gost stoji tamo gdje mislite da stoji.

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 topologiju, a zatim je provjerite alatima koji je posjeduju. Gost koji se pojavi na pogrešnom bridgeu je nalaz, a ne detalj. Ispravite mrežu prije nego što promijenite bilo koju konfiguraciju usluge.

Neka VPN gost otvori samo vrata koja posjeduje

Objavite port tunela na ruteru i ništa više. Administrativni portovi gosta pripadaju na upravljačku stazu, a ne na internet, i tu pripada i vlastito sučelje hypervisora.

Mreža na privatnoj strani treba dosezati usluge koje su udaljeni korisnici tražili i tu se zaustaviti. Autentifikacija aplikacije ostaje uključena, jer je tunel transport, a ne prijava. Držite tabelu rutiranja VPN gosta dovoljno malom da je opišete jednom rečenicom. Ako je ne možete tako jednostavno opisati, granica se već zamutila.

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

Sve što sluša na domaćinu, a nije potrebno za upravljanje, ne bi trebalo uopšte slušati. To uključuje hypervisor API, koji je lako ostaviti izložen na javnom interfejsu.

Build poslovi traže drugačiju vrstu granice

CI posao izvršava komande koje kontroliše repozitorij, pa njegovo povjerenje zavisi od toga ko može gurati kod. Shell executor izvršava te komande kao korisnik runnera na domaćinu, što je najšira dostupna granica.

Container executor je uži, a privilegovani kontejner nije jedan od tih užih. Držite runner u vlastitom gostu sa vlastitim mrežnim opsegom i dajte mu samo pristup artefaktima i isporuci koji poslovi traže. Jednokratni radnici smanjuju zadržano stanje; ne smanjuju dosegljivost ni izloženost tajnama. Oboje i dalje traži izričita ograničenja.

Gost sa uslugama posjeduje podatke, pa je njegov plan rezervnih kopija onaj koji mora raditi. Držite repozitorije, uploads i bazu podataka u istom rasporedu. Testirajte vraćanje umjesto čitanja statusa posla.

Planirajte otkaz koji sva tri dijele

Jedan domaćin je jedna domena otkaza. Restart uklanja tunel i svaku privatnu uslugu u istom trenutku, a to je upravo kada je način ulaska najvažniji.

Zadržite pristup konzoli koji ne zavisi od VPN gosta, bilo da je to fizička konzola, izvanopsežno upravljačko sučelje ili konzola provajdera. Snimak pohranjen na istom disku nije nezavisna kopija, a ni rezervna kopija koja se izvršava unutar gosta kojeg štiti. Zatim testirajte hladni start kao redoslijed, a ne kao kontrolnu listu: domaćin, virtuelne mreže, staza tunela i jedna imenovana aplikacija pod običnim 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'

Redoslijed pokretanja procesa ne dokazuje ništa o rutama i DNS-u, pa testirajte stazu, a ne stanja jedinica. Staza je ono što udaljeni korisnik zaista treba.

Povezani članci