VPN සම්බන්ධතාවයෙන් පසු ක්රියාව ඩීමන් ලෙස නොව පරිශීලක ලෙස ධාවනය කරන්න
USER=alice යන පරිසර විචල්යය hook එක කුමන ගිණුමක් යටතේ ධාවනය වේද යන්න නොවෙනස් කරයි. සිදුවීම, ට්රිගරය සහ ක්රියාව වෙන් කර, පසුව UID ඔප්පු කරන්න.
VPN ඩීමනයේ සම්බන්ධතා hook ඩීමන් ලෙස ධාවනය වේ, සාමාන්යයෙන් එයින් අදහස් වන්නේ ඒවා root ලෙස ධාවනය වන බවයි. එම hook එකක් යමෙකුගේ ගෘහ නාමාවලියට ලියන හෝ ඩෙස්ක්ටොප් සහායකයක් නැවත අරඹන මොහොතේ, ඔබ ජාල සිදුවීමකට ඕනෑම දේශීය පරිශීලකයෙකු ලෙස ක්රියා කිරීමේ හැකියාව ලබා දී ඇත. සුපුරුදු කෙටි මාර්ගය, එනම් පරිසර විචල්යයකින් පරිශීලක නාමය කියවා එය ඉදිරියට යැවීම, එය නිවැරදි නොකරයි. එය ක්රියාව නැවත ලේබල් කරයි, නමුත් එය කුමන ගිණුමක් ක්රියාත්මක කරයිද යන්න නොවෙනස් කරයි. ක්රියා කරන දෙය තුන් කොටසක් සහිත භාරදීමකි: වරප්රසාදිත පියවර කුමක් සිදුවීද කියයි, වෙනම ඒකකයක් නිවැරදි අනන්යතාවය යටතේ ක්රියාව සිදු කරයි.
පරිසරයේ ඇති පරිශීලක නාමය අනන්යතා ස්විචයක් නොවේ
Unix ක්රියාවලියකට ස්පර්ශ කළ හැක්කේ කුමක්ද යන්න තීරණය කරන්නේ එහි ඵලදායී පරිශීලක ID අනුව මිස එහි පරිසරයේ ඇති තන්තු අනුව නොවේ. USER=alice සැකසීම හෝ LOGNAME අපනයනය කිරීම අලස මෘදුකාංගයක් එහි ප්රතිදානයේ මුද්රණය කරන දේ වෙනස් කරයි; ගොනු හිමිකාරිත්ව පරීක්ෂණවල කිසිවක් වෙනස් නොකරයි. එම විචල්යය සකසා root ලෙස ධාවනය වන hook එක තවමත් root ලෙසම Alice ගේ ගොනු විවෘත කරයි.
නම් ද එකම නමක් නොවේ. දුරස්ථ ප්රවේශ පිවිසුම, දේශීය Unix ගිණුම සහ සහතිකයේ පොදු නාමය බොහෝ විට එකිනෙකට ගැලපෙන, සමහර විට නොගැලපෙන හඳුනාගැනීම් තුනකි. 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 දැනගැනීම වටිනා එක් ව්යතිරේකයක් වාර්තා කරයි: + උපසර්ගය සහිත විධානය එය නොසලකා සම්පූර්ණ වරප්රසාද සමඟ ධාවනය වේ. එම උපසර්ගය එකම වරප්රසාදිත පියවරක් සඳහා නීත්යානුකූල මෙවලමක් වන අතර ඔබ දැන් ගොඩනගා ඇති වෙන්වීම අවලංගු කිරීමට පහසු මාර්ගයකි, එබැවින් එම ඒකකයේ ඕනෑම + එකක් සමාලෝචනයේදී සාධාරණීකරණය කළ යුතු දෙයක් ලෙස සලකන්න.
ට්රිගරයේ ආදානය අවම හා රහස්ය නොවන ලෙස තබා ගන්න. සැසි හඳුනාගැනීම, සිතියම්ගත ගිණුම සහ කාල මුද්රාව සාමාන්යයෙන් අවශ්ය සියල්ලය. සීමාව හරහා කිසිදා shell කැබැල්ලක්, ක්රියාත්මක කළ හැකි ගොනු මාර්ගයක් හෝ සේවාදායකයා ලබා දුන් පරිසර කොටසක් යවන්න එපා, මන්ද ලබා ගන්නා පැත්තට නීත්යානුකූල අගයක් හා එන්නත් කළ අගයක් වෙන් කර හඳුනාගැනීමට ක්රමයක් නැත.
සැබවින්ම ධාවනය වූ අනන්යතාවය තහවුරු කරන්න
වින්යාස සමාලෝචනය සාක්ෂියක් නොවේ. අනුමත පරීක්ෂණ සම්බන්ධතාවයකින් පසු, ගොනුව ස්පර්ශ කළ 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 එකක් තත්ත්ව ගොනුවක් කිසිවෙකුට කියවිය නොහැකි ලොගයක් බවට පත් කරයි. ක්රියාව idempotent කරන්න, නැතහොත් සැසියෙන් යතුරු කළ එක් වාර්තාවක් ප්රතිස්ථාපනය කිරීමට ඉඩ දෙන්න.
අවසාන වශයෙන්, හානි අරය ඒකකය තුළම සීමා කරන්න: තත්ත්ව නාමාවලියෙන් පිටත කියවීමට පමණක් හැකි ගොනු පද්ධති දසුනක්, නව වරප්රසාද නැත, සහ පැහැදිලි කාල සීමාවක්. ඩීමන් සහ පරිශීලක ක්රියාව අතර වෙන්වීම තනිවම වටිනවා, නමුත් ඔබ අනුමත කළ එකම දේ හැර වෙන කිසිවක් ක්රියාවට කළ නොහැකි විට එය වඩාත් වටිනවා.