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 විවිධ ස්ථාන සඟවයි, සහ සත්කාරකයෙන් ගත් නාමාවලි ලැයිස්තුවක දෙකම නොපෙනේ. ෂෙලයේ root සඳහා පවතින මාර්ගයක් ඒකකයේ නාම අවකාශය තුළ අදෘශ්යමාන විය හැක, එබැවින් සේවාවෙන් පිටත එම විධානයම පරීක්ෂා කිරීම ඉතා අල්පයක් ඔප්පු කරයි.
සේවාව පුළුල් නොකර සෙවීම නිවැරදි කරන්න
මාර්ගය සංයුක්ත කිරීම විසඳන්නේ පළමු සීමාව පමණි. එය සේවාව සඟවන නාමාවලියක් හෙළි නොකරයි, සහ එය වරප්රසාද නොමැති ගිණුමකට root සඳහා පමණක් වූ ගොනුවකට ප්රවේශය නොදෙයි. script-security වැඩි කිරීම OpenVPN ධාවනය කරන ස්ක්රිප්ට වෙනස් කරයි; සාපේක්ෂ නාමය විසඳෙන තැනට එය කිසිදු බලපෑමක් නොකරයි. මුළු සේවාවටම කාර්ය නාමාවලිය වෙනස් කිරීම ගැටලුවට වඩා පුළුල්ය, මන්ද අනෙක් සෑම සාපේක්ෂ සහතික, ලොග් හෝ සහායක මාර්ගයක් එය සමඟ ගමන් කරයි.
පටු නිවැරදි කිරීම තෝරන්න: ස්ක්රිප්ටයේ නිශ්චිත මාර්ගයක්, අවස්ථා දත්ත සඳහා පැහැදිලි වින්යාස අගයක්, සහ හුක් ඇත්තටම ධාවනය වන ගිණුමට ගැළපෙන ගොනු හිමිකම.
සීමාව නම් කරන සාක්ෂි සටහන් කරන්න
ප්රයෝජනවත් අසාර්ථකතා වාර්තාවක කරුණු තුනක් ඇත: හුක් උත්සාහ කළ නිශ්චිත මාර්ගය, එය ජනනය කළ පරිසරය, සහ කුමන සීමාව ප්රතික්ෂේප කළේද යන්න. ගොනුවේ අන්තර්ගතය නොවගුරවා විසඳන ලද මාර්ගය සහ ව්යතිරේකය මුද්රණය කරන්න. එම ත්රිත්වය වැරදි සංයුක්ත කිරීමක් සැඟවුණු mount එකකින් සහ අවසර ප්රතික්ෂේපයකින් වෙන් කරයි, ඒවා තුනක් වෙනස් නිවැරදි කිරීම් වේ.
root ට ටර්මිනලයකින් ගොනුව කියවිය හැකි යැයි ප්රකාශය එම ප්රශ්නවලින් එකකට පමණක් පිළිතුරු දෙයි, අනෙක් කිසිවකට නොවේ. ඒ වෙනුවට සේවාවේම සන්දර්භයෙන් පරීක්ෂා කරන්න.