Долгото време на работа докажува само дека стартувањето успеало со привилегиите што демонот ги имал во тој момент. Дефектите што се важни овде доаѓаат подоцна: нов клиент се поврзува, списокот за отповикување се заменува, помошна скрипта треба да запише датотека. Секој од нив е ново отворање извршено од сметката без привилегии, со сопствено прашање за дозволи и сопствена порака за грешка. Три одлуки делат конфигурација што продолжува да работи од онаа што пропаѓа при следниот настан.

Одвојте го рано вчитаното од она што се отвора подоцна

Описникот е рачка на отворен опис на датотека, а режимот на пристап бил фиксиран при создавањето на тој опис. Подоцнежната промена на корисникот на процесот не ја затвора рачката, затоа клучната датотека прочитана како root продолжува да работи по намалувањето. Ни режимот не се менува: рачка отворена за читање не станува запишлива, а запишлива рачка не се повлекува само затоа што сметката ги загубила правата на патеката. Овие два факти го објаснуваат најголемиот дел од изненадувачкото однесување во овие извештаи.

Другата половина е меморија. Демонот може да анализира сертификат, да го задржи анализираниот материјал и да ја затвори датотеката; во употреба остануваат податоци, не отворена датотека. Затоа продолжениот сообраќај не докажува ниту дека описникот е отворен, ниту дека името на патеката е достапно. Докажува само дека материјалот потребен за тековната сесија е добиен порано.

Подоцнежното отворање е друга трансакција. Се извршува со тековните акредитиви, тековниот безбедносен контекст и тековниот приказ на монтирање, па патека што била читлива при стартувањето може да биде одбиена при следното поврзување. Ротацијата додава стапица: пишувањето нова датотека врз истото име на патека остави постоечкиот описник прикачен на стариот објект, па повторното вчитување може да изгледа успешно додека демонот сè уште го користи претходниот содржина. Споредете го inode што го држи процесот со оној на дискот пред да поверувате дека ротацијата стапила на сила.

Именувајте ги трите читања во време на извршување и кога се случува секое

Три ресурси обично се отвораат многу по иницијализацијата и пропаѓаат во различни моменти. Конфигурациската датотека на определен клиент се чита кога тој клиент се поврзува, па може да се скрши за еден корисник додека другите продолжуваат. Податоците за отповикување се проверуваат при автентикација на партнерот и повторно кога датотеката се заменува. Привремената папка се допира само кога скрипта или додаток нешто запишува.

Ниту еден од трите не припаѓа на патеката за стартување, затоа сервер здрав со недели може да пропадне при следното поврзување. Категоријата го именува и сопственикот на исправката: првите два се права за читање на конфигурацијата под сметката на демонот, а третиот е запишливо место со тесна намена.

Path reopened laterWhat triggers the openFirst sign when it fails
Client configuration fileA connection for that client identityOne client rejected while others connect
Revocation dataPeer authentication, including after replacementRevoked and valid peers both refused
Script or plugin temporary directoryA helper needs to create a fileThe helper exits with a path error

persist-key одговара на потесно прашање отколку што повеќето претпоставуваат. Тој ја држи клучната датотека отворена низ документираните ресетирања SIGUSR1 и ping-restart, и не прави ништо за CCD датотеки, податоци за отповикување, помошни извршни датотеки или целосно повторно стартување на процесот. Тие сè уште ги следат сопствените патеки на отворање, под која и да е сметка што работи во тој момент.

Потврдете ја сметката и приказот што навистина го има

Прашајте го демонот што работи која сметка ја користи наместо да му верувате на unit датотеката, потоа споредете го одговорот со она што unit го поставува. Несовпаѓањето е првото нешто што треба да се реши, бидејќи секоја подоцнежна проверка на дозволи работи како оној што процесот навистина е. Потоа поминете ја патеката компонента по компонента; преминот се оценува на секое ниво, па читлива датотека во непередлива папка останува нечитлива. Крајниот режим на датотеката е последното прашање, а не првото.

Именските простори и сервисните песочни сандачиња додаваат граници што сопственоста и битовите на режим не ги опишуваат. Патека видлива во вашата обвивка може да отсуствува или да биде само за читање во chroot, именски простор за монтирање или unit што ги крие домашните папки. Безбедносните модули додаваат уште еден слој, па датотека што изгледа читлива сепак може да биде одбиена при отворањето.

ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/alice

Успешното читање во обвивката на администраторот не проверува ниту еден од тие комбинирани услови. Извршете ја проверката како сметката на демонот, со истиот именски простор и песочен сандак, или прифатете дека резултатот ја опишува вашата обвивка, а не серверот. Третата команда е евтината верзија на тој тест: го печати режимот на секоја компонента и пропаѓа на првата што сметката на демонот не може да ја помине.

Дајте му на запишувањето во време на извршување сопствена папка

Читањето е само половина од списокот. Помошна скрипта може да треба да создаде статусна датотека, додаток може да треба да запише состојба до својата конфигурација, а тие записи не се покриени со тоа што дрвото на конфигурацијата се прави запишливо. Дајте ѝ на конкретната папка дозволата за запишување што ја бара нејзината функција, со сопственик и режим што можете да ги објасните. Претпочитајте пристап само за читање за сè што само се чита.

Држете ги дозволите на приватниот клуч одвоени од датотеките на политиката. Клучот што мора повторно да се прочита по ресетирање има различно барање од клиентската датотека што се чита при секое поврзување, а еден попустлив режим за двете дава повеќе пристап отколку што бара проблемот. Посветена сметка на демонот со тесна сопственост полесно се ревидира од широка група. Кога клучот мора да ги преживее ресетирањата, persist-key го отстранува повторното читање наместо да ја прошири папката.

Одлучете врз основа на настанот што можете да го репродуцирате

Жив тунел докажува една патека низ кодот. Настанот на кој му треба датотеката е единствениот тест што го покрива отворањето што ве интересира, било да е ново клиентско поврзување, заменета датотека за отповикување, дозволено меко ресетирање или планирано повторно стартување. Изберете го настанот, извршете го и задржете ја првата грешка, а не последната.

За меко ресетирање, еден сигнал и дневникот на unit покажуваат дали клучот бил прочитан повторно. Испратете го сигналот, потоа прочитајте ги последните редови што ги запишал unit:

systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pager

Не заклучувајте дека компромитиран демон веќе не може да менува датотеки само затоа што привилегиите биле намалени. Што сè уште може зависи од преостанатите акредитиви, неговите способности, папките во кои може да пишува и секоја запишлива рачка што сè уште ја држи. Намалувањето на привилегиите ја стеснува власта, а списокот на отворања во време на извршување покажува колку. Запишете ја таа граница до конфигурацијата за следната личност да не мора повторно да ја открива.

Поврзани статии