Описание
Микросервис предназначенный для деаутентификации сессии и удаления mac-адреса пользователя. Eltex-disconnect взаимодействует с сервисом PCRF, для непосредственной отправки команды на удаление сессии пользователя.
Для валидации JWT-токена на основе публичного ключа, необходимо указать расположение ключа, а также ключ public.pem должен принадлежать группе eltex и иметь права 440. Ключ генерирует сервис doors.
-r--r----- 1 root eltex 451 Sep 19 14:24 public.pem
При изменении ключа необходимо перезапустить сервис disconnect.
Управление сервисом
Действие | Команда | Ответ |
---|---|---|
Проверка состояния | service eltex-disconnect-service status | Сервис запущен: Active: active (running) Cервис не запущен: Active: failed |
Запуск сервиса | service eltex-disconnect-service start | Сервис успешно запущен: Active: active (running) |
Остановка сервиса | service eltex-disconnect-service stop | Сервис успешно остановлен: Active: failed |
Перезапуск сервиса | service eltex-disconnect-service restart | Сервис успешно перезапущен: Active: active (running) |
Принцип работы
Сервис eltex-disconnect ожидает на порту 9096 GET-запрос в формате:
http://<IP-address>:9096/disconnect?token=<token>
Пример запроса:
http://192.168.49.110:9096/disconnect?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiYXV0aCI6WyJST0xFX0FETUlOIl0sImlhdCI6MTU1OTI3OTU4MCwiZXhwIjoxNTU5MzUxNTgwLCJuYXNJcCI6IjEwMC4xMTIuMC4xIiwic2Vzc2lvbklkIjoiNTY5MjU0OTkyODk5NjMwNzk2NCIsInZyZiI6IjEiLCJjbGllbnRNYWMiOiJGQy00NS05Ni01Ri01MC1BQyJ9.fWhOkgFo_rLd2mB9_70HotPH9LlGh7SuT1-qDQvv77U
Текст jwt-токена нужно получить в API eltex-doors /api/signin/.
После получения GET-запроса от внешнего сайта, сервис eltex-disconnect выполняет валидацию jwt-токена на основе публичного ключа, с целью проверки действительно ли данные отправлены авторизованным источником.
Следующий этап - декодирование токена, откуда извлекается payload (метаданные) сессии пользователя, которого необходимо деаунтентифицировать.
Пример декодированного токена:
{ "sub": "user", "auth": [ "ROLE_ADMIN" ], "iat": 1559279580, "exp": 1559351580, "nasIp": "100.112.0.1", "sessionId": "5692549928996307964", "vrf": "1", "clientMac": "FC-45-96-5F-50-AC" }
"sub" - пользователь;
"iat" - время создания токена;
"exp" - время жизни токена;
"nasIp" - nas устройства;
"sessionId" - уникальная сессия пользователя;
"vrf" - Virtual Routing and Forwarding;
"clientMac" - mac-адрес пользователя.
Далее происходит отправка GET-запроса disconnect на API PCRF, в котором передаются необходимый набор параметров: VRF, Mac, sessionId, nasIp.
Пример запроса:
GET http://127.0.0.1:7070/account/disconnect?session=5692549928996307974&nas_ip=100.112.0.1&vrf=1&single=false&mac=FC-45-96-5F-50-AC&remove_mac=true
PCRF выполняет деаунтентификацию и удаление mac-адреса.
- В случае успеха сервис ответит:
{ "success" : true }
- При ошибке ответ будет следующим:
{ "success" : false, "fail" : "описание возникшей ошибки" }
Конфигурация
/etc/eltex-disconnect-service/application.conf
Основной конфигурационный файл.
- Настройки подключения к PCRF:
pcrf { host = localhost IP-адрес сервера port = 7070 Порт сервера timeout = 10s Время ожидания ответа pool { Настройки пула min = 1 max = 20 waitTimeout = 5s } }
- Путь к публичному ключу:
validation { public_key = /etc/eltex-doors/keys/public.pem
/etc/default/eltex-disconnect-service
Cодержит параметры, необходимые для инициализации сервиса.
- Слушаемый порт:
PORT=9096
Настройка памяти, выделяемой на работу сервиса:
JAVA_INIT_HEAP=4m JAVA_MAX_HEAP=32m
- Дополнительные настройки инициализации сервера:
JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-disconnect-service"
/etc/eltex-disconnect-service/log4j2.xml
Файл настройки логирования.
- Автоматическое перечитывание конфигурации логгера:
<Configuration monitorInterval="600">
- Уровень логирования:
<Property name="rootLevel">${env:LOG_LEVEL:-INFO}</Property>
- Базовая директория хранения логов:
<Property name="baseDir">/var/log/eltex-disconnect-service</Property>
- Максимально допустимый размер файла (при его превышении создается новый файл. а старый архивируется):
<Property name="maxFileSize">20 MB</Property>
- Суммарный размер логов (текущий файл + архивные). При его превышении наиболее старые файлы будут удаляться:
<Property name="accumulatedFileSize">100 MB</Property>
- Срок хранения логов, файлы модифицированные раннее этого срока будут удаляться:
<Property name="lastModified">4d</Property>
- Максимальное количество архивных файлов, при его превышении наиболее старые файлы будут перезаписываться:
<Property name="maxCount">7</Property>
- Блок настройки перенаправления логов в Graylog (уровень логирования, адрес, порт):
<Property name="gelfLevel">${env:GELF_LEVEL:-OFF}</Property> <Property name="gelfHost">${env:GELF_HOST:-udp:lab3-test.eltex.loc}</Property> <Property name="gelfPort">${env:GELF_PORT:-12201}</Property>
Докеризация сервиса
Сервис может быть запущен в docker-контейнере. Для этого необходимо подготовить файл с переменными окружения .env и docker-compose.yml.
version: "3" services: disconnect-service: container_name: disconnect-service image: ${ELTEX_HUB}/eltex-disconnect-service:${SWLC_VERSION}-<tag> restart: unless-stopped mem_limit: 256m ports: - 9096:9096 volumes: - "/etc/eltex-disconnect-service/application.conf:/etc/eltex-disconnect-service/application.conf" - "/etc/eltex-disconnect-service/log4j2.xml:/etc/eltex-disconnect-service/log4j2.xml" - "/etc/eltex-doors/keys/public.pem:/etc/eltex-doors/keys/public.pem" - "/var/log/eltex-disconnect-service:/var/log" environment: - TZ=${TZ}
# Docker HUB ELTEX_HUB=hub.eltex-co.ru # Common version number SWLC_VERSION=1.25 # Настройки таймзоны TZ=Asia/Novosibirsk
Описание переменных окружения
- ELTEX_HUB - адрес репозитория Eltex;
- SWLC_VERSION - версия образа;
- TZ - часовой пояс в формате Asia/Novosibirsk (список существующих можно посмотреть командой timedatectl list-timezones).
Запуск
Предварительно в файле /etc/eltex-disconnect-service/application.conf необходимо в блоке "pcrf" прописать адрес хоста, на которм работает сервис eltex-pcrf.
В случае, если оставить дефолтное значение localhost, сервис будет обращаться сам к себе, от чего работать не сможет.
pcrf { host = 192.168.1.250
Файлы .env и docker-compose.yml должны находиться в одной папке. Контейнер запускается командой:
root@ubuntu:~# docker-compose up -d