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

Описание


Eltex-doors является сервисом аутентификации, который выполняет проверку подлинности пользователя, созданием токена и верификацией токена.

Eltex-doors формирует токен JWT на основе переданного POST-запроса содержащий логин, пароль, а также  метаданные.

JWT(JSON Web Token) -  JSON-объект, определен в RFC 7519

Сгенерированные токены хранятся в БД eltex-doors, таблица auth_token.  По истечению, заданного в конфигурационном файле, времени (token.expire.timeout), выполняется очистка устаревших токенов из БД. Для добавления необходимых данных в БД Mysql необходимо установить пакет eltex-doors-db.

Параметры "срок действия токена{iat}" и "время создания токена{exp}" указаны в payload токена. Их можно узнать выполнив декодирование токена.

С версии 1.15 появилась возможность валидировать токены без дополнительного обращения к doors.  При установке или обновлении генерируются открытый и закрытый ключ, которые по умолчанию размещаются в каталоге  /etc/eltex-doors/keys/.

Для того, чтобы к приватному ключу имели доступ только доверенные сервисы, ключам назначаются права 440 и принадлежность группе eltex:

-r--r----- 1 root eltex 1704 Sep 19 10:44 private.pem
-r--r----- 1 root eltex  451 Sep 19 10:44 public.pem

private.pem - ключ необходимый для подписи JWT-токенов.

public.pem - ключ необходимый сервисам для валидации JWT-токенов.

Если по какой-либо причине необходимо пересоздать ключи, то можно запусить скрипт, который находится в каталоге /usr/share/eltex-doors/gen_keys.sh

После генерации новых ключей, необходимо ключ public.pem  заново передать сервисам

При первом обращении за JWT к Doors, сервис выдаёт два токена: access и refresh. Access token имеет короткий срок жизни и используется непосредственно для доступа к сервисам. Refresh token же живёт значительно дольше и используется только для получения нового access token. Такая схема позволяет быстро прекратить доступ к ресурсам в случае утечки access token.

Срок жизни токенов определяется в файле конфигурации сервиса Eltex Doors и по умолчанию составляет 15 минут для access и 30 дней для refresh.

По истечении срока жизни access token внешний сервис должен будет обратиться к Eltex Doors за новым access token, предъявив при этом refresh token.


Установка


Для работы сервиса необходима установка схемы на сервер БД:

apt install eltex-doors-db

Установка сервиса:

apt install eltex-doors


Управление сервисом


Способы запуска/остановки

ДействиеКомандаОтвет
Проверка состоянияservice eltex-doors status

Сервис запущен

Active: active (running)

Cервис не запущен

Active: failed

Запуск сервисаservice eltex-doors start

Сервис успешно запущен

Active: active (running)

Остановка сервисаservice eltex-doors stop

Сервис успешно остановлен

Active: failed

Перезапуск сервисаservice eltex-doors restart

Сервис успешно перезапущен

Active: active (running)

Доступные методы API

Eltex Doors предоставляет следующие методы:

  • Метод получения JWT (refresh token и access token) по логину и паролю.
  • Метод обновления access token по полученному ранее refresh token.
  • Метод инвалидации JWT.
  • Метод проверки JWT. Метод устарел и не рекомендуется к использованию.

Получение токенов по логину и паролю

Для получения access и refresh token требуется в Eltex Doors отправить POST-запрос в формате JSON на URL /api/signin со следующим содержимым:

 POST http://localhost:9097/api/signin HTTP/1.1
 Content-Type: application/json
 Accept: application/json
 {
    "username": "user",
    "password": "password",
    "metadata": {}
 }


  • В поле "username" указывается логин пользователя.
  • В поле "password" указывается пароль пользователя.
  • В поле "metadata" указываются любые данные, которые должны попасть в JWT.

Поле metadata становится опциональным с версии SoftWLC 1.17.

Пример запроса:

curl -XPOST -H "Content-type: application/json" -d '{"username": "user", "password": "password"}' 'http://localhost:9097/api/signin/'
  • В случае успеха, сервис ответит:
{
 "status": "OK",
 "accessToken": "eyJhbGc...",
 "refreshToken": "eyJhb..."
}


"status" - статус ответа;
"accessToken" - сгенерированный токен.

  • В случае ошибки, сервис ответит:
{"status":"FAIL","error":"Invalid username or password"}

"status" - статус ответа;
"error" - описание ошибки.


Отзыв токенов

Полученный ранее refresh token можно отозвать. Для этого нужно отправить запрос на URL /api/signout, добавив заголовок авторизации.

 POST http://localhost:9097/api/signout HTTP/1.1
 Accept: application/json
 Authorization: Bearer eyJhb...

Пример запроса:

curl -XPOST -H "Authorization: Bearer eyJhb..." 'http://localhost:9097/api/signout/'
  • В случае успеха, сервис ответит:
{
  "status": "OK",
  "accessToken": "Logged out",
  "refreshToken": null
}
  • В случае, если токен уже не валиден или неправильный:
{
  "status": "FAIL",
  "error":"Invalid JWT"
}


Обновление токена

Для обновления access token нужно отправить запрос на /api/signin/token с заголовком авторизации:

 POST http://localhost:9097/api/signin/token HTTP/1.1
 Accept: application/json
 Authorization: Bearer eyJhb...

Пример зарпроса:

curl -XPOST -H "Authorization: Bearer eyJhbGc..." 'http://100.110.1.222:9097/api/signin/token/'
  • В случае успеха, сервис ответит:
{
 "status": "OK",
 "accessToken": "eyJhbGc...",
 "refreshToken": "eyJhb..."
}
  • В случае, если токен уже не валиден или неправильный:
{
  "status": "FAIL",
  "error":"Invalid JWT"
}


Конфигурация


/etc/eltex-doors/application.conf

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

/etc/eltex-doors/application.conf
# Mysql datasource properties
database {
  host = localhost
  port = 3306
  name = eltex_doors
  user = eltexdoors
  password = eltexpassword

  pool {
    # Time to wait for a connection
    connectionTimeout = 10s
    # Time to wait for connection validation
    validationTimeout = 3s

    min = 1
    max = 5
  }
}

# Basic account credentials
auth {
  username = user
  password = password
}

# Authentification keys paths
keys {
  private = /etc/eltex-doors/keys/private.pem
  public = /etc/eltex-doors/keys/public.pem
}

# Tokens lifetime
tokens {
  clearTimeout = "*/60 * * * * *"

  lifetime {
    access = 15m
    refresh = 30d
  }
}
  • Основные данные для подключения к БД:
database {
  host = localhost
  port = 3306
  name = eltex_doors
  user = eltexdoors
  password = eltexpassword
...
  • Время ожидания подключения к БД:
connectionTimeout = 10s
  • Время ожидания валидации:
validationTimeout = 3s
  • Минимальное и максимальное количество подключений к БД:
    min = 1
    max = 5
  • Параметры подключения к auth-service:
auth {
  username = user
  password = password
}
  • Расположение ключей:
keys {
  private = /etc/eltex-doors/keys/private.pem
  public = /etc/eltex-doors/keys/public.pem
}
  • Время очистки БД от просроченных токенов:
clearTimeout = "*/60 * * * * *"
  • Время жизни токенов:
  lifetime {
    access = 15m
    refresh = 30d
  }


/etc/default/eltex-doors

Файл настройки инициализации сервиса.

/etc/default/eltex-doors
# AP Monitoring service

# HTTP Port for use by Eltex Doors
PORT=9097

# Initial size of Java heap
JAVA_INIT_HEAP=32m
# Maximum size of Java heap
JAVA_MAX_HEAP=256m

# Additional arguments to pass to java
JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-doors"
  • Слушаемый сервисом порт:
# HTTP Port for use by Eltex Doors
PORT=9097
  • Количество памяти, выделяемое приложению при старте сервиса:
# Initial size of Java heap
JAVA_INIT_HEAP=32m
  • Максимальное количество памяти, которое может арендовать сервис:
# Maximum size of Java heap
JAVA_MAX_HEAP=256m
  • Дополнительные опции запуска java:
# Additional arguments to pass to java
JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-doors"

/etc/eltex-doors/log4j2.xml

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

/etc/eltex-doors/log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>

<Configuration monitorInterval="600">
    <Properties>
        <Property name="rootLevel">DEBUG</Property>

        <Property name="baseDir">/var/log/eltex-doors</Property>
        <Property name="maxFileSize">5 MB</Property>
        <Property name="accumulatedFileSize">100 MB</Property>
        <Property name="lastModified">7d</Property>
        <Property name="maxCount">10</Property>
        <Property name="logPattern">%d{ISO8601} [%t] %-5p %logger{1} %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}/doors.log"
                     filePattern="${baseDir}/log/doors-%i.log.gz">
            <PatternLayout pattern="${logPattern}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${maxFileSize}"/>
                <OnStartupTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="${maxCount}">
                <Delete basePath="${baseDir}" maxDepth="3">
                    <IfFileName glob="*/doors-*.log.gz">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
                            <IfLastModified age="${lastModified}"/>
                        </IfAny>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <Gelf name="Gelf" host="${gelfHost}" port="${gelfPort}" version="1.1" facility="eltex-doors"
              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{1}"/>
            <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.eltex.softwlc.doors"  level="INFO"/>
        <Logger name="org.springframework"      level="ERROR"/>
        <Logger name="org.eclipse.jetty"        level="ERROR"/>
        <Logger name="com.zaxxer"               level="ERROR"/>

    </Loggers>
</Configuration>

  • Интервал автоматического перечитывания конфигурации логгера:
<Configuration monitorInterval="600">
  • Базовая директория хранения логов:
<Property name="baseDir">/var/log/eltex-doors</Property>
  • Максимально допустимый размер файла (при его превышении создается новый файл, а старый архивируется):
<Property name="maxFileSize">5 MB</Property>
  • Суммарный размер логов (текущий файл + архивные). При его превышении наиболее старые файлы будут удаляться:
<Property name="accumulatedFileSize">100 MB</Property>
  • Срок хранения логов, файлы модифицированные раннее этого срока будут удаляться:
<Property name="lastModified">7d</Property>
  • Максимальное количество архивных файлов, при его превышении наиболее старые файлы будут перезаписываться:
<Property name="maxCount">10</Property>
  • Блок настройки перенаправления логов в Graylog (уровень логирования, адрес, порт):
<Property name="gelfLevel">OFF</Property>
<Property name="gelfHost">udp:lab3-test.eltex.loc</Property>
<Property name="gelfPort">12201</Property>
  • Уровень логирования:
<Property name="rootLevel">DEBUG</Property>



  • Нет меток