பிழையின்றி இயங்கி இருந்தும் காணாத கோப்பைப் புகாரளிக்கும் ஹூக்கள் பொதுவாக தவறான இடத்தைப் பார்க்கின்றன, தங்கள் வேலையில் தோல்வியடைவதில்லை. ஸ்கிரிப்டில் உள்ள சார்பு பாதைகள் செயல்முறையின் வேலை அடைவை அடிப்படையாகக் கொண்டு தீர்க்கப்படுகின்றன, மேலும் சேவை நீங்கள் தேர்ந்தெடுக்காத வேலை அடைவுடன் தொடங்குகிறது. ஸ்கிரிப்டின் அருகில் உள்ள கோப்பும் செயல்முறை திறக்கும் கோப்பும் ஏதோ ஒன்று அவற்றை நங்கூரமிடும் போது மட்டுமே ஒன்றாகும். அந்த இடைவெளியே அனுமதிச் சிக்கல் என்று தவறாகப் படிக்கப்படும் ஹூக் தோல்விகளின் பெரும் பகுதியை விளக்குகிறது.

அனுமதிகளுக்கு முன் பாதையைச் சரிபார்க்கவும், ஏனெனில் தவறான கோப்பில் உள்ள அனுமதிப் பிழை இன்னும் தவறான கோப்பே.

சார்பு பாதை கோப்பை அல்ல, செயல்முறையை அடிப்படையாகக் கொண்டு தீர்க்கப்படுகிறது

ஒரு ஸ்கிரிப்ட் open("policy.json") ஐ அழைக்கும்போது, கர்னல் அந்தப் பெயரை செயல்முறையின் தற்போதைய வேலை அடைவை அடிப்படையாகக் கொண்டு தீர்க்கிறது. ஸ்கிரிப்டின் சொந்த இடத்திலிருந்து எதுவும் அந்தத் தேடலில் பங்கேற்கவில்லை. OpenVPN தானே தேர்ந்தெடுக்கும் அடைவிலிருந்து ஹூக்களைத் தொடங்குகிறது, மேலும் cd விருப்பம் அதை மாற்றலாம், எனவே தன் கோப்புறையிலிருந்து கையால் சோதிக்கப்பட்ட ஸ்கிரிப்ட் டீமன் அதை இயக்கும்போது வேறுவிதமாக நடந்துகொள்கிறது. கைச் சோதனை வெற்றியடைகிறது, சேவை இயக்கம் தோல்வியடைகிறது, பதிவு வரி காணாத பெயரை மட்டும் குறிப்பிடுகிறது.

Python ஸ்கிரிப்டின் இடத்தை __file__ ஆக வெளிப்படுத்துகிறது, அதுவே நங்கூரமிடலைச் சாத்தியமாக்குகிறது. Path(__file__).resolve().parent / "policy.json" செயல்முறையிலிருந்து அல்ல, கோப்பிலிருந்து பாதையை உருவாக்குகிறது. அந்த ஒரு வரி சலுகைகளில் எதையும் மாற்றாமல் வேலை அடைவுச் சார்பை நீக்குகிறது.

பாதையை வேண்டுமென்றே நங்கூரமிடுங்கள், பிறகு resolve என்ன செய்கிறது என்பதைச் சரிபார்க்கவும்

resolve() குறியீட்டு இணைப்புகளைப் பின்பற்றுகிறது, எனவே ஹூக்கை அதன் இடத்தில் இணைக்கும் நிறுவல் இணைப்பின் இலக்கில் நங்கூரமிடப்படுகிறது, இணைப்பை வைத்திருக்கும் அடைவில் அல்ல. பதிப்புள்ள வரிசைப்படுத்தலுக்கு இதுவே பொதுவாகத் தேவை, மேலும் குறியீட்டு இணைப்பின் அருகில் தரவை எதிர்பார்க்கும் அமைப்புக்கு இது தவறு. வரிசைப்படுத்தல் எதைக் குறிக்கிறது என்பதை முடிவு செய்து, உற்பத்தியில் வித்தியாசத்தைக் கண்டுபிடிக்காமல் அதற்கேற்ப குறியீட்டை எழுதுங்கள். Path(__file__).parent இல்லாமல் resolve() இணைப்பின் சொந்த அடைவைத் தக்கவைக்கிறது.

தரவு நிரலுக்கு அல்ல, நிகழ்வுக்குச் சொந்தமானது என்றால், உள்ளமைவிலிருந்து முழுமையான பாதையை எடுங்கள். இருப்பிடத்தை கடினமாக குறியிடுவது ஹூக்கை ஒரு ஹோஸ்ட் அமைப்புடன் பிணைக்கிறது.

நான்கு எல்லைகளை வரிசையாகக் கடக்கவும்

வேலை அடைவிலிருந்து தொடங்குங்கள்: யூனிட்டின் WorkingDirectory, OpenVPN இன் cd விருப்பம் மற்றும் exec க்கு முன் அடைவை மாற்றும் எந்த மேலுறையையும் ஒப்பிடுங்கள். பிறகு தீர்க்கப்பட்ட இருப்பிடத்தை உறுதிப்படுத்துங்கள், ஏனெனில் மற்றொரு வரிசைப்படுத்தலில் உள்ள ஒத்த பெயர் கோப்பு தேடலுக்குப் பதிலளித்து பிழையை மறைக்கலாம். அடுத்து கோப்பு முறைமையின் பார்வை வருகிறது: chroot அல்லது சேவையின் மவுண்ட் பெயர்வெளி ஹோஸ்ட்டின் முழுமையான பாதையை வெறுமனே இல்லாததாக்கலாம். கடைசியாக அணுகல் அடையாளம், இது தெரிவுநிலையிலிருந்து தனியான கேள்வி.

ProtectHome மற்றும் PrivateTmp வெவ்வேறு இருப்பிடங்களை மறைக்கின்றன, ஹோஸ்ட்டிலிருந்து எடுக்கப்பட்ட அடைவுப் பட்டியலில் இரண்டும் தெரிவதில்லை. ஷெல்லில் root க்கு இருக்கும் பாதை யூனிட்டின் பெயர்வெளிக்குள் கண்ணுக்குத் தெரியாமல் இருக்கலாம், அதனால்தான் சேவைக்கு வெளியே அதே கட்டளையைச் சோதிப்பது மிகக் குறைவாகவே நிரூபிக்கிறது.

சேவையை விரிவாக்காமல் தேடலைச் சரிசெய்யுங்கள்

பாதையை நங்கூரமிடுவது முதல் எல்லையை மட்டும் தீர்க்கிறது. சேவை மறைக்கும் அடைவை அது வெளிப்படுத்தாது, root க்கு மட்டும் உள்ள கோப்புக்கு சலுகையற்ற கணக்கிற்கு அணுகலைத் தராது. script-security உயர்த்துவது OpenVPN எந்த ஸ்கிரிப்டுகளை இயக்கும் என்பதை மாற்றுகிறது; சார்புப் பெயர் எங்கே தீர்க்கப்படுகிறது என்பதில் அதற்கு எந்த விளைவும் இல்லை. முழுச் சேவைக்கும் வேலை அடைவை மாற்றுவது சிக்கலை விட பரந்தது, ஏனெனில் மற்ற ஒவ்வொரு சார்பு சான்றிதழ், பதிவு அல்லது உதவிப் பாதையும் அதனுடன் நகர்கிறது.

குறுகிய திருத்தத்தைத் தேர்ந்தெடுங்கள்: ஸ்கிரிப்டில் தீர்மானமான பாதை, நிகழ்வுத் தரவுக்கு வெளிப்படையான உள்ளமைவு மதிப்பு, மற்றும் ஹூக் உண்மையில் இயங்கும் கணக்குடன் பொருந்தும் கோப்பு உரிமை.

எல்லையைப் பெயரிடும் சான்றுகளைப் பதிவு செய்யுங்கள்

பயனுள்ள தோல்வி அறிக்கையில் மூன்று விஷயங்கள் உள்ளன: ஹூக் முயற்சித்த சரியான பாதை, அதை உருவாக்கிய சூழல், எந்த எல்லை மறுத்தது. கோப்பின் உள்ளடக்கத்தைக் கொட்டாமல் தீர்க்கப்பட்ட பாதையையும் விதிவிலக்கையும் அச்சிடுங்கள். அந்த மும்மை தவறான நங்கூரத்தை மறைந்த மவுண்ட்டிலிருந்தும் அனுமதி மறுப்பிலிருந்தும் பிரிக்கிறது, அவை மூன்று வெவ்வேறு திருத்தங்கள்.

root முனையத்திலிருந்து கோப்பைப் படிக்க முடியும் என்ற கூற்று அந்தக் கேள்விகளில் ஒன்றுக்கு மட்டும் பதிலளிக்கிறது, மற்றவற்றுக்கு எதற்கும் இல்லை. அதற்குப் பதிலாக சேவையின் சொந்த சூழலிலிருந்து சோதியுங்கள்.

தொடர்புடைய கட்டுரைகள்