Endesha kitendo baada ya muunganisho wa VPN kama mtumiaji, si kama daemon
Kigezo cha mazingira kinachosema USER=alice hakibadilishi akaunti ambayo hook huendeshwa. Tenganisha tukio, kichocheo na kitendo, kisha thibitisha UID.
Hook za muunganisho kwenye daemon ya VPN huendeshwa kama daemon, na kwa kawaida hiyo inamaanisha zinaendeshwa kama root. Wakati mmoja wa hook hizo unaandika kwenye saraka ya nyumbani ya mtu au kuanzisha upya msaidizi wa desktop, umeshatoa tukio la mtandao uwezo wa kutenda kama mtumiaji yeyote wa ndani. Njia ya mkato ya kawaida, kusoma jina la mtumiaji kutoka kigezo cha mazingira na kulipitisha, hairekebishi hilo. Inaweka lebo upya kitendo tu bila kubadilisha akaunti inayokitekeleza. Kinachofanya kazi ni mchakato wa sehemu tatu, ambapo hatua yenye fursa inasema nini kilitokea na kitengo tofauti hufanya kitendo chini ya utambulisho sahihi.
Jina la mtumiaji katika mazingira si swichi ya utambulisho
Unix huamua kile mchakato unaweza kugusa kwa kitambulisho chake cha mtumiaji kinachofaa, si kwa misururu iliyo katika mazingira yake. Kuweka USER=alice au kuhamisha LOGNAME hubadilisha kile programu isiyojali inachapisha kwenye matokeo yake; hakibadilishi chochote katika ukaguzi wa umiliki wa faili. Hook inayoendeshwa kama root ikiwa na kigezo hicho inafungua bado faili za Alice kama root.
Majina pia si jina moja. Kuingia kwa ufikiaji wa mbali, akaunti ya Unix ya ndani na jina la kawaida la cheti ni vitambulisho vitatu ambavyo mara nyingi hukutana na wakati mwingine havikutani. Mtumiaji anayethibitisha kama a.smith anaweza asiwe na akaunti ya ndani kabisa, au anaweza kupewa ramani ya asmith kupitia huduma ya saraka. Muundo wowote unaodhani mfuatano mmoja unatumikia majukumu yote matatu utavunjika kwa mkandarasi wa kwanza.
Kwa hivyo swali la kwanza si «mtumiaji gani ameunganishwa» bali «akaunti gani ya ndani inaruhusiwa kufanya kitendo hiki». Jibu hilo kutoka hifadhidata yako ya akaunti, si kutoka kile mteja alichotuma:
id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json
Amri ya tatu ni ile ambayo watu huiruka. Ikiwa faili lengwa inamilikiwa na root kwa sababu hook iliyotangulia iliiunda, kitendo cha mtumiaji kilichosanidiwa ipasavyo kitashindwa na hitilafu ya ruhusa inayoonekana kama tatizo la systemd na si hivyo.
Daemon inabaki mahali ilipo
Kubadilisha User= ya huduma ya VPN yenyewe kuwa Alice ni kiwiko kisicho sahihi. Hubadilisha jinsi daemon inavyofunga violesura, kusoma funguo, kuandika faili yake ya hali na kusimamia njia, na huhamisha hatari hiyo yote kwenye kitengo kilichokuwa kinafanya kazi. Daemon inahitaji fursa zake; kitendo kinachofuata hakihitaji.
Tazama kile kitengo kinafanya kwa kweli kabla ya kukigusa. Amri mbili zinakuambia utambulisho wa utekelezaji na mistari kamili ya amri inayotumika, pamoja na kila kitu kilichoongezwa na ubatilishaji:
systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server
Katika usakinishaji wa kawaida wa kifurushi daemon ni root, na skripti ya --up inarithi hilo. Thibitisha hilo badala ya kudhani, kwa sababu usambazaji ulioimarishwa unaweza kuwa umeihamisha kwenda akaunti maalum, na drop-in iliyoandikwa kwa mkono inaweza kuendesha hook kupitia kifuniko chenye sheria tofauti.
Sehemu tatu zenye majina, kichocheo kimoja chembamba
Mpangilio unaostahimili matengenezo una tukio, kichocheo na kitendo. Daemon inaripoti kwamba kikao kilichotajwa kimeinuka. Kichocheo hukubali ukweli huo mdogo na kuomba kitendo kimoja kisichobadilika. Kitendo huendeshwa chini ya akaunti ya ndani inayomiliki faili inazogusa. Hakuna chochote kwenye mnyororo kinachokubali njia ya amri isiyo na kikomo.
Kitendo chenyewe ni kitengo cha huduma cha kawaida, na utambulisho ni agizo moja ndani yake:
[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i
Kumbuka kwamba User=alice inahusu kitengo chote, na systemd inaandika ubaguzi mmoja unaostahili kujulikana: amri yenye kiambishi + huendeshwa kwa fursa kamili bila kujali hilo. Kiambishi hicho ni chombo halali kwa hatua moja yenye fursa na njia rahisi ya kubatilisha utenganishaji uliouunda hivi punde, kwa hivyo chukua + yoyote katika kitengo hicho kama kitu kinachohitaji kuhesabiwa katika ukaguzi.
Weka pembejeo ya kichocheo kuwa ndogo na isiyo ya siri. Kitambulisho cha kikao, akaunti iliyopewa ramani na muhuri wa muda kwa kawaida ndiyo yote yanayohitajika. Kamwe usipitishe kuvuka mpaka kipande cha shell, njia ya faili inayotekelezeka au kizuizi cha mazingira kilichotolewa na mteja, kwa sababu upande unaopokea hauna njia ya kutofautisha thamani halali na iliyodungwa.
Thibitisha utambulisho ulioendeshwa kwa kweli
Ukaguzi wa usanidi si ushahidi. Baada ya muunganisho wa jaribio ulioidhinishwa, thibitisha UID iliyogusa faili na UID ambayo daemon bado inaitumia:
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
Mstari wa kwanza unapaswa kuonyesha Alice na muhuri wa muda ndani ya dirisha lako la jaribio. Wa pili unapaswa bado kuonyesha root au akaunti ya huduma ya kifurushi, jambo linalothibitisha kwamba daemon haikusogea. Wa tatu ni njia ya bei nafuu zaidi ya kujaribu ruhusa za kitendo bila kusubiri muunganisho upya halisi.
Ikiwa mmiliki wa faili ni Alice lakini kikundi au hali yake ilibadilika kati ya uendeshaji, tafuta UMask= au tofauti ya ruhusa ya saraka badala ya hitilafu ya mantiki. Ikiwa muhuri wa muda haukusogea kabisa, kichocheo hakikuwahi kuwaka, na hatua inayofuata yenye manufaa ni journalctl -u kwa kitengo cha kitendo badala ya muunganisho mwingine upya wa mteja.
Kile ambacho tukio la muunganisho bado halithibitishi
Tunnel iliyoanzishwa ni ukweli mmoja. Haimaanishi kwamba kikao cha desktop kimefunguliwa, basi ya kikao inafikiwa, au kwamba rasilimali ya kibinafsi ambayo kitendo kinataka tayari inapatikana. Kitengo cha oneshot chini ya UID ya Alice kina utambulisho wake na hakina chochote cha kikao chake, kwa hivyo kila kitu kinachohitaji basi ya picha lazima kipite katika utaratibu wa kikao cha mtumiaji unaotumika na kufafanua kinachotokea wakati ameingia nje.
Muunganisho upya pia hurudia. Kompyuta ndogo inayolala kwenye treni inaweza kutoa tukio kadhaa za muunganisho kwa saa moja, na hook inayoongeza mstari kila wakati hugeuza faili ya hali kuwa kumbukumbu ambayo hakuna mtu anayeweza kuisoma. Fanya kitendo kiwe idempotent, au iachie kuchukua nafasi ya rekodi moja iliyo na ufunguo wa kikao.
Hatimaye, punguza eneo la uharibifu ndani ya kitengo chenyewe: mwonekano wa mfumo wa faili wa kusoma tu nje ya saraka ya hali, hakuna fursa mpya, na kikomo cha muda kilicho wazi. Utenganishaji kati ya daemon na kitendo cha mtumiaji una thamani yenyewe, lakini una thamani kubwa zaidi wakati kitendo hakiwezi kufanya chochote isipokuwa kile kimoja ulichokidhinisha.