Üks laboriserver, kolm usaldusrolli, üks tõrkedomeen
VPN-i sissepääs, privaatsed teenused ja CI-tööd vajavad eraldi õigusi isegi ühel serveril. Eralda rollid, isoleeri võrgud ja hoia konsooli taaste.
Kõik töötab seni, kuni ehitustöö jooksutaja vajab sama hosti soklit, mida kasutab VPN-i külaline, ja siis ei oska keegi selgitada, miks saab töö lugeda lüüsi võtmeid. Kõik paigaldati ühele masinale, sest see mahtus ära, ja igale külalisele anti lai ligipääs, sest see oli kiireim viis asja tööle saada. Tulemuseks on host, mille usalduspiiriks on toitekaabel. Rollide eraldamine on vähem tööd, kui tundub, ja see algab nende nimetamisest.
Kolm rolli, mis praegu jagavad kõike
VPN-i sissepääs, hulk privaatseid teenuseid ja ehitustöö jooksutaja tahavad erinevaid asju. Esimene vajab avalikku porti ja kitsast võrku privaatsel poolel. Teine vajab püsivat salvestusruumi ja rakenduse saladusi. Kolmas käivitab koodi, mille kirjutas keegi teine.
Just see, et kõik kolm saavad sama ligipääsu, teeb sümptomi segaseks, sest siis võib ükskõik milline neist mõjutada teisi. Ehitustöö, mis pääseb hüperviisori soklile, on töö, mis võib VPN-i peatada. Teenuste külaline, kellel on marsruut haldusvõrku, võib kommutaatori seadistust muuta. Õigused on probleem ja protsesside nimekiri on vaid koht, kus see välja tuleb. Kui nimed rollid enne, saab iga õigus koha, kus elada.
Allolev visand on selle jaotuse lähtepunkt, mitte lubadus kõrgest käideldavusest. Käsitle seda kontrollitava hüpoteesina, mitte valmis kavandina.
Eralda kolm rolli, mitte kolm protsessi
Kolm külalist ühel hostil annavad kolm õiguste hulka ja kolm võrgupositsiooni. Need ei anna kolme tõrkedomeeni ja kavand peaks seda valjusti ütlema.
Eraldamine aitab vaid siis, kui ühe külalise kompromiteerimine ei anna teistele automaatselt õigusi, ja see on hüperviisori seade, mitte nimetamise kokkulepe. VM-i lüüsiks nimetamine ei takista teist külalist hostile pääsemast. Loe virtuaalse kommutaatori seadistust hostinime asemel ja kinnita siis, et iga külaline istub seal, kus sa arvad.
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
Kirjuta topoloogia üles ja kontrolli seda siis tööriistadega, mis seda omavad. Valele sillale ilmuv külaline on leid, mitte detail. Paranda võrk enne, kui muudate ükskõik millist teenuse seadistust.
Lase VPN-i külalisel avada ainult uksed, mis talle kuuluvad
Avalda tunneliport ruuteril ja mitte midagi muud. Külaliste haldusportid kuuluvad haldusteekonda, mitte internetti, ja hüperviisori oma liides kuulub sinna samuti.
Privaatse poole võrk peaks jõudma teenusteni, mida kaugkasutajad vajavad, ja seal lõppema. Rakenduse autentimine jääb sisse lülitatuks, sest tunnel on transport, mitte sisselogimine. Hoia VPN-i külalise marsruutimistabel nii väike, et seda saab kirjeldada ühe lausega. Kui sa ei suuda seda nii lihtsalt kirjeldada, on piir juba hägustunud.
virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'
Kõik, mis hostil kuulab ja mida halduseks ei vajata, ei peaks üldse kuulama. See hõlmab hüperviisori API-t, mida on lihtne avalikule liidesele avatuks jätta.
Ehitustööd vajavad teistsugust piiri
CI-töö käivitab hoidla poolt juhitud käske, nii et selle usaldus sõltub sellest, kes saab koodi lükata. Kesta täitja käivitab need käsud jooksutaja kasutajana hostil ja see on kõige laiem saadaolev piir.
Konteinerite täitjad on kitsamad ja privilegeeritud konteiner ei kuulu kitsaste hulka. Hoia jooksutaja omaette külalises oma võrgumahuga ja anna talle ainult see artefaktide ja juurutuse ligipääs, mida tööd vajavad. Ühekordsed töötajad vähendavad säilitatavat olekut; need ei vähenda kättesaadavust ega saladuste paljastumist. Mõlemad vajavad endiselt selgeid piiranguid.
Teenuste külaline omab andmeid, seega just tema varunduskava peab toimima. Hoia hoidlad, üleslaadimised ja andmebaas samas ajakavas. Testi taastamist, mitte töö oleku lugemist.
Planeeri tõrge, mida kõik kolm jagavad
Üks host on üks tõrkedomeen. Taaskäivitamine eemaldab tunneli ja iga privaatse teenuse samal hetkel ja täpselt siis on sissepääs kõige tähtsam.
Hoia konsooliligipääs, mis ei sõltu VPN-i külalisest, olgu see füüsiline konsool, ribaväline haldusliides või teenusepakkuja konsool. Samal kettal hoitav hetktõmmis ei ole sõltumatu koopia ja ka varukoopia, mis töötab selle külalise sees, mida ta kaitseb, ei ole. Seejärel testi külmkäivitust järjestusena, mitte kontrollnimekirjana: host, virtuaalvõrgud, tunneliteekond ja üks nimetatud rakendus tavalise konto all.
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'
Protsesside käivitamise järjekord ei tõesta marsruutide ja DNS-i kohta midagi, seega testi teekonda, mitte üksuste olekuid. Teekond on see, mida kaugkasutaja tegelikult vajab.