Wiki · Docs
← На главный сайт

Руководство по установке и настройке Ligament 2FA

Официальное пошаговое техническое руководство администратора информационной безопасности по развёртыванию ядра Ligament Core в Docker, интеграции со службой каталогов Active Directory/FreeIPA, настройке факторов аутентификации и централизованной раскатке клиентских агентов.

1
Архитектура и системные требования

Платформа Ligament функционирует полностью автономно внутри вашего изолированного контура (100% On-Premise). Все мастер-ключи шифрования, база данных пользователей, сессии и журналы аудита безопасности хранятся в защищённой реляционной СУБД PostgreSQL. Решение не обращается к внешним серверам и готово к работе в сетях без интернета (Air-Gapped).

💡

Минимальные требования к хосту:

• CPU: 1 ядро x86_64 или ARM64.
• RAM: 1 ГБ (рекомендуется 2 ГБ для сред от 500 пользователей).
• Диск: 10 ГБ SSD/NVMe под ОС, образы и базу PostgreSQL.
• ОС: Astra Linux (SE 1.7 / CE), РЕД ОС (7.3 / 8), Альт Сервер, Ubuntu 22.04/24.04, Debian 12, Rocky Linux 9.

Таблица сетевых портов

Порт Протокол Служба Назначение
80 TCP HTTP Редирект на HTTPS и ACME HTTP-01 challenge Let's Encrypt
8080 TCP Web UI / API Панель администратора, кабинет пользователя, REST API, WebSSO
443 TCP HTTPS / WSS Защищённый доступ клиентов, филиальных релеев и WebAuthn/Passkey
1812 UDP RADIUS Auth Аутентификация MikroTik, VPN (OpenVPN, WireGuard), Wi-Fi 802.1X
1813 UDP RADIUS Acct Учёт сетевого времени и трафика клиентских сессий
2
Установка сервера Ligament Core в Docker

Ядро платформы упаковано в официальный оптимизированный образ Docker Hub aligorov/ligament_2fa. Для установки не требуются компиляторы и утилиты сборки.

Вариант А: Быстрый старт официальным скриптом (Рекомендуется)

Скрипт проверяет Docker, тестирует свободность портов 80/8080 (TCP) и 1812/1813 (UDP), генерирует надёжный пароль PostgreSQL в .env (с правами 0600), разворачивает контейнеры и выгружает первичные ключи.

bash — авто-установка скриптом
mkdir -p /opt/ligament && cd /opt/ligament
curl -fsSL https://raw.githubusercontent.com/aligorov/ligament/main/install.sh -o install.sh
chmod +x install.sh && ./install.sh

Вариант Б: Ручное развёртывание через Docker Compose

Создайте каталог /opt/ligament и сохраните файл docker-compose.yml:

yaml — docker-compose.yml
services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: twofa
      POSTGRES_PASSWORD: "${TWOFA_PG_PASSWORD:?Укажите TWOFA_PG_PASSWORD в .env}"
      POSTGRES_DB: twofa
    volumes:
      - twofa_pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U twofa -d twofa"]
      interval: 5s
      timeout: 3s
      retries: 20
    restart: unless-stopped

  twofa:
    image: aligorov/ligament_2fa:latest
    hostname: ligament-auth
    depends_on:
      db:
        condition: service_healthy
    environment:
      TWOFA_DB_DSN: "postgres://twofa:${TWOFA_PG_PASSWORD}@db:5432/twofa"
      TRUSTED_PROXIES: "127.0.0.0/8,::1/128,172.16.0.0/12,10.0.0.0/8,192.168.0.0/16"
    ports:
      - "80:8080"
      - "8080:8080"
      - "1812:1812/udp"
      - "1813:1813/udp"
    volumes:
      - /etc/machine-id:/etc/host-machine-id:ro
    restart: unless-stopped

volumes:
  twofa_pgdata:

Сгенерируйте файл .env и запустите стек:

bash — запуск контейнеров
echo "TWOFA_PG_PASSWORD=$(openssl rand -hex 24)" > .env
chmod 600 .env
docker compose up -d
3
Первый вход администратора и безопасность

Пароль администратора никогда не пишется в консольные логи контейнера. При первом запуске система создаёт учётную запись admin, записывает первичный пароль в admin_password.txt и создаёт 5 одноразовых кодов аварийного восстановления admin_recovery_codes.txt.

bash — выгрузка пароля и break-glass кодов
# Забрать сгенерированный пароль администратора:
docker cp $(docker compose ps -q twofa):/home/nonroot/admin_password.txt .

# Забрать 5 одноразовых аварийных кодов восстановления:
docker cp $(docker compose ps -q twofa):/home/nonroot/admin_recovery_codes.txt .

# Вывести пароль:
cat admin_password.txt
⚠️

Порядок действий сразу после авторизации:

1. Откройте в браузере http://IP-сервера:8080 (логин: admin).
2. Сохраните admin_recovery_codes.txt в корпоративный сейф (KeePass/Vault).
3. Удалите файл пароля с хоста: rm -f admin_password.txt.
4. В профиле измените пароль на постоянный и подключите второй фактор (TOTP / Telegram).

4
Лицензирование и автономность (Air-Gapped)

По умолчанию включена бесплатная редакция Community — до 5 активных сотрудников бессрочно.

Для перехода на коммерческую редакцию или активации 30-дневного пилота:

  • Откройте раздел веб-интерфейса /admin → Лицензия.
  • Вставьте лицензионный ключ в текстовое поле и нажмите «Сохранить лицензию».
  • Ключ подписан цифровой подписью Ed25519 — он валидируется локально и применяется моментально без перезагрузки сервера и без выхода в интернет.
5
Настройка сетевого домена и SSL/TLS

В разделе /admin → Настройки → Домен и шаблоны укажите внешний URL вашего сервера в параметре server.domain (например: https://auth.company.corp).

🔒

Рекомендуемая схема: Контейнер Ligament работает на внутреннем порту 8080, а входящий трафик терминируется на вашем внешнем обратном прокси (Nginx, Traefik, HAProxy, Caddy) с пробросом заголовков X-Forwarded-For и X-Forwarded-Proto: https.

6
Интеграция с Active Directory и FreeIPA

Импорт пользователей и проверка доменных паролей выполняются по защищённому протоколу LDAPS. В панели /admin → Настройки → Служба каталогов (LDAP) укажите:

Параметр Значение Назначение
enabledtrueВключение модуля синхронизации
urlldaps://dc1.company.corp:636Контроллер домена с шифрованием
bind_dnCN=svc-ligament,OU=Services,DC=company,DC=corpСлужебная учётка для поиска
bind_password••••••••••••Пароль служебной учётки
base_dnDC=company,DC=corpКорень дерева поиска сотрудников
user_filter(&(objectCategory=person)(sAMAccountName={login}))Шаблон поиска логина
cache_passwordstrueШифрование паролей для Wi-Fi 802.1X PEAP
7
Факторы аутентификации 2FA

В разделе /admin → Настройки включите требуемые каналы подтверждения:

  • Telegram-бот: Создайте бота через @BotFather и укажите токен в telegram.bot_token. Сотрудники подтверждают вход кнопкой в мессенджере или вводом числа (Number Matching).
  • Корпоративная почта (SMTP): Оповещение одноразовыми кодами подтверждения через ваш почтовый сервер.
  • FIDO2 / Passkeys / WebAuthn: Аппаратные токены (Рутокен MFA, YubiKey) и системные датчики (Windows Hello, Touch ID).
8
Настройка RADIUS (MikroTik, Wi-Fi 802.1X, VPN)

Ligament Core предоставляет встроенный RADIUS-сервер (UDP 1812 / 1813). Для защиты маршрутизаторов MikroTik выполните в консоли RouterOS:

routeros — подключение RADIUS
/radius add address=192.168.1.10 secret="ВашСекретныйКлюч" service=login,ppp,wireless timeout=5s
/user aaa set use-radius=yes
/ppp aaa set use-radius=yes accounting=yes
/radius incoming set accept=yes
9
Развёртывание агентов Windows Logon (MSI + GPO)

Модуль Credential Provider устанавливается на рабочие станции и серверы Windows для защиты консольного и RDP входа с поддержкой мгновенного Auto-Logon.

Интерфейс входа в систему

Экран входа Windows LogonUI с Ligament 2FA
🪟 Нативный экран входа Windows LogonUI Интеграция в системный экран блокировки: сотрудник вводит логин и пароль, после чего подтверждает вход через Push (Number Matching), Telegram или Passkey.
Вход в Windows по Passkey через QR-код
🔑 Вход по Passkey (Динамический QR-код) Сотрудник сканирует динамический QR-код камерой телефона и подтверждает вход биометрией Face ID / Touch ID. Ввод цифр не требуется.

Настройка групповой политики (GPO):

1. Скопируйте Ligament2FA.admx в \\domain\SYSVOL\domain\Policies\PolicyDefinitions\.
2. Скопируйте Ligament2FA.adml в папку PolicyDefinitions\ru-RU\.
3. В оснастке gpmc.msc включите Server URL (https://auth.company.corp:8080), Auto-Logon (Enabled) и Number Matching (Enabled).

10
Клиентские приложения и онбординг сотрудников

Для сотрудников под управлением Windows и российских ОС Linux (Astra Linux 1.7, РЕД ОС, Альт) доступно графическое приложение Ligament Authenticator.

Вход в приложение Ligament 2FA Authenticator
💻 Авторизация рабочего места в Ligament Authenticator Привязка рабочего ПК к учётной записи пользователя, фоновые системные уведомления и статус соединения с ядром.
11
Филиальный узел Ligament Relay (Офлайн-режим)

Узел Relay решает две ключевые задачи удалённых подразделений:

  • Безопасный проброс RDP и SSH: Устанавливает исходящий туннель WSS (:443) к Core, обеспечивая удалённый доступ без белого IP и без открытия портов 3389/22 наружу.
  • Резервный RADIUS для Wi-Fi: При обрыве интернет-канала выступает локальным автономным RADIUS-сервером (802.1X WPA2/WPA3 Enterprise) по локальному кэшу.
12
Мониторинг, аудит и резервное копирование

• Healthcheck: curl -I http://localhost:8080/healthz (возвращает HTTP 200 OK).
• Журнал аудита: В реальном времени фиксируется в панели /admin/audit.
• Резервное копирование базы:

bash — бэкап PostgreSQL
docker compose exec -T db pg_dump -U twofa twofa | gzip > "ligament_backup_$(date +%F_%H%M).sql.gz"