El client VPN necessita ajuda privilegiada per reconfigurar la xarxa, i aquest fet s’aplica massa àmpliament a tot el que l’envolta. Un script que munta un recurs de fitxers no necessita root, perquè el recurs pertany a la sessió de l’usuari connectat i a les credencials d’aquest usuari. Treure el muntatge del camí privilegiat elimina la necessitat de regles sudo, hooks de root i edicions d’aplicacions incloses. El que queda és un petit applet que roman obert, vigila un perfil i fa un sol intent.

Per què això pertany a la sessió d’usuari

Un volum muntat és una propietat de la sessió que l’ha muntat. La sessió d’un altre usuari no el veu, i un muntatge propietat de root es comporta diferent del que va crear el Finder. Mantenir el muntatge dins la sessió d’usuari preserva aquesta semàntica.

Els assistents privilegiats existeixen per a les parts que realment els necessiten: crear una interfície de túnel, canviar rutes, actualitzar el resolutor. Muntar un recurs SMB no és una d’aquestes parts. Tractar-ho com si ho fos obliga a triar entre sudo sense contrasenya i un script de root que s’executa quan no hi ha ningú. Tots dos són riscos més grans del que justifica el problema, i l’enfocament de sessió d’usuari evita la tria del tot.

Els hooks de connexió propis de Tunnelblick no són cap substitut aquí, ja que s’executen fora de la sessió d’escriptori i el seu ordre respecte als scripts del client no està definit. Consultar l’estat des d’un applet d’usuari és un mecanisme més petit amb menys supòsits.

Proveu primer a mà que el recurs funciona

L’automatització no pot proporcionar una ruta, un permís o un compte que no existeixi. Connecteu la VPN manualment i obriu el recurs al Finder abans d’escriure cap script. Si això falla, el script fallarà d’una manera més confusa.

Anoteu els tres valors que farà servir el script: el nom del perfil exactament com el llista Tunnelblick, l’URL del recurs i el nom del volum que el Finder mostra després de muntar-lo. El nom del volum importa perquè la comprovació d’un muntatge existent el fa servir, i una comprovació només pel nom és una guarda de comoditat, no una prova de la identitat del servidor. Feu servir un nom únic a la màquina. Després confirmeu que el servidor respon, si més no.

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

La primera ordre prova que el servidor respon, la segona que el nom del perfil es resol, i la tercera mostra com és un muntatge correcte. Enregistreu les tres abans d’automatitzar res.

Llegir l’estat del perfil des de Tunnelblick

Tunnelblick exposa les seves configuracions i els seus estats mitjançant AppleScript, i aquest és l’únic hook que aquest disseny necessita. L’estat que importa és la cadena que es reporta per a aquest perfil concret, no la presència de l’aplicació.

La consulta té conseqüències que val la pena dir. Una reconnexió més curta que l’interval pot passar desapercebuda, i l’applet no veu la transició de cap manera. Això és acceptable per a una guarda de muntatge i inacceptable per a qualsevol cosa que hagi de reaccionar a cada esdeveniment. Si necessiteu fidelitat d’esdeveniments, aquest és el mecanisme equivocat i no un mecanisme que necessiti un temporitzador més curt. Trieu l’interval amb aquest compromís al cap.

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

Exporteu-lo com a aplicació amb l’opció de romandre oberta i, després, inicieu-lo a la sessió connectada en lloc de fer-ho amb sudo.

Munteu una vegada i després deixeu de provar

L’indicador d’intent és el que evita que això es converteixi en un bucle que endevina credencials. Un cop l’applet ha provat, espera que canviï l’estat de connexió abans de tornar-ho a provar.

Aquest comportament és deliberat. Un recurs que refusa el muntatge normalment el refusa per una raó que un reintent no pot corregir, i els intents repetits converteixen una sol·licitud en un doll. L’indicador es reinicia quan el perfil deixa l’estat connectat, així que una reconnexió real produeix exactament un intent nou. Sortir i tornar a iniciar l’applet també el reinicia, i aquesta és la solució manual. Cap dels dos camins amaga una fallada; tots dos la deixen visible al Finder.

El script no porta cap contrasenya, i hauria de continuar així. Deixeu que l’operació de muntatge demani, i deixeu que el clauer faci el que l’organització admet. Incrustar una credencial en un URL converteix un script de comoditat en un secret que cal rotar.

Què no pot fer l’assistent

Tres límits val la pena escriure’ls al costat de l’applet. No pot expulsar un volum ocupat després d’una fallada de xarxa, no pot garantir que el DNS i el servidor estiguin a punt quan l’estat diu connectat, i no reacciona a cada reconnexió.

El primer límit és el que més importa a la pràctica. Un recurs el servidor del qual desapareix deixa un volum que sembla muntat i bloqueja en accedir-hi, i la correcció educada és acabar les operacions de fitxers i expulsar abans d’una desconnexió planificada. El segon explica la majoria de primers intents fallits: el túnel està aixecat mentre el resolutor encara no ha arribat, així que espereu i després munteu una vegada a mà per confirmar-ho. El tercer és el compromís de consulta esmentat abans, no un error a corregir.

Per a una màquina sense supervisió o una flota gestionada, aquest disseny té la forma equivocada. Feu servir una política de muntatge propietat de l’administrador en lloc d’estendre un applet d’escriptori a servei privilegiat.

Articles relacionats