Ṣiṣẹ́ ìgbésẹ̀ lẹ́yìn ìsopọ̀ VPN gẹ́gẹ́ bí olùlò, kì í ṣe gẹ́gẹ́ bí daemon
Ìyípadà àyíká tí ó sọ pé USER=alice kò yí i padà iroyin tí hook ń ṣiṣẹ́ lábẹ́. Ya ìṣẹ̀lẹ̀, olùfáàsí àti ìgbésẹ̀ ya, lẹ́yìn náà fi UID hàn.
Àwọn hook ìsopọ̀ lórí daemon VPN ń ṣiṣẹ́ gẹ́gẹ́ bí daemon, ìyẹn sì sábà túmọ̀ sí pé wọ́n ń ṣiṣẹ́ gẹ́gẹ́ bí root. Ní àkókò tí ọ̀kan nínú àwọn hook yẹn bá kọ sínú àpò ilé ẹnìkan tàbí tí ó tún bẹ̀rẹ̀ olùrànlọ́wọ́ desktop, o ti fún ìṣẹ̀lẹ̀ nẹ́tíwọ́kì ní agbára láti ṣiṣẹ́ gẹ́gẹ́ bí olùlò àdúgbò èyíkéyìí. Ọ̀nà kúkúrú tí ó wọ́pọ̀, kíka orúkọ olùlò láti inú ìyípadà àyíká kí ó sì gbé e lọ, kò tún èyí ṣe. Ó kàn ń sọ ìgbésẹ̀ lórúkọ mìíràn láìyí iroyin tí ó ń ṣe é padà. Ohun tí ó ń ṣiṣẹ́ ni ìfilọ́lẹ̀ ẹ̀ka mẹ́ta, nínú èyí tí ìgbésẹ̀ aláṣẹ sọ ohun tí ó ṣẹlẹ̀, tí ẹ̀ka ọ̀tọ̀ kan sì ń ṣe ìgbésẹ̀ náà lábẹ́ ìdánimọ̀ tí ó tọ́.
Orúkọ olùlò nínú àyíká kì í ṣe íyípadà ìdánimọ̀
Unix ń pinnu ohun tí ìlànà kan lè fọwọ́ kàn nípasẹ̀ ID olùlò tí ó ń ṣiṣẹ́, kì í ṣe nípasẹ̀ àwọn okùn tí ó wà nínú àyíká rẹ̀. Síṣe USER=alice tàbí gbígbé LOGNAME jáde ń yí ohun tí ẹ̀rọ kò bìkítà ń tẹ̀ jáde nínú ìjáde rẹ̀ padà; kò yí ohun kankan padà nínú àwọn àyẹ̀wò ẹ̀tọ́ fọ́ọ̀lù. Hook tí ó ń ṣiṣẹ́ gẹ́gẹ́ bí root pẹ̀lú ìyípadà yẹn ṣì ń ṣí àwọn fọ́ọ̀lù Alice gẹ́gẹ́ bí root.
Àwọn orúkọ pẹ̀lú kì í ṣe orúkọ kan náà. Ìwọlé ìwọle àwọn ìkànnì ònà jíjìn, àkọsílẹ̀ Unix àdúgbò àti orúkọ gbogbogbòo ti ẹ̀rí jẹ́ ìdánimọ̀ mẹ́ta tí wọ́n sábà máa ń bá ara wọn mu, tí wọ́n sì nígbà mìíràn kò bá mu. Olùlò tí ó ń jẹ́rìí gẹ́gẹ́ bí a.smith lè má ní àkọsílẹ̀ àdúgbò rárá, tàbí a lè yí i padà sí asmith nípasẹ̀ iṣẹ́ ìtọ́nisọ́nà. Ètò èyíkéyìí tí ó gbà pé okùn kan ń ṣe àwọn ipa mẹ́ta yóò já ní ọ̀dọ̀ alágbàṣe àkọ́kọ́.
Nítorí náà ìbéèrè àkọ́kọ́ kì í ṣe «olùlò wo ni ó so mọ́» bí kò ṣe «àkọsílẹ̀ àdúgbò wo ni a fún ní àṣẹ láti ṣe ìgbésẹ̀ yìí». Dáhùn èyí láti inú ibi ìpamọ́ àkọsílẹ̀ rẹ fúnra rẹ, kì í ṣe láti inú ohun tí ẹ̀rọ oníbàárà fi ránṣẹ́:
id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json
Àṣẹ kẹta ni èyí tí àwọn ènìyàn ń gbé kọjá. Bí fọ́ọ̀lù àfojúsùn bá jẹ́ ti root nítorí pé hook tẹ́lẹ̀ ni ó dá a, ìgbésẹ̀ olùlò tí a ṣètò dáadáa yóò kùnà pẹ̀lú àṣìṣe àṣẹ tí ó dàbí ìṣòro systemd tí kì í sì í ṣe bẹ́ẹ̀.
Daemon ń dúró síbẹ̀ níbi tí ó wà
Yíyí User= ti iṣẹ́ VPN fúnra rẹ̀ padà sí Alice ni ọ̀nà tí kò tọ́. Ó ń yí bí daemon ṣe ń so àwọn ìkànnì, ṣe ń ka kọ́kọ́rọ́, ṣe ń kọ fọ́ọ̀lù ipò rẹ̀ àti bí ó ṣe ń ṣàkóso àwọn ọ̀nà padà, ó sì ń gbé gbogbo ewu yẹn lọ sínú ẹ̀ka tí ó ti ń ṣiṣẹ́. Daemon nílò àwọn àṣẹ rẹ̀; ìgbésẹ̀ tí ó tẹ̀le kò nílò wọn.
Wo ohun tí ẹ̀ka náà ń ṣe gan-an kí o tó fọwọ́ kàn án. Àṣẹ méjì sọ ìdánimọ̀ ìṣiṣẹ́ àti àwọn ìlà àṣẹ pípé tí ó wà lágbára fún ọ, pẹ̀lú ohun gbogbo tí àfikún kan fi kún:
systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server
Nínú ìfiṣe àpò ìkànnì àkọ́kọ́, daemon jẹ́ root, àti pé àkọsílẹ̀ --up ń jogún ìyẹn. Fi ìdánilójú mú un dípò kí o gbà á pé bẹ́ẹ̀ ni, nítorí pé ìpín tí a ti mú lera lè ti gbé e lọ sí àkọsílẹ̀ àkànṣe, àti pé drop-in tí a fi ọwọ́ kọ lè máa gbé hook lọ nípasẹ̀ àwẹ̀gbé pẹ̀lú àwọn òfin mìíràn.
Ẹ̀ka mẹ́ta onírúkọ, olùfáàsí kan tí ó há
Ìṣètò tí ó ń dúró nípasẹ̀ ìtọ́jú ní ìṣẹ̀lẹ̀, olùfáàsí àti ìgbésẹ̀. Daemon ń ròyìn pé ìpàdé onírúkọ ti gòkè. Olùfáàsí gba òtítọ́ kékeré yẹn ó sì béèrè ìgbésẹ̀ kan tí ó dúró. Ìgbésẹ̀ ń ṣiṣẹ́ lábẹ́ àkọsílẹ̀ àdúgbò tí ó ni àwọn fọ́ọ̀lù tí ó ń fọwọ́ kàn. Kò sí ohun kankan nínú ẹ̀wọ̀n tí ó gba ọ̀nà àṣẹ àìnídìí.
Ìgbésẹ̀ fúnra rẹ̀ jẹ́ ẹ̀ka iṣẹ́ lasan, ìdánimọ̀ sì ni ìtọ́ni kan nínú rẹ̀:
[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i
A kíyèsí pé User=alice kan gbogbo ẹ̀ka, systemd sì ṣàkọsílẹ̀ ìyàtọ̀ kan tí ó yẹ kí a mọ̀: àṣẹ tí ó ní àkọ́sórí + ń ṣiṣẹ́ pẹ̀lú gbogbo àṣẹ láìka ìyẹn. Àkọ́sórí yẹn jẹ́ irinṣẹ́ tí ó tọ́ fún ìgbésẹ̀ aláṣẹ kan ṣoṣo àti ọ̀nà tí ó rọrùn láti fagilé ìyàsọ́tọ̀ tí o ṣẹ̀ṣẹ̀ kọ́, nítorí náà ka + èyíkéyìí nínú ẹ̀ka yẹn gẹ́gẹ́ bí ohun tí a ní láti dá ìdí rẹ̀ lẹ́yìn nínú àyẹ̀wò.
Jẹ́ kí ìwọlé olùfáàsí jẹ́ kékeré àti kì í ṣe àṣírí. Ìdánimọ̀ ìpàdé, àkọsílẹ̀ tí a yí padà àti àmì àkókò ni gbogbo ohun tí a nílò. Má ṣe gbé ẹ̀ka shell, ọ̀nà fọ́ọ̀lù ṣíṣe tàbí àkójọ àyíká tí ẹ̀rọ oníbàárà pèsè kọjá ààlà rárá, nítorí pé ẹgbẹ́ tí ó ń gbà kò ní ọ̀nà láti yà ọ̀wọ̀n tí ó tọ́ sọ́tọ̀ sí èyí tí a fi wọlé.
Fi ìdánimọ̀ tí ó ṣiṣẹ́ gan-an múlẹ̀
Àyẹ̀wò ìṣètò kì í ṣe ẹ̀rí. Lẹ́yìn ìsopọ̀ ìdánwò tí a fọwọ́ sí, fi UID tí ó fọwọ́ kan fọ́ọ̀lù náà àti UID tí daemon ṣì ń lò múlẹ̀:
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
Ìlà àkọ́kọ́ yẹ kí ó fi Alice àti àmì àkókò nínú fèrèsé ìdánwò rẹ hàn. Èkejì yẹ kí ó ṣì fi root tàbí àkọsílẹ̀ iṣẹ́ àpò náà hàn, èyí tí ó fi hàn pé daemon kò gbé. Ẹ̀kẹta ni ọ̀nà tí ó rọrùn jùlọ láti dán àwọn àṣẹ ìgbésẹ̀ wò láì dúró de ìsopọ̀ tuntun gidi.
Bí ẹni tí ó ni fọ́ọ̀lù náà bá jẹ́ Alice ṣùgbọ́n bí ẹgbẹ́ tàbí ipò rẹ̀ yí padà láàrin àwọn ìṣiṣẹ́, wá UMask= tàbí ìyàtọ̀ àṣẹ àpò dípò àṣìṣe ìrònú. Bí àmì àkókò kò bá gbé rárá, olùfáàsí kò tíì ṣiṣẹ́ rí, ìgbésẹ̀ tẹ̀le tí ó wúlò ni journalctl -u fún ẹ̀ka ìgbésẹ̀, kì í ṣe ìsopọ̀ tuntun mìíràn ti ẹ̀rọ oníbàárà.
Ohun tí ìṣẹ̀lẹ̀ ìsopọ̀ kò tíì fi hàn
Ọ̀nà abẹ́lẹ̀ tí a ti dá jẹ́ òtítọ́ kan ṣoṣo. Kò túmọ̀ sí pé ìpàdé desktop ti ṣí, pé a lè dé ọ̀dọ̀ bus ìpàdé, tàbí pé àwọn ohun àkànṣe tí ìgbésẹ̀ fẹ́ ti wà. Ẹ̀ka oneshot lábẹ́ UID Alice ní ìdánimọ̀ rẹ̀ kò sì ní ohun kankan nínú ìpàdé rẹ̀, nítorí náà ohun gbogbo tí ó nílò bus àwòrán gbọ́dọ̀ gba inú ẹ̀rọ ìpàdé olùlò tí a tìlẹ́yìn kọjá, kí ó sì ṣàlàyé ohun tí ó máa ṣẹlẹ̀ nígbà tí ó bá jáde.
Àwọn ìsopọ̀ tuntun pẹ̀lú ń tún ṣe. Kọ̀mpútà gbé-ẹrù tí ó sùn nínú ọkọ̀ ojú irin lè dá àwọn ìṣẹ̀lẹ̀ ìsopọ̀ méjìlá jáde ní wákàtí kan, hook tí ó ń fi ìlà kún ní gbogbo ìgbà sì ń sọ fọ́ọ̀lù ipò di àkọsílẹ̀ tí kò sí ẹni tí ó lè kà. Ṣe ìgbésẹ̀ náà ní idempotent, tàbí jẹ́ kí ó rọ́pò àkọsílẹ̀ kan tí a fi ìpàdé ṣe kọ́kọ́rọ́.
Níkẹyìn, dín ìwọ̀n ìbàjẹ́ kù nínú ẹ̀ka fúnra rẹ̀: ìwòye ẹ̀rọ fọ́ọ̀lù kíka-nìkan ní ìta àpò ipò, kò sí àṣẹ tuntun, àti àkókò ìdúró tí ó yé. Ìyàsọ́tọ̀ láàrin daemon àti ìgbésẹ̀ olùlò tọ́ ní fúnra rẹ̀, ṣùgbọ́n ó tọ́ púpọ̀ sí i nígbà tí ìgbésẹ̀ kò lè ṣe ohun mìíràn yàtọ̀ sí ohun kan ṣoṣo tí o fọwọ́ sí.