Безопасность и аудит#
Плагин безопасности для DataGrid#
Подробнее о командах плагина безопасности написано в подразделе «Команды плагина безопасности» раздела «Утилита control».
Подготовка сертификатов пользователей#
Порядок создания и подписи сертификатов зависит от внутренних процессов в организации.
Конфигурация плагина безопасности#
Добавление плагина безопасности в конфигурацию включает аутентификацию подключений, авторизацию пользовательских операций и автоматическую настройку TLS для всех видов подключения к кластеру.
Важно
При автоматической конфигурации TLS узлы DataGrid обмениваются данными между собой (Discovery, Communication) с помощью TLS с набором шифров WITH_NULL. Соответствующие наборы шифров (в названиях присутствует фрагмент WITH_NULL) по умолчанию отключены в JVM. Чтобы избежать плохо диагностируемых ошибок при подтверждении подключения (handshake) TLS, включите эти шифры явно: уберите значение NULL из параметра jdk.tls.disabledAlgorithms файла lib/security/java.security в JRE (важно: это может повлечь существенное падение производительности).
Для конфигурации плагина безопасности добавте экземпляр com.sbt.security.ignite.core.SecurityPluginProvider в список настраиваемых плагинов DataGrid. Для этого используйте параметр pluginProviders класса IgniteConfiguration:
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="pluginProviders">
<list>
<bean class="com.sbt.security.ignite.core.SecurityPluginProvider">
<constructor-arg ref="securityPluginConfiguration"/>
</bean>
</list>
</property>
</bean>
Конфигурация плагина безопасности осуществляется с помощью класса SecurityPluginConfiguration.
Параметры плагина безопасности:
Важно
Личный TLS-сертификат узла можно настроить двумя взаимоисключающими способами:
передать путь к файлу хранилища ключей (
keystore) и пароль от него (параметрыselfKeyStorePathиselfKeyStorePassword);передать конфигурацию подключения к внешнему хранилищу сертификатов — SecMan, из которого будет автоматически загружен сертификат (параметр
secmanConfig).
Настройка личного TLS-сертификата узла является обязательной.
Название параметра |
Описание |
Значение по умолчанию |
Обязательный параметр |
|---|---|---|---|
|
Логин, по которому узел будет подключаться к кластеру |
— |
Да |
|
Пароль, по которому узел будет подключаться к кластеру |
— |
Да |
|
Путь к файлу с информацией о пользователях, ролях и предоставленных им правах, которые будут автоматически загружены в процессе запуска кластера. Содержимое этого файла должно совпадать на всех узлах кластера (подробнее о формате, в котором задается ролевая модель, написано в подразделе «Формат описания ролевой системы и учетных записей пользователей» раздела «Ролевая модель в DataGrid») |
— |
Обязательный параметр для серверных узлов |
|
Путь к файлу хранилища личных сертификатов |
— |
Параметры |
|
Параметр задает тип хранилища личных сертификатов, если задан |
|
Нет |
|
Пароль от хранилища личных сертификатов |
— |
Параметры |
|
Конфигурация подключения к SecMan (подробнее о конфигурации SecMan написано ниже в разделе «SecMan») |
— |
Параметры |
|
Путь к файлу хранилища доверенных сертификатов |
— |
Да |
|
Пароль от хранилища доверенных сертификатов |
— |
Да |
|
Список конфигураций Realms (подробнее о конфигурации Realms написано ниже в разделе «Конфигурация Realms») |
— |
Нет |
|
Если параметр указан, плагин безопасности будет отправлять события безопасности и общие события DataGrid в подсистему аудита. Сейчас реализованы интеграции с Audit Syslog и Audit UDP Syslog. Чтобы настроить конкретную интеграцию, подставьте в текущий параметр экземпляр конфигурации соответствующего типа (подробнее о конфигурациях аудита написано ниже в разделах «Audit Syslog» и «Audit UDP Syslog») |
— |
Нет |
|
Если параметр указан, плагин безопасности автоматически запустит JMX-сервер, для которого будут включены протокол TLS, аутентификация подключений и авторизация пользовательских операций (подробнее о конфигурации JMX написано ниже в разделе «JMX») |
— |
Нет |
Пример конфигурации плагина безопасности с настройкой личного TLS-сертификата узла с помощью хранилища ключей (keystore)
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="pluginProviders">
<list>
<bean class="com.sbt.security.ignite.core.SecurityPluginProvider">
<constructor-arg ref="securityPluginConfiguration"/>
</bean>
</list>
</property>
</bean>
<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
<property name="nodeLogin" value="node-login"/>
<property name="nodePassword" value="node-password"/>
<property name="userDataStore" value="path/to/security-data/file"/>
<property name="selfKeyStorePath" value="path/to/key-store/file"/>
<property name="selfKeyStoreType" value="JKS"/>
<property name="selfKeyStorePassword" value="key-store-password"/>
<property name="trustStorePath" value="path/to/trust-store/file"/>
<property name="trustStorePassword" value="trust-store-password"/>
<property name="realmConfigurations">
<list>
<ref bean="realm-configuration"/>,
...
</list>
</property>
<property name="auditIntegrationConfiguration" ref="audit-intefration-configuration-bean"/>
<property name="securedJmxServerConfiguration" ref="secured-jmx-server-configuration-bean"/>
</bean>
Пример конфигурации плагина безопасности с настройкой личного TLS-сертификата узла с помощью SecMan
<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="pluginProviders">
<list>
<bean class="com.sbt.security.ignite.core.SecurityPluginProvider">
<constructor-arg ref="securityPluginConfiguration"/>
</bean>
</list>
</property>
</bean>
<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
<property name="nodeLogin" value="node-login"/>
<property name="nodePassword" value="node-password"/>
<property name="userDataStore" value="path/to/security-data/file"/>
<property name="secmanConfig" ref="secman-configuration-bean"/>
<property name="trustStorePath" value="path/to/trust-store/file"/>
<property name="trustStorePassword" value="trust-store-password"/>
<property name="realmConfigurations">
<list>
<ref bean="realm-configuration"/>,
...
</list>
</property>
<property name="auditIntegrationConfiguration" ref="audit-intefration-configuration-bean"/>
<property name="securedJmxServerConfiguration" ref="secured-jmx-server-configuration-bean"/>
</bean>
Конфигурация Realms#
Realms позволяют разделить пользователей на группы и установить для каждой группы набор параметров, который будет учитываться во время выполнения проверок безопасности. Каждый пользователь может быть в составе только одного Realm. При создании пользователя можно указать имя настроенного Realm, которому будет принадлежать данный пользователь. Если при создании Realm не указан, пользователь будет добавлен в Realm с именем default. Если Realm с именем default не настроен явно, он будет создан автоматически.
Параметры конфигурации Realms:
Название параметра |
Описание |
Значение по умолчанию |
Обязательный параметр |
|---|---|---|---|
|
Имя Realm |
— |
Да |
|
Парольная политика, которой должны соответствовать пароли пользователей данного Realm (подробнее о парольной политике написано ниже в разделе «Парольная политика») |
— |
Нет |
|
Список настроек аутентифкаторов, которые будут использоваться для аутентификации подключений пользователей данного Realm. Аутентификаторы будут вызываться в той последовательности, в которой указаны их конфигурации. Поддерживаемые типы аутентификаторов: |
— |
Нет |
<bean class="com.sbt.security.ignite.core.realm.RealmConfiguration">
<property name="name" value="default"/>
<property name="passwordPolicy">
<bean class="com.sbt.security.ignite.core.PasswordPolicy">
<property name="minimumPasswordLength" value="8"/>
</bean>
</property>
<property name="authenticatorConfigurations">
<list>
<bean class="com.sbt.security.ignite.core.authenticator.simple.SimpleAuthenticatorConfiguration"/>
<bean class="com.sbt.security.ignite.core.authenticator.certificate.CertificateAuthenticatorConfiguration"/>
</list>
</property>
</bean>
<bean id="realm-configuration" class="com.sbt.security.ignite.core.realm.RealmConfiguration">
<property name="name" value="realm-name"/> -->
<property name="passwordPolicy" ref="password-poicy-bean"/>
<property name="authenticatorConfigurations">
<list>
<ref bean="authentiator-configuration-bean"/>
</list>
</property>
</bean>
Парольная политика#
Парольная политика по умолчанию:
Длина пароля: не менее 8 символов.
Минимальное количество уникальных символов: не менее 8.
Пароль должен содержать хотя бы одну букву верхнего регистра.
Пароль должен содержать хотя бы одну букву нижнего регистра.
Пароль должен содержать хотя бы одну цифру.
Пароль должен содержать хотя бы один специальный символ.
Пароль должен состоять из буквенных символов (латиница и кириллица), цифр и специальных символов.
Пароль не должен совпадать с именем пользователя.
Пароль не должен содержать три и более символа, которые расположены подряд на клавиатуре.
Параметры парольной политики:
Название параметра |
Описание |
Значение по умолчанию |
Обязательный параметр |
|---|---|---|---|
|
Парольная политика, которой должны соответсвовать пароли пользователей данного Realm |
— |
Нет |
|
Минимальное количество символов в текстовом пароле |
|
Нет |
<bean id="realm-configuration" class="com.sbt.security.ignite.core.realm.RealmConfiguration">
<property name="passwordPolicy">
<bean class="com.sbt.security.ignite.core.PasswordPolicy">
<property name="minimumPasswordLength" value="10"/>
</bean>
</property>
</bean>
Настройка аутентификаторов#
Simple Authenticator#
Аутентификатор проверяет, что логин и пароль пользователя, которые были переданы при подключении, соответствуют параметрам login и secret, указанным при создании пользователя. Проверка осуществляется с помощью сравнения ключей, которые сформированы алгоритмом PBKDF2WithHmacSHA512 на основе пароля.
<bean class="com.sbt.security.ignite.core.authenticator.simple.SimpleAuthenticatorConfiguration"/>
Certificate Authenticator#
Аутентификатор проверяет, что логин и DN SSL-сертификата, которые были использованы при подключении, совпадают с параментрами login и distinguishedName, указанными при созданни пользователя.
<bean class="com.sbt.security.ignite.core.authenticator.certificate.CertificateAuthenticatorConfiguration"/>
LDAP Authenticator#
Делегирует аутентифкацию внешнему LDAP (использует логин и пароль, которые были указаны при подключении). Аутентификатор поддерживает два взаимоисключающих механизма аутентфиикации — simple bind и search+bind.
Шаги алгоритма simple bind:
Формируется DN пользователя с помощью подстановки логина пользователя в
dnPattern.Серверный узел осуществляет bind-операцию на удаленном LDAP-сервере с использованием сформированного DN и пароля пользователя.
Шаги алгоритма search+bind:
Серверный узел осуществляет bind-операцию от имени анонимного пользователя.
В рамках этого подключения выполняется search-операция с использованием фильтра
searchFilter.Серверный узел осуществляет bind-операцию с использованием сформированного найденного DN и пароля пользователя.
Параметры LDAP Authenticator:
Название параметра |
Описание |
Значение по умолчанию |
Обязательный параметр |
|---|---|---|---|
|
Список адресов для подключения к LDAP-серверам |
— |
Да |
|
Тайм-аут для подключения к LDAP-серверу |
10 секунд |
Нет |
|
Паттерн DN на основе логина пользователя, который нужен для конфигурации механизма аутентфикации |
— |
Один из парамеров |
|
Фильтр на основе логина пользователя, который нужен для конфигурации механизма аутентфикации |
— |
Один из парамеров |
|
Параметр определяет, будет ли использоваться SSL-протокол при подключении к LDAP-серверу. Если SSL включен, для его конфигурации будут использованы парметры хранилища ключей ( |
|
Нет |
<bean class="com.sbt.ignite.security.ldap.LdapAuthenticatorConfiguration">
<property name="addresses">
<list>
<value>{host}:{port}</value>
</list>
</property>
<property name="timeout" value="10000"/>
<property name="dnPattern" value="cn={0},ou=users,dc=sbt,dc=com/">
<property name="searchFilter" value="(cn={0})"/>
<property name="sslEnabled" value="true"/>
</bean>
SecMan#
Параметры конфигурации для подключения к SecMan:
Название параметра |
Описание |
Значение по умолчанию |
Обязательный параметр |
|---|---|---|---|
|
Путь к файлу, в котором хранится токен Wrapped SecMan |
— |
Да |
|
Адрес SecMan-сервера |
— |
Да |
|
Пространство имен (namespace) SecMan |
— |
Да |
|
— |
— |
Да |
|
Имя роли для доступа к PKI |
— |
Да |
|
CN запрашиваемого сертификата |
— |
Да |
|
Альтернативные имена запрашиваемого сертификата |
— |
Нет |
<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
<property name="secmanConfig">
<bean class="ru.sbrf.kafka.secman.SecmanConfig">
<property name="tokenPath" value="path/to/token/file"/>
<property name="endpoint" value="https://host:port"/>
<property name="namespace" value="namespace"/>
<property name="fetchConfig">
<bean class="ru.sbrf.kafka.secman.SecmanFetchCertificateConfig">
<property name="mountPath" value="PKI"/>
<property name="role" value="role"/>
<property name="cn" value="certificate-common-name"/>
<property name="altNames" value="certificate-alt-name"/>
</bean>
</property>
</bean>
</property>
</bean>
JMX#
В качестве хранилища ключей (keystore) для конфигурации TLS используется личный сертификат узла. Подробнее об этом написано выше в разделах «Конфигурация плагина безопасности» и «SecMan».
Параметры конфигурации JMX:
Название параметра |
Описание |
Значение по умолчанию |
Обязательный параметр |
|---|---|---|---|
|
Порт, на котором запустится JMX-сервер |
— |
Да |
|
Путь к файлу хранилища доверенных сертификатов JMX-сервера. Если путь не задан, будет использоваться |
|
Нет |
|
Пароль от хранилища доверенных сертификатов JMX-сервера. Если пароль не задан, будет использоваться |
|
Нет |
|
Путь к файлу с правами в JMX-формате. |
— |
Нет |
<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
<property name="securedJmxServerConfiguration">
<bean class="com.sbt.security.ignite.core.jmx.SecuredJmxServerConfiguration">
<property name="port" value="3000"/>
<property name="trustStorePath" value="/path/to/trust-store/file"/>
<property name="trustStorePassword" value="trust-store-password"/>
<property name="remoteAccessFile" value="/path/to/remote-access/file"/>
</bean>
</property>
</bean>
Настройка аудита событий DataGrid#
Audit Syslog#
События будут отправляться в syslog, который развернут на локальном хосте.
Параметры конфигурации Audit Syslog:
Название параметра |
Описание |
Значение по умолчанию |
Обязательный параметр |
|---|---|---|---|
|
Имя автоматизированной системы |
|
Нет |
|
Имя кластера |
|
Нет |
|
Имя узла |
Имя хоста, на котором запущен узел |
Нет |
<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
<property name="auditIntegrationConfiguration">
<bean class="com.sbt.security.ignite.integration.audit.syslog.SyslogIntegrationConfiguration">
<property name="sourceSystemName" value="source-system-name"/>
<property name="moduleName" value="module-name"/>
<property name="nodeName" value="node-name"/>
</bean>
</property>
</bean>
Audit UDP Syslog#
События будут отправляться в syslog, который развернут на удаленном хосте.
Параметры конфигурации Audit UDP Syslog:
Название параметра |
Описание |
Значение по умолчанию |
Обязательный параметр |
|---|---|---|---|
|
Имя автоматизированной системы |
|
Нет |
|
Имя кластера |
|
Нет |
|
Имя узла |
Имя хоста, на котором запущен узел |
Нет |
|
Имя хоста удаленного сервера syslog, к которому будет выполнено подключение |
— |
Да |
|
Порт удаленного сервера syslog, к которому будет выполнено подключение |
— |
Да |
|
Параметр syslog |
|
Нет |
|
Параметр syslog |
|
Нет |
<bean id="securityPluginConfiguration" class="com.sbt.security.ignite.core.SecurityPluginConfiguration">
<property name="auditIntegrationConfiguration">
<bean class="com.sbt.security.ignite.integration.audit.syslog.UdpSyslogIntegrationConfiguration">
<property name="sourceSystemName" value="source-system-name"/>
<property name="moduleName" value="module-name"/>
<property name="nodeName" value="node-name"/>
<property name="host" value="host-name"/>
<property name="port" value="8000"/>
<property name="facility" value="facility"/>
<property name="severity" value="severity"/>
</bean>
</property>
</bean>
Конфигурация клиентов для подлючения к кластеру с включенной безопасностью#
IgniteClient#
SslContextFactory sslCtxFactory = new SslContextFactory();
sslCtxFactory.setKeyStoreFilePath("path/to/keystore");
sslCtxFactory.setKeyStorePassword("keystore-password");
sslCtxFactory.setTrustStoreFilePath("path/to/truststore");
sslCtxFactory.setTrustStorePassword("truststore-password");
ClientConfiguration cfg = new ClientConfiguration()
.setSslMode(REQUIRED)
.setSslContextFactory(sslCtxFactory);
.setUserName("myLogin")
.setUserPassword("myPassword")
JDBC#
Пример создания подключения:
// Зарегистрируйте JDBC-драйвер.
Class.forName("org.apache.ignite.IgniteJdbcDriver");
Connection conn = DriverManager.getConnection("jdbc:ignite:thin://xxx.x.x.x/?"
+ "sslMode=require"
+ "&user=" + login
+ "&password=" + pwd
+ "&sslClientCertificateKeyStoreUrl=" + keyStorePath
+ "&sslClientCertificateKeyStorePassword=" + keyStorePassword
+ "&sslClientCertificateKeyStoreType=" + "jks"
+ "&sslTrustCertificateKeyStoreUrl=" + trustStorePath
+ "&sslTrustCertificateKeyStorePassword=" + trustStorePassword
+ "&sslTrustCertificateKeyStoreType=" + "jks");
JConsole#
Для запуска jconsole выполните:
jconsole \
-J-Djavax.net.ssl.keyStore=/path/to/admin/keystore.jks \
-J-Djavax.net.ssl.keyStorePassword=password \
-J-Djavax.net.ssl.trustStore=/path/to/your-truststore.jks \
-J-Djavax.net.ssl.trustStorePassword=password
Затем заполните поля Remote Process (="host:port"), Username, Password и подключитесь.