Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Описание


Микросервис предназначенный для деаутентификации сессии и удаления 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

Основной конфигурационный файл.

/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одержит параметры, необходимые для инициализации сервиса.

/etc/default/eltex-disconnect-service
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

Файл настройки логирования.

/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.

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> необходимо указать актуальную версию, которую можно посмотреть по ссылке.


.env
# 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
  • Нет меток