Jeden laboratórny server, tri roly dôvery, jedna doména zlyhania
Vstup VPN, súkromné služby a úlohy CI potrebujú oddelené oprávnenia aj na jednom serveri. Rozdeľte roly, izolujte siete a zachovajte obnovu cez konzolu.
Všetko funguje, kým runner zostavovania nepotrebuje ten istý socket hostiteľa, ktorý používa hosť VPN, a vtedy nikto nevie vysvetliť, prečo úloha môže čítať kľúče brány. Všetko sa nainštalovalo na jeden stroj, lebo sa to vmestilo, a každý hosť dostal široký prístup, lebo to bol najrýchlejší spôsob, ako to rozbehnúť. Výsledkom je hostiteľ, ktorého hranicou dôvery je napájací kábel. Rozdelenie rolí si vyžiada menej práce, než to znie, a začína ich pomenovaním.
Tri roly, ktoré dnes zdieľajú všetko
Vstup VPN, súbor súkromných služieb a runner zostavovania chcú rozdielne veci. Prvý potrebuje verejný port a úzku sieť na súkromnej strane. Druhý potrebuje trvalé úložisko a tajomstvá aplikácie. Tretí spúšťa kód, ktorý napísal niekto iný.
Práve to, že všetky tri majú rovnaký prístup, robí príznak mätúcim, pretože potom môže ktorýkoľvek z nich ovplyvniť ostatné. Úloha zostavovania, ktorá dosiahne socket hypervízora, je úloha, ktorá môže zastaviť VPN. Hosť so službami, ktorý má trasu do riadiacej siete, môže zmeniť konfiguráciu prepínača. Problémom sú oprávnenia a zoznam procesov je len miesto, kde sa to prejaví. Pomenovanie rolí najprv dá každému oprávneniu miesto, kde má žiť.
Náčrt nižšie je východiskom pre toto rozdelenie, nie prísľubom vysokej dostupnosti. Berte ho ako hypotézu na overenie, nie ako hotový návrh.
Rozdeľte tri roly, nie tri procesy
Traja hostia na jednom hostiteľovi dávajú tri sady oprávnení a tri sieťové pozície. Nedávajú tri domény zlyhania a návrh by to mal povedať nahlas.
Oddelenie pomáha len vtedy, ak kompromitácia jedného hosťa automaticky neudelí prístup ostatným, a to je nastavenie hypervízora, nie konvencia pomenovania. Nazvať VM bránou nezabráni inému hosťovi dostať sa k hostiteľovi. Čítajte konfiguráciu virtuálneho prepínača namiesto názvu hostiteľa a potom potvrďte, že každý hosť sedí tam, kde si myslíte.
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
Zapíšte topológiu a potom ju overte nástrojmi, ktoré ju vlastnia. Hosť, ktorý sa objaví na nesprávnom moste, je zistenie, nie detail. Opravte sieť skôr, než zmeníte konfiguráciu ktorejkoľvek služby.
Nechajte hosťa VPN otvoriť len dvere, ktoré vlastní
Zverejnite port tunela na routeri a nič viac. Administratívne porty hosťa patria na riadiacu cestu, nie na internet, a patrí tam aj rozhranie samotného hypervízora.
Sieť na súkromnej strane by mala dosiahnuť služby, ktoré vzdialení používatelia potrebujú, a tam sa zastaviť. Overovanie aplikácie zostáva zapnuté, pretože tunel je transport, nie prihlásenie. Udržujte smerovaciu tabuľku hosťa VPN takú malú, aby sa dala opísať jednou vetou. Ak ju nedokážete opísať tak jednoducho, hranica sa už rozmazala.
virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'
Čokoľvek počúva na hostiteľovi a nie je potrebné na riadenie, by nemalo počúvať vôbec. Patrí sem API hypervízora, ktoré sa ľahko nechá vystavené na verejnom rozhraní.
Úlohy zostavovania potrebujú iný druh hranice
Úloha CI spúšťa príkazy riadené repozitárom, takže jej dôvera závisí od toho, kto môže odosielať kód. Shellový vykonávač spúšťa tieto príkazy ako používateľ runnera na hostiteľovi, čo je najširšia dostupná hranica.
Kontajnerové vykonávače sú užšie a privilegovaný kontajner nie je jeden z tých úzkych. Udržujte runnera vo vlastnom hosťovi s vlastným rozsahom siete a dajte mu len prístup k artefaktom a nasadeniu, ktorý úlohy potrebujú. Jednorazoví pracovníci znižujú uchovávaný stav; neznižujú dosiahnuteľnosť ani vystavenie tajomstiev. Oboje stále potrebuje výslovné limity.
Hosť so službami vlastní dáta, takže práve jeho plán zálohovania musí fungovať. Udržujte repozitáre, nahrávania a databázu v rovnakom harmonograme. Otestujte obnovu namiesto čítania stavu úlohy.
Naplánujte zlyhanie, ktoré všetky tri zdieľajú
Jeden hostiteľ je jedna doména zlyhania. Reštart odstráni tunel a všetky súkromné služby v tej istej chvíli, a práve vtedy cesta dnu záleží najviac.
Zachovajte prístup ku konzole, ktorý nezávisí od hosťa VPN, či už je to fyzická konzola, mimosieťové riadiace rozhranie alebo konzola poskytovateľa. Snímka uložená na tom istom disku nie je nezávislá kópia, a nie je ňou ani záloha, ktorá beží vnútri hosťa, ktorého chráni. Potom otestujte studený štart ako sled, nie ako kontrolný zoznam: hostiteľ, virtuálne siete, cesta tunela a jedna pomenovaná aplikácia pod bežným účtom.
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'
Poradie štartu procesov nič nedokazuje o trasách a DNS, takže testujte cestu, nie stavy jednotiek. Cesta je to, čo vzdialený používateľ naozaj potrebuje.