Један лабораторијски сервер, три улоге поверења, један домен отказа
Улаз у VPN, приватне услуге и CI послови захтевају одвојене привилегије чак и на једном серверу. Поделите улоге, изолујте мреже и задржите опоравак преко конзоле.
Све ради све док извршилац изградње не затражи исти сокет домаћина који користи VPN гост, а тада нико не може да објасни зашто посао може да чита кључеве приступника. Све је инсталирано на једној машини јер је тако стајало, а сваки гост је добио широк приступ јер је то био најбржи начин да све проради. Резултат је домаћин чија је граница поверења кабл за напајање. Подела улога тражи мање посла него што звучи, а почиње њиховим именовањем.
Три улоге које тренутно деле све
Улаз у VPN, скуп приватних услуга и извршилац изградње желе различите ствари. Први тражи јавни порт и уску мрежу на приватној страни. Други тражи трајно складиште и тајне апликације. Трећи извршава код који је написао неко други.
Давање истог приступа сва три дела чини симптом збуњујућим, јер тада сваки од њих може да утиче на остале. Посао изградње који може да дохвати hypervisor сокет је посао који може да заустави VPN. Гост са услугама који има руту до управљачке мреже може да промени конфигурацију прекидача. Проблем су привилегије, а листа процеса је само место где се то покаже. Именовање улога прво даје свакој привилегији своје место.
Скица испод је почетна тачка за ту поделу, а не обећање високе доступности. Третирајте је као хипотезу коју треба проверити, а не као готов дизајн.
Поделите три улоге, а не три процеса
Три госта на једном домаћину дају три скупа привилегија и три мрежна положаја. Они не дају три домена отказа, и дизајн то треба гласно да каже.
Раздвајање помаже само ако компромитовање једног госта не даје аутоматски приступ осталима, а то је подешавање hypervisor-а, а не конвенција именовања. Назвати VM приступником не спречава другог госта да дође до домаћина. Читајте конфигурацију виртуелног прекидача уместо имена домаћина, па потврдите да сваки гост стоји тамо где мислите.
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
Запишите топологију, а затим је проверите алатима који је поседују. Гост који се појави на погрешном мосту је налаз, а не детаљ. Исправите мрежу пре него што промените било коју конфигурацију услуге.
Нека VPN гост отвори само врата која поседује
Објавите порт тунела на рутеру и ништа више. Административни портови госта припадају управљачкој стази, а не интернету, и ту припада и сопствено сучеље hypervisor-а.
Мрежа на приватној страни треба да досегне услуге које су удаљени корисници тражили и ту да се заустави. Аутентификација апликације остаје укључена, јер је тунел транспорт, а не пријава. Држите табелу рутирања VPN госта довољно малом да је опишете једном реченицом. Ако не можете тако једноставно да је опишете, граница се већ замутила.
virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'
Све што слуша на домаћину, а није потребно за управљање, не би требало уопште да слуша. То укључује hypervisor API, који је лако оставити изложен на јавном сучељу.
Послови изградње траже другачију врсту границе
CI посао извршава команде које контролише репозиторијум, па његово поверење зависи од тога ко може да гурне код. Shell извршилац извршава те команде као корисник runner-а на домаћину, што је најшира доступна граница.
Container извршиоци су ужи, а привилеговани контејнер није један од тих ужих. Држите runner у сопственом госту са сопственим мрежним опсегом и дајте му само приступ артефактима и испоруци који послови траже. Једнократни радници смањују задржано стање; не смањују достижност ни изложеност тајнама. Обоје и даље тражи изричита ограничења.
Гост са услугама поседује податке, па је његов план резервних копија онај који мора да ради. Држите репозиторијуме, отпремања и базу података у истом распореду. Тестирајте враћање уместо читања статуса посла.
Планирајте отказ који сва три деле
Један домаћин је један домен отказа. Рестарт уклања тунел и сваку приватну услугу у истом тренутку, а то је управо када је начин уласка најважнији.
Задржите приступ конзоли који не зависи од VPN госта, било да је то физичка конзола, изванопсежно управљачко сучеље или конзола провајдера. Снимак сачуван на истом диску није независна копија, а ни резервна копија која се извршава унутар госта којег штити. Затим тестирајте хладни старт као редослед, а не као контролну листу: домаћин, виртуелне мреже, стаза тунела и једна именована апликација под обичним налогом.
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'
Редослед покретања процеса не доказује ништа о рутама и DNS-у, па тестирајте стазу, а не стања јединица. Стаза је оно што удаљени корисник заиста треба.