Добавь установщик Lemana VPN
This commit is contained in:
207
README.md
Normal file
207
README.md
Normal file
@@ -0,0 +1,207 @@
|
||||
# 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`.
|
||||
|
||||
## Быстрая установка
|
||||
|
||||
```sh
|
||||
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh
|
||||
```
|
||||
|
||||
После установки открой новый shell или выполни:
|
||||
|
||||
```sh
|
||||
exec zsh
|
||||
vpn
|
||||
```
|
||||
|
||||
## Варианты установки
|
||||
|
||||
Полная установка, режим по умолчанию:
|
||||
|
||||
```sh
|
||||
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh
|
||||
```
|
||||
|
||||
Без Touch ID, но с Bitwarden:
|
||||
|
||||
```sh
|
||||
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 вручную:
|
||||
|
||||
```sh
|
||||
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh -s -- --minimal --configure-keychain
|
||||
```
|
||||
|
||||
Проверить действия без изменений:
|
||||
|
||||
```sh
|
||||
curl -fsSL http://192.168.50.109/dokril/lemana-vpn/raw/branch/main/install.sh | sh -s -- --dry-run
|
||||
```
|
||||
|
||||
Если raw URL отличается, переопредели базовый адрес:
|
||||
|
||||
```sh
|
||||
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-lite` config;
|
||||
- DNS cleanup wrapper.
|
||||
|
||||
### Bitwarden
|
||||
|
||||
Включён по умолчанию. CLI при каждом запуске `vpn` пытается получить LDAP-пароль и TOTP из записи Bitwarden `LM LDAP`, затем записывает их в macOS Keychain для `openconnect-lite`.
|
||||
|
||||
Отключить:
|
||||
|
||||
```sh
|
||||
sh install.sh --without-bitwarden
|
||||
```
|
||||
|
||||
В этом режиме credentials нужно положить в Keychain вручную:
|
||||
|
||||
```sh
|
||||
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
|
||||
sh install.sh --without-touchid
|
||||
```
|
||||
|
||||
## Использование
|
||||
|
||||
```sh
|
||||
vpn # подключиться
|
||||
vpn --status # статус без нового подключения
|
||||
vpn --status --json # статус в JSON
|
||||
vpn-debug # видимый браузер и debug-логи
|
||||
vpn-fix-dns # сбросить корпоративные DNS после аварийного завершения
|
||||
```
|
||||
|
||||
Первый запуск с Bitwarden:
|
||||
|
||||
1. CLI проверит `bw`.
|
||||
2. Если vault locked, попросит мастер-пароль.
|
||||
3. Если установлен Touch ID helper, предложит сохранить мастер-пароль за Touch ID prompt.
|
||||
4. Достанет `LM LDAP`, запишет LDAP-пароль и TOTP в Keychain.
|
||||
5. Запустит `openconnect-lite` и пройдёт Keycloak SSO.
|
||||
|
||||
## Настройка
|
||||
|
||||
Файл `~/.config/lemana-vpn/env`:
|
||||
|
||||
```sh
|
||||
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"
|
||||
```
|
||||
|
||||
Для другого логина:
|
||||
|
||||
```sh
|
||||
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.
|
||||
|
||||
## Диагностика
|
||||
|
||||
Проверить установку:
|
||||
|
||||
```sh
|
||||
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`, запусти:
|
||||
|
||||
```sh
|
||||
vpn-debug
|
||||
```
|
||||
|
||||
CLI перед подключением патчит `openconnect-lite`:
|
||||
|
||||
- `minimal` -> `offscreen`, чтобы Qt WebEngine не падал на macOS;
|
||||
- добавляет `input` и `change` events для Keycloak auto-fill;
|
||||
- добавляет URL guard, чтобы auto-fill не кликал submit на Cisco ACS.
|
||||
|
||||
## Удаление
|
||||
|
||||
```sh
|
||||
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` удалить блок:
|
||||
|
||||
```sh
|
||||
# >>> lemana-vpn
|
||||
...
|
||||
# <<< lemana-vpn
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user