VPN демонындағы қосылым hook-тары демон ретінде жұмыс істейді, және бұл әдетте олардың root ретінде жұмыс істейтінін білдіреді. Сол hook-тардың біреуі біреудің үй каталогына жазған немесе жұмыс үстелінің көмекшісін қайта бастаған сәтте сіз желілік оқиғаға кез келген жергілікті пайдаланушы ретінде әрекет ету мүмкіндігін бердіңіз. Әдеттегі қысқа жол, орта айнымалысынан пайдаланушы атын оқып, оны әрі қарай беру, мұны түзетпейді. Ол әрекетті қайта белгілейді, бірақ оны қай тіркелгі орындайтынын өзгертпейді. Жұмыс істейтіні — үш бөлікті тапсыру: артықшылығы бар қадам не болғанын айтады, ал бөлек бірлік әрекетті дұрыс сәйкестікпен орындайды.

Ортадағы пайдаланушы аты — сәйкестік ауыстырғышы емес

Unix процестің неге қол тигізуге болатынын оның тиімді пайдаланушы ID-і бойынша шешеді, ортасындағы жолдар бойынша емес. USER=alice орнату немесе LOGNAME экспорттау немқұрайлы бағдарламаның шығысында нені басатынын өзгертеді; файл иелігін тексерулерде ештеңе өзгертпейді. Осы айнымалы орнатылған күйде root ретінде жұмыс істейтін hook әлі де Alice-тің файлдарын root ретінде ашады.

Атаулар да бір атау емес. Қашықтан қатынау кіруі, жергілікті Unix тіркелгісі және сертификаттың ортақ аты — жиі сәйкес келетін, кейде келмейтін үш идентификатор. a.smith ретінде аутентификацияланатын пайдаланушының жергілікті тіркелгісі мүлдем болмауы мүмкін немесе каталог қызметі арқылы asmith-ке салыстырылуы мүмкін. Бір жол үш рөлді атқарады деп болжайтын кез келген құрылым бірінші мердігерде сынады.

Сондықтан бірінші сұрақ «қай пайдаланушы қосылған» емес, «қай жергілікті тіркелгіге бұл әрекетті орындауға рұқсат бар». Бұған өз тіркелгі дерекқорыңыздан жауап беріңіз, клиент жіберген деректен емес:

id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json

Үшінші пәрмен — адамдар өткізіп жіберетін пәрмен. Егер мақсатты файл алдыңғы hook оны жасағаны үшін root-қа тиесілі болса, дұрыс конфигурацияланған пайдаланушы әрекеті systemd мәселесіне ұқсайтын, бірақ олай болып табылмайтын рұқсат қатесімен сәтсіз аяқталады.

Демон өз орнында қалады

VPN қызметінің өз User= мәнін Alice-ке ауыстыру — дұрыс емес тұтқа. Бұл демонның интерфейстерді қалай байланыстыратынын, кілттерді қалай оқитынын, күй файлын қалай жазатынын және маршруттарды қалай басқаратынын өзгертеді және бүкіл осы тәуекелді жұмыс істеп тұрған бірлікке көшіреді. Демонға өз артықшылықтары қажет; кейінгі әрекетке қажет емес.

Бірлікке қол тигізбес бұрын оның шын мәнінде не істеп жатқанын қараңыз. Екі пәрмен орындау сәйкестігін және күшіндегі нақты пәрмен жолдарын айтады, оның ішінде қайта анықтау қосқанның бәрі:

systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server

Әдепкі пакет орнатуында демон root, ал --up скрипті соны мұра етеді. Болжам жасаудың орнына растаңыз, өйткені қатайтылған таратым оны бөлек тіркелгіге көшірген болуы мүмкін, ал қолмен жазылған drop-in hook-ты басқа ережелері бар қаптама арқылы іске қосуы мүмкін.

Үш аталған бөлік, бір тар триггер

Қызмет көрсетуден аман өтетін құрылымдарда оқиға, триггер және әрекет бар. Демон аталған сессияның көтерілгенін хабарлайды. Триггер осы шағын фактіні қабылдап, бір тұрақты әрекетті сұрайды. Әрекет қол тигізетін файлдарға ие жергілікті тіркелгі астында жұмыс істейді. Тізбекте ешнәрсе ерікті пәрмен жолын қабылдамайды.

Әрекеттің өзі — қарапайым қызмет бірлігі, ал сәйкестік оның ішіндегі бір директива:

[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i

User=alice бүкіл бірлікке қолданылатынын ескеріңіз, және systemd білуге тұрарлық бір ерекшелікті құжаттайды: + префиксі бар пәрмен оған қарамастан толық артықшылықтармен жұмыс істейді. Бұл префикс бір артықшылығы бар қадам үшін заңды құрал және дәл құрған бөлінуді жоюдың ыңғайлы жолы, сондықтан сол бірліктегі кез келген +-ді шолуда негізделуі тиіс нәрсе ретінде қараңыз.

Триггердің кірісін шағын және құпия емес ұстаңыз. Сессия идентификаторы, салыстырылған тіркелгі және уақыт белгісі әдетте қажеттінің бәрі. Шекарадан ешқашан shell үзіндісін, орындалатын файл жолын немесе клиент ұсынған орта блогын өткізбеңіз, өйткені қабылдаушы жақтың заңды мәнді енгізілген мәннен ажырату тәсілі жоқ.

Шын мәнінде жұмыс істеген сәйкестікті тексеріңіз

Конфигурацияны шолу дәлел емес. Мақұлданған сынақ қосылымынан кейін файлға қол тигізген UID-ді және демон әлі пайдаланып отырған UID-ді растаңыз:

stat -c '%U %G %y %n' /home/alice/.local/state/vpn-status.json
ps -o user=,pid=,cmd= -p "$(pgrep -o -f 'openvpn --daemon')"
systemd-run --uid=alice --pipe /usr/local/bin/refresh-vpn-status --dry-run

Бірінші жол Alice-ті және сынақ терезеңіздің ішіндегі уақыт белгісін көрсетуі керек. Екіншісі әлі де root немесе пакеттің қызмет тіркелгісін көрсетуі керек, бұл демонның орнынан жылжымағанын дәлелдейді. Үшіншісі — нақты қайта қосылымын күтпей-ақ әрекеттің рұқсаттарын тексерудің ең арзан жолы.

Егер файлдың иесі Alice болса, бірақ оның тобы немесе режимі іске қосулар арасында өзгерсе, логика қатесін емес, UMask= немесе каталог рұқсатының айырмашылығын іздеңіз. Егер уақыт белгісі мүлдем қозғалмаса, триггер ешқашан іске қосылмаған, және пайдалы келесі қадам — клиентті тағы қайта қосу емес, әрекет бірлігі үшін journalctl -u.

Қосылым оқиғасы әлі де нені дәлелдемейді

Орнатылған туннель — бір факт. Бұл жұмыс үстелі сессиясының ашық екенін, сессия шинасының қолжетімді екенін немесе әрекет қалайтын жеке ресурстың қазірдің өзінде бар екенін білдірмейді. Alice-тің UID-і астындағы oneshot бірлігі оның сәйкестігіне ие, ал сессиясынан ештеңе жоқ, сондықтан графикалық шина қажет ететіннің бәрі қолдау көрсетілетін пайдаланушы сессиясы механизмінен өтуі және ол жүйеден шыққанда не болатынын анықтауы керек.

Қайта қосылымдар да қайталанады. Пойызда ұйықтаған ноутбук бір сағатта ондаған қосылым оқиғасын тудыруы мүмкін, ал әр жолы бір жол қосатын hook күй файлын ешкім оқи алмайтын журналға айналдырады. Әрекетті идемпотентті етіңіз немесе оған сессия бойынша кілттелген бір жазбаны алмастыруға рұқсат беріңіз.

Соңында, зақым радиусын бірліктің өзінде шектеңіз: күй каталогынан тыс тек оқуға болатын файлдық жүйе көрінісі, жаңа артықшылықтар жоқ және нақты уақыт шегі. Демон мен пайдаланушы әрекетінің бөлінуі өз алдына құнды, бірақ әрекет сіз мақұлдаған жалғыз нәрседен басқа ештеңе істей алмағанда ол әлдеқайда құнды.

Қатысты мақалалар