Установка hazelcast_server#

Описание модуля#

ConfigModule предназначен для формирования файлов с конфигурационными данными маршрутов.

Установка и настройка#

Для разворачивания Hazelcast Server'а необходимо скопировать содержимое пакета поставки в рабочую директорию приложений ( например, /u01/tfsApp) под пользователем, например, tfs99usr.

   Hazelcast-xxx.jar -> Hazelcast.jar
   hazelcast.sh -> hazelcast.sh
   hazelcast_server.yml -> resources/hazelcast_server.yml
   hazelcast_server.xml -> resources/hazelcast_server.xml
   hazelcast_server_log4j2.xml -> hazelcast_server_log4j2.xml

Метрики#

В файл с настройками hazelcast_server.yml в раздел "params" добавлен новый параметр, отвечающий за имя приложения - appName.

Так же добавлена новая секция настроек - metrics. Эта секция отвечает за сбор и отправку метрик приложения в Кафку. Доступны следующие параметры:

Наименование

Описание

metricsEnable

Включение/ отключение сбора метрик.

metricsSendPeriodSec

Периодичность отправки метрик, в секундах.

whitelistObjectNames

Список имен объектов для запроса.

blacklistObjectNames

Список имен объектов, которые не нужно запрашивать. Имеет приоритет над whitelistObjectNames. По умолчанию значение равно none.

whitelistAttributeNames

Список имен аттрибутов. Метрики с такими атрибутами будут отправляться, это не регулярное выражение! Необходимо указывать именно имена атрибутов.

Начиная с версии 1.6.1 HazelcastServer отправляет метрики о состоянии кластера.
Они имеют следующий вид: TFS_CLUSTER_NODE_STATUS_ИМЯ_NODE_IN_CLUSTER.
Возможные значения - 0, при выходе node из кластера, 1 при подключении node к кластеру.
Hazelcast отправляет как состояние nodes ТФС, так и свое.
Имя node ТФС - параметр params.tfsName в конфигурационном файле ТФС.
Имя текущего инстанса Hazelcast - параметр params.appName в конфигурационном файле Hazelcast.

Обратите внимание, имя node в метрике может не соответствовать имени node из файла конфигурации. Все символы в имени node, кроме латинских букв и цифр будут заменены на нижнее подчеркивание '_' и приведены к верхнему регистру в метрике. На пример имя node в конфигурационном файле ТФС указано как tfsAlpha(node_23), метрика в таком случае будет иметь название TFS_CLUSTER_NODE_STATUS_TFSALPHA_NODE_23_IN_CLUSTER
Те же правила применяются и к имени экземпляра Hazelcast.

Настройки в файле hazelcast_server_log4j2.xml#

Настройки Кафки, в которую будут отправляться метрики и логи задаются в файле hazelcast_server_log4j2.xml, в блоке Properties:

<Properties>
    <Property name="kafka_bootstrap_server">kafka_bootstrap_server</Property>
    <Property name="kafka_logs_topic">kafka_logs_topic_name</Property>
    <Property name="kafka_logs_appender">kafka_logs_appender</Property>
    <Property name="kafka_metrics_topic">kafka_metrics_topic</Property>
    <Property name="kafka_metrics_appender">kafka_metrics_appender</Property>

    <Property name="kafka_security_protocol">kafka_security_protocol</Property>
    <Property name="kafka_ssl_local_truststore_path">kafka_ssl_local_truststore_path</Property>
    <Property name="kafka_ssl_local_truststore_password">kafka_ssl_local_truststore_password</Property>
    <Property name="kafka_ssl_local_keystore_path">kafka_ssl_local_keystore_path</Property>
    <Property name="kafka_ssl_local_keystore_password">kafka_ssl_local_keystore_password</Property>

    <Property name="kafka_ssl_truststore_vault_secret_key">kafka_ssl_truststore_vault_secret_key</Property>
    <Property name="kafka_ssl_truststore_password_vault_secret_key">kafka_ssl_truststore_password_vault_secret_key
    </Property>
    <Property name="kafka_ssl_keystore_vault_secret_key">kafka_ssl_keystore_vault_secret_key</Property>
    <Property name="kafka_ssl_keystore_password_vault_secret_key">kafka_ssl_keystore_password_vault_secret_key
    </Property>
    <Property name="vault_secrets_update_period_sec">vault_secrets_update_period_sec</Property>

    <Property name="path_to_logs">path_to_logs</Property>
</Properties>

В файле hazelcast_server_log4j2.xml заполняется только блок Properties:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="FATAL" shutdownHook="disable" packages="ru.sber.platformv.synapse.fex.hazelcast.logging">

    <Properties>
        <Property name="kafka_bootstrap_server">
            host1:9093,host2:9093,host3:9093
        </Property>
        <Property name="kafka_logs_topic">fex.logs</Property>
        <Property name="kafka_logs_appender">KafkaLogsAppender</Property>
        <Property name="kafka_metrics_topic">fex.metrics</Property>
        <Property name="kafka_metrics_appender">KafkaMetricsAppender</Property>

        <Property name="kafka_security_protocol">SSL</Property>
        <Property name="kafka_ssl_truststore_path">./resources/truststore.jks</Property>
        <Property name="kafka_ssl_truststore_password">pass</Property>
        <Property name="kafka_ssl_keystore_path">./resources/keystore.jks</Property>
        <Property name="kafka_ssl_keystore_password">pass</Property>

        <Property name="secrets_update_period_sec">60</Property>
        <Property name="kafka_ssl_truststore_secret_key">truststore</Property>
        <Property name="kafka_ssl_truststore_password_secret_key">truststorePassword</Property>
        <Property name="kafka_ssl_keystore_path_secret_key">keystore</Property>
        <Property name="kafka_ssl_keystore_password_secret_key">keystorePassword</Property>

        <Property name="path_to_logs">logs</Property>
    </Properties>
</Configuration>

Наименование

Описание

kafka_bootstrap_server

Cервер Кафки

kafka_logs_topic_name

Topic для логов

kafka_logs_appender

Название appender, выполняющего отправку логов в Кафку

kafka_metrics_topic

Topic для метрик

kafka_metrics_appender

Название appender, выполняющего отправку метрик в Кафку

kafka_security_protocol

Протокол подключения к Кафке (SSL или PLAINTEXT)

kafka_ssl_local_truststore_path

Путь до локального trustStore (используется в случае недоступности Vault или при отсутствии параметров для подключения к нему)

kafka_ssl_local_truststore_password

Пароль для локального trustStore

kafka_ssl_local_keystore_path

Путь до локального keyStore (используется в случае недоступности Vault или при отсутствии параметров для подключения к нему)

kafka_ssl_local_keystore_password

Пароль для локального keyStore

kafka_ssl_truststore_vault_secret_key

Ключ trustore в Vault

kafka_ssl_truststore_password_vault_secret_key

Ключ пароля trustore в Vault

kafka_ssl_keystore_vault_secret_key

Ключ keystore в Vault

kafka_ssl_keystore_password_vault_secret_key

Ключ пароля keystore в Vault

vault_secrets_update_period_sec

Период обновления секретов из Vault в секундах, значение по умолчанию - 120

path_to_logs

Путь до локальных логов

Работа с Vault#

Настройки для доступа к Vault-хранилищу задаются в файле hazelcast_server.yml в разделе secManConfig. В настройках JKS нужно указать наименование секретов.

Фрагмент конфигурации с необходимыми параметрами представлен ниже:

secManConfig:
  address: secManConfig_address
  roleId: secManConfig_roleId
  secretId: secManConfig_secretId
  namespace: secManConfig_namespace
  secretPath: secManConfig_secretPath
  certPath: secManConfig_certPath
  certDirectory: secManConfig_certDirectory
  strategy:
    name: secManConfig_strategy_name
    retryCount: secManConfig_strategy_retryCount
    retryIntervalMls: secManConfig_strategy_retryIntervalMls

jks:
  keyStorePath: jks_keyStorePath
  keyStorePassword: jks_keyStorePassword

Пример заполнения полей для работы с Vault в файле hazelcast_server.yml:

secManConfig:
  address: http://test:8282
  roleId: role-id-9917-d10s2
  secretId: XXXXXXXX
  namespace: DEV_DZO
  certPath: A/DEV/TFSX/KV/HAZELCAST/CERTS
  secretPath: A/DEV/TFSX/KV/HAZELCAST/SECRETS
  certDirectory: resources/secman
  updatePeriodSec: 60
  strategy:
    name: FAIL_SAFE

jks:
  keyStorePath: resources/keystore.jks
  keyStorePassword: pass

Наименование

Описание

address

Сервер, на котором расположен SecMan

roleId

appRole для подключения к SecMan

secretId

Пароль для appRole, или не заполняется, при использовании механизма zero secret.

namespace

Пространство имен секретов (именуемое как тенант)

secretPath

Путь до хранилища паролей в SecMan

certPath

Путь до хранилища сертификатов в SecMan

certDirectory

Путь до локальной директории где будут размещены сертификаты.

trustStoreFile

Путь до файла хранилища доверенных сертификатов. Используется только при подключении к SecMan по SSL / https (если поле address начинается с "https:"). Если значение не задано, используются системные настройки.

keyStoreFile

Путь до файла хранилища ключей при использовании mTLS подключения к SecMan. (Не используется в текущей конфигурации Vault)

keyStorePassword

Пароль хранилища ключей в base64 при использовании mTLS подключения к SecMan. (Не используется в текущей конфигурации Vault)

strategy

Стратегия взаимодействия с Vault, возможные значения перечислены ниже

Стратегии взаимодействия с Vault

  • FAIL_SAFE : Игнорирует ошибки во время работы с Vault. В таком случае используется последнее сохраненное в кэше значение.

  • FAIL_FAST : В случае ошибки при работе с Vault останавливает работу приложения.

    • retryCount - количество попыток подключения к SecMan при использовании FAIL_FAST стратегии

    • retryIntervalMls - интервал, млс. между попытками подключения к SecMan при использовании FAIL_FAST стратегии

Если параметр name не указан явно, используется значение по умолчанию - FAIL_SAFE.

Для использования стратегии FAIL_FAST можно указать параметры retryCount и retryIntervalMls, если они не указаны, используются значения по умолчанию - retryCount=3 и retryIntervalMls=60

secManConfig:
...
 strategy:
   name: FAIL_FAST
   retryCount: 3
   retryIntervalMls: 15

Если используется стратегия FAIL_SAFE, достаточно указать только наименование стратегии или вообще не указывать блок с настройками стратегии (FAIL_SAFE стратегия по умолчанию)

secManConfig:
...
 strategy:
   name: FAIL_SAFE

Для получения сертификатов и постоянной проверки будет запущена задача, которая периодически проверяет состояние хранилища и сверяет с последней актуальной конфигурацией. Если будут выявлены изменения, функционал, который использует данный секрет, будет перезапущен.

Для работы приложения в Vault-пространстве должны быть созданы следующие секреты:

Наименование

Формат

Назначение

keystore

base64

Подключение к Kafka по SSL

keystorePassword

base64

Пароль для keystore

tlsTruststore

base64

Проперти trustStore (см. настройки TLS/mTLS)

tlsTruststorePassword

Обычный текст

Проперти trustStorePassword (см. настройки TLS/mTLS)

tlsKeyStore

base64

Проперти keyStore (см. настройки TLS/mTLS)

tlsKeystorePassword

Обычный текст

Проперти keyStorePassword (см. настройки TLS/mTLS)

В случае отсутствия в конфигурационных файлах настроек для доступа к SecMan или при его недоступности используются локальные хранилища ключей, указанные в соответствующих параметрах.

Механизм инициализации zero secret#

Чтобы исключить хранение secret-id в открытом виде в настроечном файле, следует задействовать механизм zero secret:

  1. Не заполнять поле secManConfig.secretId в настроечном файле hazelcast_server.yml.

  2. В параметрах запуска приложения указать:

  • -Dvault.app-role.secret-id=(зашифрованный ключом secret-id в формате base64)

  • -Dvault.zero-path=(путь до файла с данными ключа шифрования)

Расположение файла с данными ключа шифрования по умолчанию: ./zero или ./resources/zero

Логирование событий#

Пример заполнения полей для настройки логирования и отправки метадаты сертификатов в файле hazelcast_server.yml:

logConfig:
  kafka:
    brokers: test1:9093,test2,test3:9093
    enabledSSL: true
    logStatusTopicName: log_topic
    sslEndpointIdentificationAlgorithm:
    cipherSuites:
    enabledProtocols:
    protocol:
  sendCertsStatus:
    enabled:
    indentOutput:
    timerMin:

Отправка сообщений логирования может производиться в kafka.
За настройки подключений отвечают соответствующие блоки конфигурации.

Kafka:#

  • brokers - список брокеров.

  • isSSL – сервер, на котором расположен менеджер очередей.

  • logStatusTopicName - topic для логирования.

  • sslEndpointIdentificationAlgorithm - ssl-алгоритм, по умолчанию пустая строка "".

  • cipherSuites - набор поддерживаемых шифров. по умолчанию поддерживаются все доступные наборы шифров если параметр пуст или не указан.

  • enabledProtocols - список разрешенных протоколов для SSL-соединений. Список протоколов, разрешенных для SSL-соединений. Значение по умолчанию - TLSv1.2,TLSv1.3 при запуске с Java 11 или новее, TLSv1.2 в другом случае. При значении по умолчанию для Java 11 клиенты и серверы предпочтут TLSv1.3, если оба поддерживают его, и вернутся к TLSv1.2 в другом случае (при условии, что оба поддерживают по крайней мере TLSv1.2). Также смотрите пункт по конфигурации ssl.protocol. Для выбора значения по умолчанию, оставить незаполненным или не указывать параметр.

  • protocol - протокол SSL, используемый для создания SSLContext. По умолчанию используется TLSv1.3 при работе с Java 11 или более новой версией, в другом случае - TLSv1.2. При значении по умолчанию для этого параметра и ssl.enabled.protocols, клиенты понизят версию до TLSv1.2, если сервер не поддерживает TLSv1.3. Для выбора значения по умолчанию, оставить незаполненным или не указывать параметр.

sendCertsStatus#

  • enabled - включает логику формирования метадаты сертификатов используемых модулем для отправки в бд, принимает значения true, false.

  • indentOutput - форматирование JSON для удобства чтения, принимает значения true, false

  • timerMin - интервал запуска проверки и отправки данных по сертификатам, по умолчанию 720 минут.

Схема валидации сообщений#

schemaPath:
  jsonSchema:
  • jsonSchema - путь до файла схемы валидации JSON сообщений.

TLS/mTLS#

Начиная с версии 2.0.0 HazelcastServer поддерживает безопасное подключение между членами кластера - с использованием протокола SSL. Для этого необходимо добавить настройки SSL в блок <network> и установить для параметра enabled значение "true"

    <network>
        ...
        <ssl enabled="true">
            <properties>
                <property name="protocol">TLSv1.3</property>
                <property name="trustStore">./resources/tls_truststore.jks</property>
                <property name="trustStorePassword">password</property>

                <property name="mutualAuthentication">REQUIRED</property>
                <property name="keyStore">./resources/tls_keystore.jks</property>
                <property name="keyStorePassword">password</property>
            </properties>
        </ssl>
        ...
    </network>

Все возможные параметры перечислены в таблице ниже.

Параметр

Описание

protocol

Протокол подключения членов кластера

cipherSuites

Шифры, используемые во время рукопожатия SSL/TLS

mutualAuthentication

Режим работы взаимной аутентификации

trustStore

Путь до хранилища доверенных сертификатов

trustStorePassword

Пароль от хранилища доверенных сертификатов

trustStoreType

Тип хранилища доверенных сертификатов

keyStore

Путь до хранилища сертификатов

keyStorePassword

Пароль от хранилища сертификатов

keyStoreType

Тип хранилища сертификатов

Так же, некоторые параметры имеют значение по умолчанию, применяемое, если параметр не задан.

Параметр

Допустимые значения

Значение по умолчанию

protocol

TLSv1.2,TLSv1.3

TLSv1.3

cipherSuites

Значения, поддерживаемые JVM

Все, поддерживаемые JVM

trustStoreType

JKS, PKCS12

JKS

keyStoreType

JKS, PKCS12

JKS

mutualAuthentication

REQUIRED, OPTIONAL

Пусто

Пояснения к значениям mutualAuthentication:

  • Пустое значение (не задано) - не использовать взаимную аутентификацию

  • REQUIRED - сервер требует доверенный сертификат клиента

  • OPTIONAL - сервер запрашивает сертификат клиента, но не требует его

Параметр cipherSuites задается в формате Шифр_1,Шифр_2,Шифр_3,…
На пример

<property name="cipherSuites">TLS_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA</property>

Указанные шифры должны поддерживаться JRE, на которой запускается приложение, иначе оно не будет запущено, в лог будет выведена ошибка.