De VPN-client heeft geprivilegieerde hulp nodig om netwerkinstellingen te wijzigen, en dat feit wordt te ruim toegepast op alles eromheen. Een script dat een gedeelde map koppelt heeft geen root nodig, omdat de share bij de sessie van de aangemelde gebruiker hoort en bij de inloggegevens van die gebruiker. Het koppelen buiten het geprivilegieerde pad halen maakt sudo-regels, root-hooks en aanpassingen aan meegeleverde applicaties overbodig. Wat overblijft is een kleine applet die blijft draaien, één profiel volgt en één poging doet.

Waarom dit in de gebruikerssessie thuishoort

Een gekoppeld volume is een eigenschap van de sessie die het heeft gekoppeld. De sessie van een andere gebruiker ziet het niet, en een koppeling die eigendom is van root gedraagt zich anders dan die Finder heeft gemaakt. De koppeling in de gebruikerssessie houden behoudt die semantiek.

Geprivilegieerde hulpprogramma’s bestaan voor de onderdelen die ze echt nodig hebben: een tunnelinterface aanmaken, routes wijzigen, de resolver bijwerken. Een SMB-share koppelen is zo’n onderdeel niet. Het behandelen alsof dat wel zo is dwingt tot een keuze tussen sudo zonder wachtwoord en een root-script dat draait terwijl er niemand aanwezig is. Beide zijn grotere risico’s dan het probleem rechtvaardigt, en de aanpak via de gebruikerssessie vermijdt de keuze volledig.

De eigen verbindingshooks van Tunnelblick zijn hier geen vervanging, want ze draaien buiten de desktop-sessie en hun volgorde ten opzichte van de scripts van de client is niet gedefinieerd. De status pollen vanuit een gebruikersapplet is een kleiner mechanisme met minder aannames.

Bewijs eerst met de hand dat de share werkt

Automatisering kan geen route, geen toestemming en geen account leveren die niet bestaan. Verbind de VPN handmatig en open de share in Finder voordat je een script schrijft. Als dat mislukt, mislukt het script op een verwarrender manier.

Noteer de drie waarden die het script zal gebruiken: de profielnaam precies zoals Tunnelblick hem toont, de share-URL en de volumenaam die Finder na het koppelen toont. De volumenaam is belangrijk omdat de controle op een bestaande koppeling hem gebruikt, en een controle op alleen de naam is een gemakscontrole, geen bewijs van de identiteit van de server. Gebruik een naam die uniek is op de machine. Bevestig daarna dat de server überhaupt antwoordt.

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

De eerste opdracht bewijst dat de server antwoordt, de tweede dat de profielnaam wordt gevonden, en de derde laat zien hoe een geslaagde koppeling eruitziet. Leg alle drie vast voordat je iets automatiseert.

Lees de profielstatus uit Tunnelblick

Tunnelblick stelt zijn configuraties en hun status beschikbaar via AppleScript, en dat is de enige hook die dit ontwerp nodig heeft. De status die ertoe doet is de tekenreeks die voor dat ene profiel wordt gemeld, niet de aanwezigheid van de applicatie.

Pollen heeft gevolgen die het vermelden waard zijn. Een herverbinding die korter duurt dan het interval kan onopgemerkt voorbijgaan, en de applet ziet de overgang dan helemaal niet. Dat is aanvaardbaar voor een koppelbewaking en onaanvaardbaar voor alles wat op elke gebeurtenis moet reageren. Als je gebeurtenissen trouw wilt volgen, is dit het verkeerde mechanisme in plaats van een mechanisme dat een kortere timer nodig heeft. Kies het interval met die afweging in het achterhoofd.

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

Exporteer het als een applicatie met de optie om te blijven draaien en start het daarna in de aangemelde sessie in plaats van via sudo.

Koppel één keer en stop dan met proberen

De vlag voor geprobeerd is wat voorkomt dat dit een lus wordt die inloggegevens raadt. Zodra de applet heeft geprobeerd, wacht hij tot de verbindingsstatus verandert voordat hij het opnieuw probeert.

Dat gedrag is bewust. Een share die de koppeling weigert, weigert dat meestal om een reden die een nieuwe poging niet kan oplossen, en herhaalde pogingen maken van één vraag een stroom vragen. De vlag wordt gereset wanneer het profiel de verbonden status verlaat, dus een echte herverbinding levert precies één nieuwe poging op. De applet afsluiten en opnieuw starten reset hem ook, en dat is de handmatige ingreep. Geen van beide paden verbergt een fout; beide laten hem zichtbaar in Finder.

Het script bevat geen wachtwoord, en dat moet zo blijven. Laat de koppelbewerking om invoer vragen en laat de sleutelhanger doen wat de organisatie ondersteunt. Een inloggegeven in een URL opnemen maakt van een gemaksscript een geheim dat moet worden geroteerd.

Wat het hulpprogramma niet kan

Drie beperkingen zijn het vermelden waard naast de applet. Hij kan een bezig volume niet uitwerpen na een netwerkstoring, hij kan niet garanderen dat DNS en de server klaar zijn wanneer de status verbonden zegt, en hij reageert niet op elke herverbinding.

De eerste beperking weegt in de praktijk het zwaarst. Een share waarvan de server verdwijnt, laat een volume achter dat gekoppeld lijkt en bij toegang blokkeert, en de nette oplossing is bestandsbewerkingen afronden en uitwerpen voor een geplande verbreking. De tweede verklaart de meeste mislukte eerste pogingen: de tunnel staat terwijl de resolver nog niet is bijgewerkt, dus wacht en koppel dan één keer met de hand om het te bevestigen. De derde is de afweging rond pollen van eerder, geen bug om te repareren.

Voor een onbeheerde machine of een beheerde vloot is dit ontwerp de verkeerde vorm. Gebruik een koppelbeleid dat door de beheerder wordt beheerd in plaats van een desktop-applet uit te breiden tot een geprivilegieerde dienst.

Gerelateerde artikelen