VPN ഡീമണിലെ കണക്ഷൻ hook-കൾ ഡീമണായി പ്രവർത്തിക്കുന്നു, സാധാരണയായി അത് അവ root ആയി പ്രവർത്തിക്കുന്നു എന്നാണ് അർത്ഥം. ആ hook-കളിൽ ഒന്ന് ആരുടെയെങ്കിലും ഹോം ഡയറക്ടറിയിൽ എഴുതുകയോ ഡെസ്ക്ടോപ്പ് സഹായിയെ വീണ്ടും ആരംഭിക്കുകയോ ചെയ്യുന്ന നിമിഷം, നിങ്ങൾ ഒരു നെറ്റ്വർക്ക് സംഭവത്തിന് ഏതെങ്കിലും പ്രാദേശിക ഉപയോക്താവായി പ്രവർത്തിക്കാനുള്ള കഴിവ് നൽകി. സാധാരണ ചെറുവഴി, അതായത് പരിസ്ഥിതി ചരത്തിൽ നിന്ന് ഉപയോക്തൃനാമം വായിച്ച് അത് കൈമാറുന്നത്, ഇത് പരിഹരിക്കുന്നില്ല. അത് പ്രവർത്തനത്തിന് വീണ്ടും ലേബൽ നൽകുന്നു, പക്ഷേ ഏത് അക്കൗണ്ട് അത് നിർവഹിക്കുന്നു എന്നത് മാറ്റുന്നില്ല. പ്രവർത്തിക്കുന്നത് മൂന്ന് ഭാഗങ്ങളുള്ള കൈമാറ്റമാണ്, അതിൽ പ്രത്യേകാവകാശമുള്ള ഘട്ടം എന്ത് സംഭവിച്ചു എന്ന് പറയുന്നു, ഒരു പ്രത്യേക യൂണിറ്റ് ശരിയായ ഐഡന്റിറ്റിയിൽ പ്രവർത്തനം ചെയ്യുന്നു.

പരിസ്ഥിതിയിലെ ഉപയോക്തൃനാമം ഐഡന്റിറ്റി സ്വിച്ച് അല്ല

യൂണിക്സ് ഒരു പ്രോസസ്സിന് എന്തിൽ സ്പർശിക്കാമെന്ന് അതിന്റെ ഫലപ്രദമായ ഉപയോക്തൃ ID കൊണ്ട് തീരുമാനിക്കുന്നു, അതിന്റെ പരിസ്ഥിതിയിലെ സ്ട്രിംഗുകൾ കൊണ്ടല്ല. USER=alice സെറ്റ് ചെയ്യുന്നതോ LOGNAME എക്സ്പോർട്ട് ചെയ്യുന്നതോ അശ്രദ്ധമായ സോഫ്റ്റ്വെയർ അതിന്റെ ഔട്ട്പുട്ടിൽ എന്ത് പ്രിന്റ് ചെയ്യുന്നു എന്ന് മാറ്റുന്നു; ഫയൽ ഉടമസ്ഥാവകാശ പരിശോധനകളിൽ ഒന്നും മാറ്റുന്നില്ല. ആ ചരം സെറ്റ് ചെയ്ത അവസ്ഥയിൽ root ആയി പ്രവർത്തിക്കുന്ന hook ഇപ്പോഴും root ആയി തന്നെ Alice-ന്റെ ഫയലുകൾ തുറക്കുന്നു.

പേരുകളും ഒരേ പേരല്ല. റിമോട്ട് ആക്സസ് ലോഗിൻ, പ്രാദേശിക യൂണിക്സ് അക്കൗണ്ട്, സർട്ടിഫിക്കറ്റിന്റെ പൊതുനാമം എന്നിവ പലപ്പോഴും ഒത്തുപോകുന്നതും ചിലപ്പോൾ പോകാത്തതുമായ മൂന്ന് ഐഡന്റിഫയറുകളാണ്. 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

മൂന്നാമത്തെ കമാൻഡാണ് ആളുകൾ ഒഴിവാക്കുന്നത്. ലക്ഷ്യ ഫയൽ root-ന്റേതാണെങ്കിൽ, മുൻ hook അത് സൃഷ്ടിച്ചതുകൊണ്ട്, ശരിയായി കോൺഫിഗർ ചെയ്ത ഉപയോക്തൃ പ്രവർത്തനം 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 രേഖപ്പെടുത്തുന്നു: + ഉപസർഗമുള്ള കമാൻഡ് അത് കണക്കിലെടുക്കാതെ പൂർണ അനുമതികളോടെ പ്രവർത്തിക്കുന്നു. ആ ഉപസർഗം ഒറ്റ പ്രത്യേകാവകാശ ഘട്ടത്തിന് സാധുവായ ഉപകരണവും ഇപ്പോൾ നിർമ്മിച്ച വേർതിരിവ് റദ്ദാക്കാനുള്ള സൗകര്യപ്രദമായ വഴിയുമാണ്, അതിനാൽ ആ യൂണിറ്റിലെ ഏത് + എന്നത് അവലോകനത്തിൽ ന്യായീകരിക്കേണ്ട കാര്യമായി കാണുക.

ട്രിഗറിന്റെ ഇൻപുട്ട് ഏറ്റവും കുറവും രഹസ്യമല്ലാത്തതുമായി നിലനിർത്തുക. സെഷൻ ഐഡന്റിഫയർ, മാപ്പ് ചെയ്ത അക്കൗണ്ട്, ഒരു ടൈംസ്റ്റാമ്പ് എന്നിവ സാധാരണയായി ആവശ്യമായതെല്ലാം. അതിർത്തിക്ക് അപ്പുറം ഒരു ഷെൽ ശകലം, എക്സിക്യൂട്ടബിൾ പാത്ത് അല്ലെങ്കിൽ ക്ലയന്റ് നൽകിയ പരിസ്ഥിതി ബ്ലോക്ക് ഒരിക്കലും കൈമാറരുത്, കാരണം സ്വീകരിക്കുന്ന കക്ഷിക്ക് സാധുവായ മൂല്യവും കുത്തിവെച്ചതും തമ്മിൽ വേർതിരിച്ചറിയാനുള്ള വഴിയില്ല.

യഥാർത്ഥത്തിൽ പ്രവർത്തിച്ച ഐഡന്റിറ്റി പരിശോധിക്കുക

കോൺഫിഗറേഷൻ അവലോകനം തെളിവല്ല. അംഗീകരിച്ച ടെസ്റ്റ് കണക്ഷന് ശേഷം, ഫയലിൽ സ്പർശിച്ച 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 സ്റ്റാറ്റസ് ഫയലിനെ ആർക്കും വായിക്കാനാകാത്ത ഒരു ലോഗ് ആക്കി മാറ്റുന്നു. പ്രവർത്തനം ഐഡംപൊട്ടന്റ് ആക്കുക, അല്ലെങ്കിൽ സെഷൻ കീ ചെയ്ത ഒരു റെക്കോർഡ് മാറ്റിസ്ഥാപിക്കാൻ അനുവദിക്കുക.

അവസാനം, യൂണിറ്റിനുള്ളിൽ തന്നെ നാശത്തിന്റെ ആരം പരിമിതപ്പെടുത്തുക: സ്റ്റേറ്റ് ഡയറക്ടറിക്ക് പുറത്ത് വായിക്കാൻ മാത്രമുള്ള ഫയൽസിസ്റ്റം കാഴ്ച, പുതിയ പ്രത്യേകാവകാശങ്ങളില്ല, വ്യക്തമായ ഒരു സമയപരിധി. ഡീമണും ഉപയോക്തൃ പ്രവർത്തനവും തമ്മിലുള്ള വേർതിരിവ് സ്വതവേ മൂല്യമുള്ളതാണ്, എന്നാൽ നിങ്ങൾ അംഗീകരിച്ച ഒരു കാര്യം മാത്രമല്ലാതെ പ്രവർത്തനത്തിന് മറ്റൊന്നും ചെയ്യാനാകാത്തപ്പോൾ അത് ഏറെ മൂല്യമുള്ളതാണ്.

അനുബന്ധ ലേഖനങ്ങൾ