VPN-klienten har brug for privilegeret hjælp til at omkonfigurere netværket, og den kendsgerning bliver overført for bredt på alt omkring den. Et script, der monterer et filshare, har ikke brug for root, fordi sharet tilhører den indloggede brugers session og den brugers legitimationsoplysninger. At flytte monteringen ud af den privilegerede vej fjerner behovet for sudo-regler, root-hooks og ændringer af medfølgende programmer. Tilbage er en lille applet, der forbliver åben, overvåger én profil og gør ét forsøg.

Hvorfor dette hører til i brugersessionen

Et monteret volumen er en egenskab ved den session, der monterede det. En anden brugers session ser det ikke, og en montering ejet af root opfører sig anderledes end den, Finder oprettede. At holde monteringen i brugersessionen bevarer den semantik.

Privilegerede hjælpere findes til de dele, der virkelig har brug for dem: at oprette en tunnelinterface, ændre ruter, opdatere resolveren. At montere et SMB-share er ikke en af de dele. At behandle det, som om det var, tvinger et valg mellem passwordless sudo og et root-script, der kører, mens ingen er til stede. Begge er større risici, end problemet retfærdiggør, og brugersessionstilgangen undgår valget helt.

Tunnelblicks egne forbindelseshooks er ikke en erstatning her, da de kører uden for skrivebordssessionen, og deres rækkefølge i forhold til klientens scripts er ikke defineret. At polle tilstanden fra en brugerapplet er en mindre mekanisme med færre antagelser.

Bevis først med hånden, at sharet virker

Automatisering kan ikke levere en rute, en tilladelse eller en konto, der ikke findes. Forbind VPN’en manuelt og åbn sharet i Finder, før du skriver noget script. Hvis det mislykkes, vil scriptet mislykkes på en mere forvirrende måde.

Notér de tre værdier, som scriptet skal bruge: profilnavnet præcis som Tunnelblick viser det, share-URL’en og volumenavnet, som Finder viser efter monteringen. Volumenavnet betyder noget, fordi kontrollen for en eksisterende montering bruger det, og en kontrol, der kun ser på navnet, er en bekvemmelighedsvagt snarere end bevis på serverens identitet. Brug et navn, der er unikt på maskinen. Bekræft derefter, at serveren overhovedet svarer.

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

Den første kommando beviser, at serveren svarer, den anden beviser, at profilnavnet slår op, og den tredje viser, hvordan en vellykket montering ser ud. Registrér alle tre, før du automatiserer noget.

Læs profiltilstanden fra Tunnelblick

Tunnelblick eksponerer sine konfigurationer og deres tilstande via AppleScript, og det er det eneste hook, dette design har brug for. Den tilstand, der betyder noget, er den streng, der rapporteres for netop den profil, ikke programmets tilstedeværelse.

Polling har konsekvenser, der er værd at nævne. En genopkobling, der er kortere end intervallet, kan gå ubemærket hen, og appletten ser slet ikke overgangen. Det er acceptabelt for en monteringsvagt og uacceptabelt for alt, der skal reagere på hver hændelse. Hvis du har brug for hændelsestrofasthed, er dette den forkerte mekanisme snarere end en mekanisme, der har brug for en kortere timer. Vælg intervallet med den afvejning i tankerne.

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

Eksportér det som et program med indstillingen om at forblive åben, og start det derefter i den indloggede session i stedet for via sudo.

Montér én gang, og stop så med at prøve

Flaget for forsøgt er det, der forhindrer, at dette bliver en løkke, der gætter på legitimationsoplysninger. Når appletten har forsøgt, venter den på, at forbindelsestilstanden ændrer sig, før den prøver igen.

Den adfærd er bevidst. Et share, der afviser monteringen, afviser den normalt af en grund, som et nyt forsøg ikke kan rette, og gentagne forsøg gør én prompt til en strøm af dem. Flaget nulstilles, når profilen forlader den forbundne tilstand, så en ægte genopkobling giver præcis ét nyt forsøg. Afslutning og genstart af appletten nulstiller det også, og det er den manuelle tilsidesættelse. Ingen af vejene skjuler en fejl; begge lader den være synlig i Finder.

Scriptet indeholder ingen adgangskode, og sådan bør det forblive. Lad monteringshandlingen spørge, og lad nøgleringen gøre det, organisationen understøtter. At indlejre en legitimationsoplysning i en URL gør et bekvemmelighedsscript til en hemmelighed, der skal roteres.

Hvad hjælperen ikke kan

Tre grænser er værd at skrive ved siden af appletten. Den kan ikke skubbe et optaget volumen ud efter en netværksfejl, den kan ikke garantere, at DNS og serveren er klar, når tilstanden siger forbundet, og den reagerer ikke på hver genopkobling.

Den første grænse betyder mest i praksis. Et share, hvis server forsvinder, efterlader et volumen, der ser monteret ud og blokerer ved adgang, og den pæne løsning er at afslutte filhandlinger og skubbe ud før en planlagt afbrydelse. Den anden forklarer de fleste mislykkede første forsøg: tunnelen er oppe, mens resolveren ikke er fulgt med, så vent og montér derefter én gang manuelt for at bekræfte. Den tredje er polling-afvejningen fra tidligere snarere end en fejl, der skal patches.

Til en ubemandet maskine eller en administreret flåde er dette design den forkerte form. Brug en monteringspolitik, der ejes af administratoren, i stedet for at udvide en skrivebordsapplet til en privilegeret tjeneste.

Relaterede artikler