Описание
...
Микросервис предназначенный для деаутентификации сессии и удаления mac-адреса пользователя. Eltex-disconnect взаимодействует с сервисом PCRF, для непосредственной отправки команды на удаление сессии пользователя.
Для валидации JWT-токена на основе публичного ключа, необходимо указать расположение ключа, а также ключ public.pem должен принадлежать группе eltex и иметь права 440. Ключ генерирует сервис doors.
...
Подсказка |
---|
При изменении ключа необходимо перезапустить сервис disconnect. code |
Управление сервисом
...
...
...
...
Проверка состояния | service eltex-disconnect-service |
...
Доступные методы API: disconnect
- В случае успеха сервис Eltex-disconnect ответит
Блок кода |
---|
|
{
"success" : true
} |
- При ошибке ответ будет следующим:
Блок кода |
---|
|
{
"success" : false,
"fail" : "описание возникшей ошибки"
} |
Описание работы
...
status | Сервис запущен: Подсказка |
---|
Active: active (running) |
Cервис не запущен: Предупреждение |
---|
Active: failed |
|
Запуск сервиса | service eltex-disconnect-servicestart | Сервис успешно запущен: Подсказка |
---|
Active: active (running) |
|
Остановка сервиса | service eltex-disconnect-service stop | Сервис успешно остановлен:
|
Перезапуск сервиса | service eltex-disconnect-service restart | Сервис успешно перезапущен: Подсказка |
---|
Active: active (running) |
|
Принцип работы
...
Сервис eltex-disconnect ожидает на порту 9096 GET-запросв формате:
Без форматирования |
---|
http:// |
...
<IP-address>:9096/disconnect?token= |
...
Пример запроса:
Блок кода |
---|
|
http://192.168.49.110:9096/disconnect?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiYXV0aCI6WyJST0xFX0FETUlOIl0sImlhdCI6MTU1OTI3OTU4MCwiZXhwIjoxNTU5MzUxNTgwLCJuYXNJcCI6IjEwMC4xMTIuMC4xIiwic2Vzc2lvbklkIjoiNTY5MjU0OTkyODk5NjMwNzk2NCIsInZyZiI6IjEiLCJjbGllbnRNYWMiOiJGQy00NS05Ni01Ri01MC1BQyJ9.fWhOkgFo_rLd2mB9_70HotPH9LlGh7SuT1-qDQvv77U |
После получения GET-запроса от внешнего сайта, сервис eltex-disconnect выполняет валидацию jwt-токена на основе публичного ключа для проверки того, что данные действительно , с целью проверки действительно ли данные отправлены авторизованным источником.
Следующий этап , это - декодирование токена, от куда откуда извлекается payload(метаданные) сессии пользователя, которого необходимо деаунтентифицировать.
Пример декодированного токена:
Section |
---|
|
theme | RDark |
---|
{
"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"
} |
|
|
Описание полей payload токена
Без форматирования |
---|
sub - пользователь
iat - время создания токена
exp - время жизни токена
nasIp - nas устройства
sessionId - уникальная сессия пользователя
vrf - Virtual Routing and Forwarding
clientMac - mac адрес пользователя |
...
Column |
---|
"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
Основной конфигурационный файл.
Блок кода |
---|
language | xml |
---|
title | /etc/eltex-disconnect-service/application.conf |
---|
|
noformat |
pcrf {
host = localhost адрес
сервиса PCRF // connection port = 7070 порт, который слушает PCRF
timeout = 100 время ожидания ответа
}
validation {
(7070 is default)
port = 7070
// timeout (you can use ns, us, ms, s, m and h letters)
// consult with HOCON duration format for more information
timeout = 10s
// 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одержит параметры, необходимые для инициализации сервиса.
Блок кода |
---|
language | xml |
---|
title | /etc/default/eltex-disconnect-service |
---|
|
noformat |
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" |
Без форматирования |
---|
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
Файл настройки логирования.
Блок кода |
---|
language | xml |
---|
title | /etc/eltex-disconnect-service/log4j2.xml |
---|
collapse | true |
---|
|
<?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> |