Bendrinamojo aplanko prijungimas iš Tunnelblick neveikiant kaip root
AppleScript, kuris lieka atidarytas, gali stebėti vieną Tunnelblick profilį ir prijungti SMB bendrinį kaip prisijungęs naudotojas, be root kablio ir be sudo be slaptažodžio.
VPN klientui reikia privilegijuotos pagalbos perkonfigūruojant tinklą, ir šis faktas taikomas per plačiai viskam aplinkui. Scenarijui, kuris prijungia failų bendrinį, nereikia root, nes bendrinys priklauso prisijungusio naudotojo sesijai ir jo prisijungimo duomenims. Prijungimo perkėlimas iš privilegijuoto kelio pašalina poreikį sudo taisyklėms, root kabliams ir įtrauktų programų keitimui. Lieka mažas applet, kuris lieka atidarytas, stebi vieną profilį ir atlieka vieną bandymą.
Kodėl tai priklauso naudotojo sesijai
Prijungtas tomas yra sesijos, kuri jį prijungė, savybė. Kito naudotojo sesija jo nemato, o root priklausantis prijungimas elgiasi kitaip nei Finder sukurtas. Prijungimo palikimas naudotojo sesijoje išsaugo tą semantiką.
Privilegijuoti pagalbininkai egzistuoja toms dalims, kurioms jų tikrai reikia: tunelio sąsajos kūrimui, maršrutų keitimui, resolverio atnaujinimui. SMB bendrinio prijungimas nėra viena iš tų dalių. Elgimasis su juo taip, tarsi būtų, verčia rinktis tarp sudo be slaptažodžio ir root scenarijaus, kuris vykdomas, kai nieko nėra. Abu yra didesnė rizika, nei pateisina problema, o požiūris per naudotojo sesiją visiškai išvengia šio pasirinkimo.
Pačios Tunnelblick ryšio kablios čia nepakeičia, nes jos vykdomos už darbalaukio sesijos ribų, o jų tvarka kliento scenarijų atžvilgiu nėra apibrėžta. Būsenos klausimas iš naudotojo applet yra mažesnis mechanizmas su mažiau prielaidų.
Pirmiausia rankiniu būdu įrodykite, kad bendrinys veikia
Automatizavimas negali suteikti maršruto, leidimo ar paskyros, kurios nėra. Prijunkite VPN rankiniu būdu ir atidarykite bendrinį Finder, prieš rašydami bet kokį scenarijų. Jei tai nepavyks, scenarijus nepavyks labiau klaidinančiu būdu.
Užsirašykite tris reikšmes, kurias naudos scenarijus: profilio pavadinimą tiksliai taip, kaip jį išvardija Tunnelblick, bendrinio URL ir tomo pavadinimą, kurį Finder rodo po prijungimo. Tomo pavadinimas svarbus, nes esamo prijungimo patikra jį naudoja, o patikra tik pagal pavadinimą yra patogumo apsauga, o ne serverio tapatybės įrodymas. Naudokite mašinoje unikalų pavadinimą. Tada patvirtinkite, kad serveris apskritai atsako.
smbutil view //files.corp.example
osascript -e 'tell application "Tunnelblick" to get state of first configuration whose name is "Office"'
mount | grep -i smbfs
Pirmoji komanda įrodo, kad serveris atsako, antroji – kad profilio pavadinimas išsprendžiamas, o trečioji parodo, kaip atrodo sėkmingas prijungimas. Užfiksuokite visus tris, prieš ką nors automatizuodami.
Perskaitykite profilio būseną iš Tunnelblick
Tunnelblick atskleidžia savo konfigūracijas ir jų būsenas per AppleScript, ir tai vienintelis kabliukas, kurio reikia šiam projektui. Svarbi būsena yra eilutė, pranešama būtent tam profiliui, o ne programos buvimas.
Klausimas turi pasekmių, kurias verta paminėti. Persijungimas trumpesnis už intervalą gali praeiti nepastebėtas, o applet visai nemato perėjimo. Tai priimtina prijungimo apsaugai ir nepriimtina bet kam, kas turi reaguoti į kiekvieną įvykį. Jei reikia įvykių tikslumo, tai netinkamas mechanizmas, o ne mechanizmas, kuriam reikia trumpesnio laikmačio. Rinkitės intervalą atsižvelgdami į šį kompromisą.
property attempted : false
on idle
set profileName to "Office"
set shareURL to "smb://files.corp.example/OfficeTeam"
set volName to "OfficeTeam"
tell application "Tunnelblick" to set vpnState to state of first configuration whose name is profileName
if vpnState is not "CONNECTED" then
set attempted to false
return 20
end if
tell application "Finder" to set mounted to (exists disk volName)
if (not mounted) and (not attempted) then
set attempted to true
try
mount volume shareURL
end try
end if
return 20
end idle
Eksportuokite jį kaip programą su galimybe likti atidarytai, tada paleiskite prisijungusioje sesijoje, o ne per sudo.
Prijunkite vieną kartą, tada nustokite bandyti
Bandymo vėliava yra tai, kas neleidžia tam tapti prisijungimo duomenis spėjančiu ciklu. Kai applet jau bandė, jis laukia, kol pasikeis ryšio būsena, prieš bandydamas dar kartą.
Toks elgesys yra sąmoningas. Bendrinys, kuris atsisako prijungimo, dažniausiai atsisako dėl priežasties, kurios pakartotinis bandymas negali ištaisyti, o pakartotiniai bandymai vieną užklausą paverčia jų srautu. Vėliava atstatoma, kai profilis palieka prijungtą būseną, todėl tikras persijungimas duoda lygiai vieną naują bandymą. Išėjimas ir pakartotinis applet paleidimas taip pat ją atstato, ir tai yra rankinis nepaisymas. Nė vienas iš kelių neslepia gedimo; abu palieka jį matomą Finder.
Scenarijus neturi jokio slaptažodžio, ir taip turėtų likti. Leiskite prijungimo operacijai paklausti, o raktinei – daryti tai, ką palaiko organizacija. Prisijungimo duomenų įterpimas į URL paverčia patogumo scenarijų paslaptimi, kurią reikia rotuoti.
Ko pagalbininkas negali
Tris apribojimus verta užrašyti prie applet. Jis negali išstumti užimto tomo po tinklo gedimo, negali garantuoti, kad DNS ir serveris yra pasirengę, kai būsena sako prijungta, ir nereaguoja į kiekvieną persijungimą.
Pirmasis apribojimas praktiškai svarbiausias. Bendrinys, kurio serveris dingsta, palieka tomą, kuris atrodo prijungtas ir blokuoja prieigą, o mandagus pataisymas – baigti failų operacijas ir išstumti jį prieš planuojamą atjungimą. Antrasis paaiškina daugumą nepavykusių pirmųjų bandymų: tunelis pakeltas, kol resolveris dar nepasivijo, todėl palaukite ir tada vieną kartą prijunkite rankiniu būdu, kad patvirtintumėte. Trečiasis yra ankstesnis klausimo kompromisas, o ne klaida, kurią reikia taisyti.
Neprižiūrimai mašinai ar valdomam parkui šis dizainas turi netinkamą formą. Naudokite administratoriui priklausančią prijungimo politiką, o ne plėskite darbalaukio applet į privilegijuotą tarnybą.