Еден лабораториски сервер, три улоги на доверба, еден домен на отказ
Влезот VPN, приватните услуги и CI задачите бараат одделни привилегии дури и на еден сервер. Разделете ги улогите, изолирајте ги мрежите, задржете обновување преку конзола.
Сѐ функционира додека извршувачот за изградба не побара истиот сокет на домаќинот што го користи гостинот VPN, и тогаш никој не може да објасни зошто една задача може да ги чита клучевите на портата. Сѐ беше инсталирано на една машина затоа што се вклопуваше, и на секој гостин му беше даден широк пристап затоа што тоа беше најбрзиот начин да се направи да работи. Резултатот е домаќин чија граница на доверба е кабелот за напојување. Разделувањето на улогите е помалку работа отколку што звучи, и започнува со нивно именување.
Три улоги што во моментов делат сѐ
Влезот VPN, збир на приватни услуги и извршувач за изградба сакаат различни работи. Првиот бара јавен порт и тесна мрежа од приватната страна. Вториот бара постојано складиште и тајни на апликацијата. Третиот извршува код што го напишал некој друг.
Токму давањето ист пристап на сите три го прави симптомот збунувачки, бидејќи тогаш секој од нив може да влијае на другите. Задача за изградба што може да го достигне сокетот на хипервизорот е задача што може да го запре VPN. Гостин за услуги со рута до управувачката мрежа може да ја промени конфигурацијата на прекинувачот. Привилегиите се проблемот, а списокот на процеси е само местото каде што тоа се гледа. Именувањето на улогите прво ѝ дава на секоја привилегија место каде да живее.
Скицата подолу е почетна точка за таа поделба, а не ветување за висока достапност. Третирајте ја како хипотеза што треба да се провери, а не како готов дизајн.
Разделете три улоги, не три процеси
Три гостини на еден домаќин даваат три множества привилегии и три мрежни позиции. Тие не даваат три домени на отказ, и дизајнот треба тоа да го каже гласно.
Разделувањето помага само ако компромитирањето на еден гостин не им дава привилегии на другите автоматски, а тоа е поставка на хипервизорот, а не конвенција за именување. Нарекувањето на 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 да ги отвори само вратите што ги поседува
Објавете го портот на тунелот на рутерот и ништо друго. Управувачките портови на гостините припаѓаат на управувачка патека, не на интернет, и сопствениот интерфејс на хипервизорот исто така припаѓа таму.
Мрежата од приватната страна треба да ги достигне услугите што им се потребни на далечинските корисници и таму да запре. Автентикацијата на апликацијата останува вклучена, бидејќи тунелот е транспорт, а не најава. Држете ја табелата за рутирање на гостинот VPN доволно мала за да се опише со една реченица. Ако не можете да ја опишете толку едноставно, границата веќе се заматила.
virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'
Сѐ што слуша на домаќинот и не е потребно за управување не треба воопшто да слуша. Тоа го вклучува API-то на хипервизорот, кое лесно се остава отворено на јавен интерфејс.
Задачите за изградба бараат друг вид граница
Задачата CI извршува команди контролирани од складиштето, така што нејзината доверба зависи од тоа кој може да испрати код. Извршувачот на школка ги извршува тие команди како корисник на извршувачот на домаќинот, и тоа е најшироката достапна граница.
Извршувачите на контејнери се потесни, а привилегиран контејнер не е еден од тесните. Држете го извршувачот во сопствен гостин со сопствен мрежен опсег и дајте му само пристап до артефактите и распоредувањето што им е потребен на задачите. Еднократните работници ја намалуваат задржаната состојба; тие не ја намалуваат достапноста или изложеноста на тајни. Двете сѐ уште бараат експлицитни ограничувања.
Гостинот за услуги ги поседува податоците, па неговиот план за резервни копии е оној што мора да работи. Држете ги складиштата, подигањата и базата на податоци во истиот распоред. Тестирајте обновување наместо да го читате статусот на задачата.
Планирајте го отказот што го делат сите три
Еден домаќин е еден домен на отказ. Рестартирањето ги отстранува тунелот и секоја приватна услуга во истиот момент, и токму тогаш патот внатре е најважен.
Задржете пристап до конзола што не зависи од гостинот 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, затоа тестирајте ја патеката, а не состојбите на единиците. Патеката е она што на далечинскиот корисник навистина му треба.