
Описание
Микросервис предназначенный для деаутентификации сессии и удаления 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 | Сервис запущен: Cервис не запущен:
|
| Запуск сервиса | service eltex-disconnect-service start | |
| Остановка сервиса | service eltex-disconnect-service stop | Сервис успешно остановлен:
|
| Перезапуск сервиса | service eltex-disconnect-service restart | Сервис успешно перезапущен:
|
Принцип работы
Сервис 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" : false,
"fail" : "описание возникшей ошибки"
} |
Конфигурация
/etc/eltex-disconnect-service/application.conf
Основной конфигурационный файл.
pcrf {
host = localhost
// connection port (7070 is default)
port = 7070
// for timeouts (you can use ns, us, ms, s, m and h letters)
// consult with HOCON duration format for more information
// how long we wait for connection
connectionTimeout = 10s
// how long we wait for response end
// minimum value should be greater then pcrf coa timeout
socketReadTimeout = 15s
// pool configuration
pool {
// minimum idle objects in pool
min = 1
// maximum pool size
max = 20
// timeout to retrieve an object from pool
waitTimeout = 5s
}
}
// JWT validation. You need a key from Eltex Doors.
// Or you could generate it yourself.
validation {
public_key = /etc/eltex-doors/keys/public.pem |
- Настройки подключения к 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
# Initial size of Java heap
JAVA_INIT_HEAP=4m
# Maximum size of Java heap
JAVA_MAX_HEAP=32m
# Additional arguments to pass to java
JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-disconnect-service" |
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
Файл настройки логирования.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="600">
<Properties>
<Property name="rootLevel">${env:LOG_LEVEL:-ERROR}</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">20</Property>
<Property name="logPattern">%d{ISO8601} [%t] %-5p %logger{12} %C{1}.%M(line:%L). %m%n</Property>
<Property name="consoleLevel">${env:CONSOLE_LEVEL:-OFF}</Property>
<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>
</Properties>
<Appenders>
<Console name="STDERR" target="System.err">
<PatternLayout pattern="${logPattern}"/>
</Console>
<RollingFile name="RollingFile"
fileName="${baseDir}/disconnect-service.log"
filePattern="${baseDir}/log/disconnect-service-%i.log.gz">
<PatternLayout pattern="${logPattern}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${maxFileSize}"/>
</Policies>
<DefaultRolloverStrategy max="${maxCount}">
<Delete basePath="${baseDir}" maxDepth="3">
<IfFileName glob="*/disconnect-service-*.log.gz">
<IfLastModified age="${lastModified}"/>
<IfAny>
<IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
<IfAccumulatedFileCount exceeds="${maxCount}"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<Gelf name="Gelf" host="${gelfHost}" port="${gelfPort}" version="1.1" facility="eltex-disconnect-service"
extractStackTrace="true" originHost="%host{fqdn}" maximumMessageSize="8192">
<Field name="thread" pattern="%t"/>
<Field name="level" pattern="%level"/>
<Field name="severity" pattern="%-5level"/>
<Field name="logger" pattern="%logger{12}"/>
<Field name="location" pattern="%C{1}.%M(line:%L)"/>
</Gelf>
</Appenders>
<Loggers>
<Root level="${rootLevel}">
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="STDERR" level="${consoleLevel}"/>
<AppenderRef ref="Gelf" level="${gelfLevel}"/>
</Root>
<Logger name="org.springframework" level="ERROR"/>
<Logger name="org.apache" level="OFF"/>
</Loggers>
</Configuration> |
- Автоматическое перечитывание конфигурации логгера:
<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}
|
| Вместо <tag> необходимо указать актуальную версию, которую можно посмотреть по ссылке. |
# 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 |