Монтування спільного ресурсу з Tunnelblick без роботи як root
AppleScript, що залишається відкритим, може стежити за одним профілем Tunnelblick і монтувати SMB-ресурс як користувач, який увійшов, без root-хука і без sudo без пароля.
VPN-клієнту потрібна привілейована допомога для переналаштування мережі, і цей факт застосовується надто широко до всього навколо. Скрипту, який монтує файловий ресурс, root не потрібен, бо ресурс належить сеансу користувача, який увійшов, і його обліковим даним. Винесення монтування з привілейованого шляху прибирає потребу в правилах sudo, root-хуках і правках вбудованих програм. Залишається невеликий applet, який залишається відкритим, стежить за одним профілем і робить одну спробу.
Чому це належить до сеансу користувача
Змонтований том — властивість сеансу, який його змонтував. Сеанс іншого користувача його не бачить, а монтування, що належить root, поводиться інакше, ніж створене Finder. Збереження монтування в сеансі користувача зберігає цю семантику.
Привілейовані помічники існують для тих частин, яким вони справді потрібні: створення тунельного інтерфейсу, зміна маршрутів, оновлення резолвера. Монтування SMB-ресурсу не належить до цих частин. Ставлення до нього як до такої частини змушує вибирати між sudo без пароля і root-скриптом, який виконується, коли нікого немає. Обидва — більший ризик, ніж виправдовує проблема, а підхід через сеанс користувача повністю уникає цього вибору.
Власні хуки підключення Tunnelblick тут не заміна, оскільки вони виконуються поза сеансом робочого столу, а їхній порядок щодо скриптів клієнта не визначений. Опитування стану з користувацького applet — менший механізм із меншою кількістю припущень.
Спершу доведіть вручну, що ресурс працює
Автоматизація не може надати маршрут, дозвіл або обліковий запис, яких немає. Підключіть VPN вручну і відкрийте ресурс у Finder, перш ніж писати будь-який скрипт. Якщо це не вдасться, скрипт зазнає невдачі в більш заплутаний спосіб.
Запишіть три значення, які використовуватиме скрипт: назву профілю точно так, як її перелічує Tunnelblick, URL ресурсу й назву тому, яку Finder показує після монтування. Назва тому важлива, бо перевірка наявного монтування використовує її, а перевірка лише за назвою — зручна страховка, а не доказ ідентичності сервера. Використовуйте назву, унікальну на машині. Потім переконайтеся, що сервер узагалі відповідає.
smbutil view //files.corp.example
osascript -e 'tell application "Tunnelblick" to get state of first configuration whose name is "Office"'
mount | grep -i smbfs
Перша команда доводить, що сервер відповідає, друга — що назва профілю розв’язується, а третя показує, як виглядає успішне монтування. Зафіксуйте всі три, перш ніж щось автоматизувати.
Прочитайте стан профілю з Tunnelblick
Tunnelblick надає свої конфігурації та їхні стани через AppleScript, і це єдиний хук, потрібний цьому проєкту. Важливий той стан, який повідомляється для цього одного профілю, а не присутність програми.
Опитування має наслідки, про які варто сказати. Перепідключення, коротше за інтервал, може пройти непоміченим, і applet узагалі не бачить переходу. Це прийнятно для страховки монтування і неприйнятно для всього, що має реагувати на кожну подію. Якщо потрібна точність подій, це неправильний механізм, а не механізм, якому потрібен коротший таймер. Вибирайте інтервал з огляду на цей компроміс.
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
Експортуйте його як програму з можливістю залишатися відкритою, потім запустіть у сеансі користувача, який увійшов, а не через sudo.
Змонтуйте один раз, потім припиніть спроби
Прапорець спроби — це те, що не дає цьому перетворитися на цикл вгадування облікових даних. Щойно applet спробував, він чекає на зміну стану з’єднання, перш ніж спробувати знову.
Така поведінка навмисна. Ресурс, який відмовляє в монтуванні, зазвичай відмовляє з причини, яку повторна спроба не виправить, а повторні спроби перетворюють один запит на їхній потік. Прапорець скидається, коли профіль виходить із підключеного стану, тож справжнє перепідключення дає рівно одну нову спробу. Вихід і повторний запуск applet також скидають його, і це ручне перевизначення. Жоден із шляхів не приховує збою; обидва залишають його видимим у Finder.
Скрипт не містить пароля, і так має залишитися. Дозвольте операції монтування запитати, а в’язці ключів — робити те, що підтримує організація. Вбудовування облікових даних в URL перетворює зручний скрипт на секрет, який треба ротувати.
Чого помічник не може
Три обмеження варто записати поруч з applet. Він не може витягти зайнятий том після мережевого збою, не може гарантувати, що DNS і сервер готові, коли стан каже «підключено», і не реагує на кожне перепідключення.
Перше обмеження найважливіше на практиці. Ресурс, сервер якого зникає, залишає том, який виглядає змонтованим і блокує доступ, а ввічливе виправлення — завершити файлові операції та витягти його до планового від’єднання. Друге пояснює більшість невдалих перших спроб: тунель піднято, поки резолвер ще не наздогнав, тож зачекайте і потім один раз змонтуйте вручну для підтвердження. Третє — той самий компроміс опитування, а не помилка, яку треба виправити.
Для машини без нагляду або керованого парку ця схема має неправильну форму. Використовуйте політику монтування, що належить адміністратору, замість розширення applet робочого столу до привілейованої служби.