Неге OpenVPN ілгегі өз скриптінің қасындағы файлды таба алмайды
Ілгектегі салыстырмалы жолдар скриптке емес, процеске қатысты шешіледі. Оларды __file__ арқылы бекітіңіз, содан кейін рұқсаттарға дейін атау кеңістігі мен сәйкестікті тексеріңіз.
Қатесіз жұмыс істеп, бірақ жоқ файл туралы хабарлайтын ілгектер әдетте дұрыс емес жерге қарайды, өз жұмысында сәтсіздікке ұшырамайды. Скрипттегі салыстырмалы жолдар процестің жұмыс каталогына қатысты шешіледі, ал қызмет сіз таңдамаған жұмыс каталогымен басталады. Скрипттің қасындағы файл мен процестің ашатын файлы бір нәрсе болып қана қалады, егер бірдеңе оларды бекітсе. Бұл айырмашылық рұқсат мәселесі деп қате оқылатын ілгек ақауларының үлкен бөлігін түсіндіреді.
Жолды рұқсаттарға дейін тексеріңіз, өйткені дұрыс емес файлдағы рұқсат қатесі бәрібір дұрыс емес файл.
Салыстырмалы жол файлға емес, процеске қатысты шешіледі
Скрипт open("policy.json") шақырғанда, ядро атауды процестің ағымдағы жұмыс каталогына қатысты шешеді. Скрипттің өз орнынан ештеңе бұл іздеуге қатыспайды. OpenVPN ілгектерді өзі таңдаған каталогтан бастайды, және cd опциясы оны өзгерте алады, сондықтан өз қалтасынан қолмен тексерілген скрипт демон оны іске қосқанда басқаша әрекет етеді. Қолмен тест өтеді, қызметті іске қосу сәтсіз аяқталады, ал журнал жолы тек жоқ атауды атайды.
Python скрипттің орнын __file__ ретінде ашады, және дәл осы бекітуге мүмкіндік береді. Path(__file__).resolve().parent / "policy.json" жолды процестен емес, файлдан құрады. Осы бір жол артықшылықтарда ештеңе өзгертпей жұмыс каталогына тәуелділікті жояды.
Жолды әдейі бекітіңіз, содан кейін resolve не істейтінін тексеріңіз
resolve() символдық сілтемелерді ұстанады, сондықтан ілгекті орнына байланыстыратын орнату сілтеменің мақсатында бекітіледі, сілтемені ұстаған каталогта емес. Бұл әдетте нұсқаланған орналастыру үшін қажет, ал символдық сілтеменің қасында деректерді күтетін орналасу үшін дұрыс емес. Орналастыру нені білдіретінін шешіп, айырмашылықты өндірісте ашудың орнына кодты соған сәйкес жазыңыз. Path(__file__).parent resolve() болмаған жағдайда сілтеменің өз каталогын сақтайды.
Егер деректер бағдарламаға емес, данаға тиесілі болса, конфигурациядан абсолютті жол алыңыз. Орынды қатты кодтау ілгекті бір хост орналасуына байланыстырады.
Төрт шекараны ретімен өтіңіз
Жұмыс каталогынан бастаңыз: бірліктің WorkingDirectory, OpenVPN-нің cd опциясын және exec алдында каталогты ауыстыратын кез келген қаптаманы салыстырыңыз. Содан кейін шешілген орынды растаңыз, өйткені басқа орналастырудағы ұқсас атаулы файл іздеуге жауап беріп, қатені жасыра алады. Келесі — файлдық жүйе көрінісі: chroot немесе қызметтің mount атау кеңістігі хосттың абсолютті жолын жай ғана жоқ ете алады. Соңында — қатынау сәйкестігі, бұл көрінуден бөлек мәселе.
ProtectHome және PrivateTmp әртүрлі орындарды жасырады, және ешқайсысы хосттан алынған каталог тізімінде көрінбейді. Shell ішінде root үшін бар жол бірліктің атау кеңістігінде көрінбейтін болуы мүмкін, сондықтан қызметтен тыс сол команданы тексеру өте азды дәлелдейді.
Іздеуді қызметті кеңейтпей түзетіңіз
Жолды бекіту тек бірінші шекараны шешеді. Ол қызмет жасыратын каталогты ашпайды және артықшылығы жоқ тіркелгіге тек root үшін арналған файлға қатынау бермейді. script-security көтеру OpenVPN қандай скрипттерді іске қосатынын өзгертеді; бұл салыстырмалы атаудың қайда шешілетініне еш әсер етпейді. Бүкіл қызметтің жұмыс каталогын өзгерту мәселеден кеңірек, өйткені кез келген басқа салыстырмалы сертификат, журнал немесе көмекші жол онымен бірге жылжиды.
Тар түзетуді таңдаңыз: скрипттегі детерминді жол, дана деректері үшін айқын конфигурация мәні және ілгек шын мәнінде жұмыс істейтін тіркелгіге сәйкес файл иелігі.
Шекараны атайтын дәлелді жазыңыз
Пайдалы ақаулық есебінде үш нәрсе бар: ілгек талпынған нақты жол, оны тудырған орта және қай шекара бас тартқаны. Файлдың мазмұнын төкпей, шешілген жолды және ерекшелікті басып шығарыңыз. Бұл үштік қате бекітуді жасырын mount-тан және рұқсаттан бас тартудан ажыратады, ал бұлар үш түрлі түзету.
root терминалдан файлды оқи алады деген тұжырым сол сұрақтардың біреуіне жауап береді, қалғандарының ешқайсысына емес. Оның орнына қызметтің өз контекстінен тексеріңіз.