Klient VPN potřebuje privilegovanou pomoc s rekonfigurací sítě a tento fakt se aplikuje příliš široce na vše kolem. Skript, který připojuje souborové sdílení, root nepotřebuje, protože sdílení patří do relace přihlášeného uživatele a k jeho přihlašovacím údajům. Přesunutí připojování mimo privilegovanou cestu odstraňuje potřebu pravidel sudo, root háčků a úprav přiložených aplikací. Co zůstává, je malý applet, který zůstává otevřený, sleduje jeden profil a provede jeden pokus.

Proč to patří do uživatelské relace

Připojený svazek je vlastnost relace, která ho připojila. Relace jiného uživatele ho nevidí a připojení vlastněné rootem se chová jinak než to, které vytvořil Finder. Zachování připojení v uživatelské relaci tuto sémantiku zachovává.

Privilegovaní pomocníci existují pro části, které je skutečně potřebují: vytvoření tunelového rozhraní, změnu tras, aktualizaci resolveru. Připojení SMB sdílení mezi ně nepatří. Zacházet s ním, jako by patřilo, vynucuje volbu mezi sudo bez hesla a root skriptem, který běží, když nikdo není přítomen. Obojí je větší riziko, než problém ospravedlňuje, a přístup přes uživatelskou relaci se té volbě zcela vyhýbá.

Vlastní háčky připojení Tunnelblick zde nejsou náhradou, protože běží mimo relaci plochy a jejich pořadí vůči skriptům klienta není definováno. Dotazování stavu z uživatelského appletu je menší mechanismus s méně předpoklady.

Nejprve dokažte ručně, že sdílení funguje

Automatizace nemůže dodat trasu, oprávnění ani účet, který neexistuje. Připojte VPN ručně a otevřete sdílení ve Finderu, než napíšete jakýkoli skript. Pokud to selže, skript selže matoucnějším způsobem.

Zapište tři hodnoty, které skript použije: název profilu přesně tak, jak ho Tunnelblick uvádí, URL sdílení a název svazku, který Finder po připojení zobrazí. Název svazku je důležitý, protože kontrola existujícího připojení ho používá, a kontrola pouze podle názvu je pohodlná pojistka, nikoli důkaz totožnosti serveru. Použijte název, který je na stroji jedinečný. Poté potvrďte, že server vůbec odpovídá.

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

První příkaz dokazuje, že server odpovídá, druhý, že se název profilu vyřeší, a třetí ukazuje, jak vypadá úspěšné připojení. Zaznamenejte všechny tři, než cokoli zautomatizujete.

Přečtěte stav profilu z Tunnelblick

Tunnelblick zpřístupňuje své konfigurace a jejich stavy přes AppleScript, a to je jediný háček, který tento návrh potřebuje. Stav, na kterém záleží, je řetězec hlášený pro tento jeden profil, nikoli přítomnost aplikace.

Dotazování má důsledky, které stojí za zmínku. Opětovné připojení kratší než interval může projít nepovšimnuto a applet přechod vůbec nevidí. To je přijatelné pro pojistku připojení a nepřijatelné pro cokoli, co musí reagovat na každou událost. Pokud potřebujete věrnost událostí, je to špatný mechanismus, nikoli mechanismus, který potřebuje kratší časovač. Zvolte interval s tímto kompromisem na mysli.

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

Exportujte jej jako aplikaci s volbou zůstat otevřená a poté jej spusťte v přihlášené relaci namísto přes sudo.

Připojte jednou, potom přestaňte zkoušet

Příznak pokusu je to, co brání tomu, aby se z tohoto stala smyčka hádající přihlašovací údaje. Jakmile applet zkusí, čeká na změnu stavu připojení, než to zkusí znovu.

Toto chování je záměrné. Sdílení, které připojení odmítá, ho obvykle odmítá z důvodu, který nový pokus nemůže napravit, a opakované pokusy mění jeden dotaz v jejich proud. Příznak se resetuje, když profil opustí připojený stav, takže skutečné opětovné připojení vytvoří přesně jeden nový pokus. Ukončení a opětovné spuštění appletu ho také resetuje, a to je ruční přepnutí. Ani jedna cesta selhání neskrývá; obě ho nechávají viditelné ve Finderu.

Skript nenese žádné heslo a tak by to mělo zůstat. Nechte operaci připojení zeptat se a nechte klíčenku dělat to, co organizace podporuje. Vložení pověření do URL mění pohodlný skript na tajemství, které je nutné rotovat.

Co pomocník nedokáže

Tři omezení stojí za to napsat vedle appletu. Nedokáže vysunout zaneprázdněný svazek po selhání sítě, nedokáže zaručit, že DNS a server jsou připraveny, když stav říká připojeno, a nereaguje na každé opětovné připojení.

První omezení je v praxi nejdůležitější. Sdílení, jehož server zmizí, zanechá svazek, který vypadá připojeně a při přístupu blokuje, a zdvořilou opravou je dokončit operace se soubory a vysunout před plánovaným odpojením. Druhé vysvětluje většinu neúspěšných prvních pokusů: tunel je nahoře, zatímco resolver ještě nedohonil, takže počkejte a potom jednou připojte ručně pro potvrzení. Třetí je dřívější kompromis dotazování, nikoli chyba k opravě.

Pro stroj bez dozoru nebo spravovanou flotilu je tento návrh špatný tvar. Použijte zásady připojování vlastněné správcem místo rozšiřování appletu plochy na privilegovanou službu.

Související články