Установка 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=60secManConfig: ... 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:
Не заполнять поле secManConfig.secretId в настроечном файле hazelcast_server.yml.
В параметрах запуска приложения указать:
-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, falsetimerMin - интервал запуска проверки и отправки данных по сертификатам, по умолчанию 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, на которой запускается приложение, иначе оно не будет запущено, в лог будет выведена ошибка.