Lemana VPN
CLI-установка корпоративного VPN vpn.lemanapro.ru для macOS.
Репозиторий собирает в один воспроизводимый пакет то, что раньше было ручной локальной настройкой:
openconnectкак VPN-клиент;openconnect-liteдля SAML SSO через Keycloak;- опциональный Bitwarden CLI для LDAP-пароля и TOTP;
- опциональный Touch ID helper для мастер-пароля Bitwarden;
- безопасный DNS cleanup через root-owned wrapper;
- алиасы
vpn,vpn-debug,vpn-fix-dns.
Быстрая установка
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh
После установки открой новый shell или выполни:
exec zsh
vpn
Варианты установки
Полная установка, режим по умолчанию:
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh
Без Touch ID, но с Bitwarden:
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh -s -- --without-touchid
Минимальная установка без Bitwarden и Touch ID. Пароль LDAP и TOTP будут один раз записаны в macOS Keychain вручную:
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh -s -- --minimal --configure-keychain
Проверить действия без изменений:
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh -s -- --dry-run
Если raw URL отличается, переопредели базовый адрес:
curl -fsSL https://example.org/dokril/lemana-vpn/raw/branch/main/install.sh \
| LEMANA_VPN_RAW_BASE_URL=https://example.org/dokril/lemana-vpn/raw/branch/main sh
Что ставится
| Путь | Назначение |
|---|---|
~/bin/vpn-lemanapro.sh |
Основной CLI для подключения, статуса и sync секретов |
~/bin/keychain-fingerprint |
Опциональный Touch ID helper для мастер-пароля Bitwarden |
~/.config/lemana-vpn/env |
Локальная конфигурация модулей |
~/.config/openconnect-lite/config.toml |
Профиль SSO и auto-fill правила Keycloak |
/usr/local/sbin/lemana-vpn-dns-cleanup |
Root-owned wrapper для сброса только корпоративных DNS |
/etc/sudoers.d/lemana-vpn-openconnect |
NOPASSWD только для openconnect |
/etc/sudoers.d/lemana-vpn-dns |
NOPASSWD только для DNS cleanup wrapper |
~/.zshrc |
Идемпотентный блок алиасов vpn, vpn-debug, vpn-fix-dns |
Модули
Core
Всегда устанавливается:
openconnectчерез Homebrew;pipxчерез Homebrew;openconnect-liteчерезpipx;- CLI
vpn-lemanapro.sh; openconnect-liteconfig;- DNS cleanup wrapper.
Bitwarden
Включён по умолчанию. CLI при каждом запуске vpn пытается получить LDAP-пароль и TOTP из записи Bitwarden LM LDAP, затем записывает их в macOS Keychain для openconnect-lite.
Отключить:
sh install.sh --without-bitwarden
В этом режиме credentials нужно положить в Keychain вручную:
vpn-lemanapro.sh --configure-keychain
Touch ID
Включён по умолчанию. Установщик собирает keychain-fingerprint из https://github.com/dss99911/keychain-fingerprint.git и кладёт бинарник в ~/bin/keychain-fingerprint.
Важно: этот helper показывает системный Touch ID prompt перед чтением мастер-пароля Bitwarden, но это не аппаратный Keychain ACL. Это удобный локальный гейт поверх записи Keychain.
Отключить:
sh install.sh --without-touchid
Использование
vpn # подключиться
vpn --status # статус без нового подключения
vpn --status --json # статус в JSON
vpn-debug # видимый браузер и debug-логи
vpn-fix-dns # сбросить корпоративные DNS после аварийного завершения
Первый запуск с Bitwarden:
- CLI проверит
bw. - Если vault locked, попросит мастер-пароль.
- Если установлен Touch ID helper, предложит сохранить мастер-пароль за Touch ID prompt.
- Достанет
LM LDAP, запишет LDAP-пароль и TOTP в Keychain. - Запустит
openconnect-liteи пройдёт Keycloak SSO.
Настройка
Файл ~/.config/lemana-vpn/env:
LEMANA_VPN_USERNAME="60103293"
LEMANA_VPN_BW_ITEM="LM LDAP"
LEMANA_VPN_USE_BITWARDEN="1"
LEMANA_VPN_USE_TOUCHID="1"
LEMANA_VPN_DNS_CLEANUP="/usr/local/sbin/lemana-vpn-dns-cleanup"
Для другого логина:
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh \
| sh -s -- --username 12345678
Bitwarden item
Нужна запись:
- название:
LM LDAP; - username: корпоративный LDAP логин;
- password: LDAP пароль;
- TOTP:
otpauth://...secret=BASE32...или raw BASE32 secret.
Почему DNS wrapper, а не wildcard sudoers
Старый вариант давал NOPASSWD на networksetup -setdnsservers *. Это слишком широкое право: любой локальный процесс пользователя мог поменять DNS на произвольный сервер.
Новый вариант разрешает sudo только на /usr/local/sbin/lemana-vpn-dns-cleanup. Wrapper сбрасывает DNS только если текущий DNS начинается с 10., то есть похож на корпоративный VPN DNS.
Диагностика
Проверить установку:
command -v vpn-lemanapro.sh
openconnect --version
~/.local/bin/openconnect-lite --help
sudo -n /usr/local/sbin/lemana-vpn-dns-cleanup
vpn --status
Если SSO ломается после обновления openconnect-lite, запусти:
vpn-debug
CLI перед подключением патчит openconnect-lite:
minimal->offscreen, чтобы Qt WebEngine не падал на macOS;- добавляет
inputиchangeevents для Keycloak auto-fill; - добавляет URL guard, чтобы auto-fill не кликал submit на Cisco ACS.
Удаление
rm -f ~/bin/vpn-lemanapro.sh ~/bin/keychain-fingerprint
rm -rf ~/.config/lemana-vpn
rm -f ~/.config/openconnect-lite/config.toml
sudo rm -f /usr/local/sbin/lemana-vpn-dns-cleanup
sudo rm -f /etc/sudoers.d/lemana-vpn-openconnect /etc/sudoers.d/lemana-vpn-dns
Из ~/.zshrc удалить блок:
# >>> lemana-vpn
...
# <<< lemana-vpn