Clientul VPN are nevoie de ajutor privilegiat pentru a reconfigura rețeaua, iar acest fapt este aplicat prea larg la tot ce îl înconjoară. Un script care montează o partajare de fișiere nu are nevoie de root, deoarece partajarea aparține sesiunii utilizatorului conectat și acreditărilor acelui utilizator. Scoaterea montării din calea privilegiată elimină nevoia de reguli sudo, hook-uri root și modificări ale aplicațiilor livrate. Ce rămâne este o mică applet care rămâne deschisă, urmărește un profil și face o singură încercare.

De ce acest lucru aparține sesiunii utilizatorului

Un volum montat este o proprietate a sesiunii care l-a montat. Sesiunea altui utilizator nu îl vede, iar o montare deținută de root se comportă diferit față de cea creată de Finder. Păstrarea montării în sesiunea utilizatorului păstrează această semantică.

Ajutoarele privilegiate există pentru părțile care chiar au nevoie de ele: crearea unei interfețe de tunel, modificarea rutelor, actualizarea resolverului. Montarea unei partajări SMB nu este una dintre acele părți. Tratarea ei ca și cum ar fi impune o alegere între sudo fără parolă și un script root care rulează când nu este nimeni prezent. Ambele sunt riscuri mai mari decât justifică problema, iar abordarea prin sesiunea utilizatorului evită complet alegerea.

Hook-urile de conexiune proprii ale Tunnelblick nu sunt un substitut aici, deoarece rulează în afara sesiunii desktop și ordinea lor față de scripturile clientului nu este definită. Interogarea stării dintr-o applet de utilizator este un mecanism mai mic, cu mai puține presupuneri.

Dovedește mai întâi manual că partajarea funcționează

Automatizarea nu poate furniza o rută, o permisiune sau un cont care nu există. Conectează VPN-ul manual și deschide partajarea în Finder înainte de a scrie orice script. Dacă aceasta eșuează, scriptul va eșua într-un mod mai confuz.

Notează cele trei valori pe care le va folosi scriptul: numele profilului exact așa cum îl listează Tunnelblick, URL-ul partajării și numele volumului pe care Finder îl arată după montare. Numele volumului contează pentru că verificarea unei montări existente îl folosește, iar o verificare doar după nume este o protecție de comoditate, nu o dovadă a identității serverului. Folosește un nume unic pe mașină. Apoi confirmă că serverul răspunde măcar.

smbutil view //files.corp.example
osascript -e 'tell application "Tunnelblick" to get state of first configuration whose name is "Office"'
mount | grep -i smbfs

Prima comandă dovedește că serverul răspunde, a doua că numele profilului se rezolvă, iar a treia arată cum arată o montare reușită. Înregistrează toate trei înainte de a automatiza ceva.

Citește starea profilului din Tunnelblick

Tunnelblick își expune configurațiile și stările lor prin AppleScript, iar acesta este singurul hook de care are nevoie acest design. Starea care contează este șirul raportat pentru acel profil anume, nu prezența aplicației.

Interogarea are consecințe care merită spuse. O reconectare mai scurtă decât intervalul poate trece neobservată, iar applet-ul nu vede deloc tranziția. Acest lucru este acceptabil pentru o protecție de montare și inacceptabil pentru orice trebuie să reacționeze la fiecare eveniment. Dacă ai nevoie de fidelitate față de evenimente, acesta este mecanismul greșit, nu un mecanism care ar avea nevoie de un temporizator mai scurt. Alege intervalul ținând cont de acest compromis.

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

Exportă-l ca aplicație cu opțiunea de a rămâne deschisă, apoi lansează-l în sesiunea conectată în loc să îl rulezi prin sudo.

Montează o dată, apoi oprește încercările

Indicatorul de tentativă este ceea ce împiedică transformarea acestui lucru într-o buclă care ghicește acreditări. După ce applet-ul a încercat, așteaptă ca starea conexiunii să se schimbe înainte de a încerca din nou.

Acest comportament este intenționat. O partajare care refuză montarea o refuză de obicei dintr-un motiv pe care o nouă încercare nu îl poate remedia, iar încercările repetate transformă o solicitare într-un șir de solicitări. Indicatorul este resetat când profilul părăsește starea conectat, astfel încât o reconectare reală produce exact o nouă încercare. Ieșirea și repornirea applet-ului îl resetează și ele, iar aceasta este soluția manuală. Niciuna dintre căi nu ascunde un eșec; ambele îl lasă vizibil în Finder.

Scriptul nu conține nicio parolă și ar trebui să rămână așa. Lasă operația de montare să întrebe și lasă portcheia să facă ceea ce susține organizația. Încorporarea unei acreditări într-un URL transformă un script de comoditate într-un secret care trebuie rotit.

Ce nu poate face ajutorul

Trei limite merită scrise lângă applet. Nu poate expulza un volum ocupat după o defecțiune de rețea, nu poate garanta că DNS-ul și serverul sunt pregătite când starea spune conectat și nu reacționează la fiecare reconectare.

Prima limită contează cel mai mult în practică. O partajare al cărei server dispare lasă un volum care pare montat și blochează la accesare, iar corectarea politicoasă este să închei operațiile de fișiere și să expulzezi înainte de o deconectare planificată. A doua explică majoritatea primelor încercări eșuate: tunelul este ridicat în timp ce resolverul nu a ajuns încă, așa că așteaptă și apoi montează o dată manual pentru a confirma. A treia este compromisul de interogare de mai devreme, nu un bug de corectat.

Pentru o mașină nesupravegheată sau o flotă administrată, acest design are forma greșită. Folosește o politică de montare deținută de administrator în loc să extinzi o applet de desktop într-un serviciu privilegiat.

Articole similare