د VPN له نښلونې وروسته عمل د کاروونکي په توګه چل کړئ، نه د ډیمون په توګه
د USER=alice ویلو چاپېریال بدلونکي نه بدلوي چې hook په کوم حساب چلېږي۔ پیښه، محرک او عمل جلا کړئ، بیا UID ثابت کړئ۔
د VPN ډیمون د نښلونې hookونه د ډیمون په توګه چلېږي، او معمولاً دا مانا لري چې دوی د root په توګه چلېږي۔ هغه شېبه چې یو له دې hookونو څخه د چا کورني فولډر ته لیکي یا د ډیسکټاپ مرستندوی بیا پیلوي، تاسو یوې شبکې پیښې ته د هغې وړتیا ورکړې چې د هر محلي کاروونکي په توګه عمل وکړي۔ معمول لنډه لاره، یعنې د چاپېریال بدلونکي څخه کاروونکي نوم لوستل او لیږدول، دا نه سمېږي۔ دا یوازې عمل بیا نوموي پرته له دې چې بدل کړي کوم حساب یې ترسره کوي۔ هغه څه چې کار کوي درې برخې لېږد دی، چې پکې امتیازلرونکی ګام وایي چې څه وشول او یوه جلا واحد د سم هویت لاندې عمل ترسره کوي۔
په چاپېریال کې کاروونکی نوم د هویت سویچ نه دی
یونیکس پرېکړه کوي چې یو پروسې څه ته لاس ووهي، د خپل اغېزمن کاروونکي ID له مخې، نه د خپل چاپېریال د تارونو له مخې۔ د USER=alice ټاکل یا د LOGNAME صادرول بدلوي چې بې احتیاطه سافټویر په خپل تولید کې څه چاپوي؛ د فایلونو د مالکیت په ګوتو کې هیڅ نه بدلوي۔ هغه hook چې د دې بدلونکي سره root په توګه چلېږي، لا هم د Alice فایلونه root په توګه پرانیزي۔
نومونه هم یو شان نوم نه دی۔ د لرې لاسرسي ننوتل، محلي یونیکس حساب او د سند عام نوم درې پیژندونکي دي چې ډېری وختونه سره برابرېږي او کله ناکله نه۔ هغه کاروونکی چې د 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 کړئ، یا پرېږدئ چې د ناستې له مخې کیلي شوی یو ریکارډ بدل کړي۔
په پای کې، د زیان رادیوس په خپل واحد کې محدود کړئ: د حالت فولډر څخه بهر یوازې لوستلو وړ فایل سیستم لید، نوي امتیازات نه، او یو څرګند وخت حد۔ د ډیمون او کاروونکي عمل ترمنځ جلا کول پخپله ارزښت لري، خو کله چې عمل له هغه یو شي پرته چې تاسو تصویب کړی نور هیڅ نشي کولی، نو ډېر ډېر ارزښت لري۔