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-ന് ടെർമിനലിൽനിന്ന് ഫയൽ വായിക്കാനാകും എന്ന അവകാശവാദം ആ ചോദ്യങ്ങളിലൊന്നിന് മാത്രം ഉത്തരം നൽകുന്നു, ബാക്കിയൊന്നിനും ഇല്ല. പകരം സേവനത്തിന്റെ സ്വന്തം സന്ദർഭത്തിൽനിന്ന് പരീക്ഷിക്കുക.