Безопасность и аудит#

Плагин безопасности для 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:

XML#
<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-сертификата узла является обязательной.

Название параметра

Описание

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

Обязательный параметр

nodeLogin

Логин, по которому узел будет подключаться к кластеру

Да

nodePassword

Пароль, по которому узел будет подключаться к кластеру

Да

userDataStore

Путь к файлу с информацией о пользователях, ролях и предоставленных им правах, которые будут автоматически загружены в процессе запуска кластера. Содержимое этого файла должно совпадать на всех узлах кластера (подробнее о формате, в котором задается ролевая модель, написано в подразделе «Формат описания ролевой системы и учетных записей пользователей» раздела «Ролевая модель в DataGrid»)

Обязательный параметр для серверных узлов

selfKeyStorePath

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

Параметры selfKeyStorePath и selfKeyStorePassword или параметр secmanConfig являются обязательными

selfKeyStoreType

Параметр задает тип хранилища личных сертификатов, если задан selfKeyStorePath

JKS

Нет

selfKeyStorePassword

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

Параметры selfKeyStorePath и selfKeyStorePassword или параметр secmanConfig являются обязательными

secmanConfig

Конфигурация подключения к SecMan (подробнее о конфигурации SecMan написано ниже в разделе «SecMan»)

Параметры selfKeyStorePath и selfKeyStorePassword или параметр secmanConfig являются обязательными

trustStorePath

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

Да

trustStorePassword

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

Да

realmConfigurations

Список конфигураций Realms (подробнее о конфигурации Realms написано ниже в разделе «Конфигурация Realms»)

Нет

auditIntegrationConfiguration

Если параметр указан, плагин безопасности будет отправлять события безопасности и общие события DataGrid в подсистему аудита. Сейчас реализованы интеграции с Audit Syslog и Audit UDP Syslog. Чтобы настроить конкретную интеграцию, подставьте в текущий параметр экземпляр конфигурации соответствующего типа (подробнее о конфигурациях аудита написано ниже в разделах «Audit Syslog» и «Audit UDP Syslog»)

Нет

securedJmxServerConfiguration

Если параметр указан, плагин безопасности автоматически запустит JMX-сервер, для которого будут включены протокол TLS, аутентификация подключений и авторизация пользовательских операций (подробнее о конфигурации JMX написано ниже в разделе «JMX»)

Нет

Пример конфигурации плагина безопасности с настройкой личного TLS-сертификата узла с помощью хранилища ключей (keystore)
XML#
<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
XML#
<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:

Название параметра

Описание

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

Обязательный параметр

name

Имя Realm

Да

passwordPolicy

Парольная политика, которой должны соответствовать пароли пользователей данного Realm (подробнее о парольной политике написано ниже в разделе «Парольная политика»)

Нет

authenticatorConfigurations

Список настроек аутентифкаторов, которые будут использоваться для аутентификации подключений пользователей данного Realm. Аутентификаторы будут вызываться в той последовательности, в которой указаны их конфигурации. Поддерживаемые типы аутентификаторов: Simple, Certificate и LDAP (подробнее о конфигурации аутентификаторов написано ниже в разделе «Настройка аутентификаторов»)

Нет

Конфигурация 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>

Парольная политика#

Парольная политика по умолчанию:

  1. Длина пароля: не менее 8 символов.

  2. Минимальное количество уникальных символов: не менее 8.

  3. Пароль должен содержать хотя бы одну букву верхнего регистра.

  4. Пароль должен содержать хотя бы одну букву нижнего регистра.

  5. Пароль должен содержать хотя бы одну цифру.

  6. Пароль должен содержать хотя бы один специальный символ.

  7. Пароль должен состоять из буквенных символов (латиница и кириллица), цифр и специальных символов.

  8. Пароль не должен совпадать с именем пользователя.

  9. Пароль не должен содержать три и более символа, которые расположены подряд на клавиатуре.

Параметры парольной политики:

Название параметра

Описание

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

Обязательный параметр

passwordPolicy

Парольная политика, которой должны соответсвовать пароли пользователей данного Realm

Нет

minimumPasswordLength

Минимальное количество символов в текстовом пароле

8

Нет

XML#
<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 на основе пароля.

XML#
<bean class="com.sbt.security.ignite.core.authenticator.simple.SimpleAuthenticatorConfiguration"/>

Certificate Authenticator#

Аутентификатор проверяет, что логин и DN SSL-сертификата, которые были использованы при подключении, совпадают с параментрами login и distinguishedName, указанными при созданни пользователя.

XML#
<bean class="com.sbt.security.ignite.core.authenticator.certificate.CertificateAuthenticatorConfiguration"/>

LDAP Authenticator#

Делегирует аутентифкацию внешнему LDAP (использует логин и пароль, которые были указаны при подключении). Аутентификатор поддерживает два взаимоисключающих механизма аутентфиикации — simple bind и search+bind.

Шаги алгоритма simple bind:

  1. Формируется DN пользователя с помощью подстановки логина пользователя в dnPattern.

  2. Серверный узел осуществляет bind-операцию на удаленном LDAP-сервере с использованием сформированного DN и пароля пользователя.

Шаги алгоритма search+bind:

  1. Серверный узел осуществляет bind-операцию от имени анонимного пользователя.

  2. В рамках этого подключения выполняется search-операция с использованием фильтра searchFilter.

  3. Серверный узел осуществляет bind-операцию с использованием сформированного найденного DN и пароля пользователя.

Параметры LDAP Authenticator:

Название параметра

Описание

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

Обязательный параметр

addresses

Список адресов для подключения к LDAP-серверам

Да

timeout

Тайм-аут для подключения к LDAP-серверу

10 секунд

Нет

dnPattern

Паттерн DN на основе логина пользователя, который нужен для конфигурации механизма аутентфикации simple bind

Один из парамеров dnPattern/searchFilter является обязательным

searchFilter

Фильтр на основе логина пользователя, который нужен для конфигурации механизма аутентфикации search+bind

Один из парамеров dnPattern/searchFilter является обязательным

sslEnabled

Параметр определяет, будет ли использоваться SSL-протокол при подключении к LDAP-серверу. Если SSL включен, для его конфигурации будут использованы парметры хранилища ключей (keystore) и хранилища доверенных сертификатов (truststore), которые заданы в SecurityPluginConfiguration для локального узла

true

Нет

XML#
<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:

Название параметра

Описание

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

Обязательный параметр

tokenPath

Путь к файлу, в котором хранится токен Wrapped SecMan

Да

endpoint

Адрес SecMan-сервера

Да

namespace

Пространство имен (namespace) SecMan

Да

mountPath

Да

role

Имя роли для доступа к PKI

Да

cn

CN запрашиваемого сертификата

Да

altNames

Альтернативные имена запрашиваемого сертификата

Нет

Конфигурация для подключения к SecMan и получения личного сертификата#
<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:

Название параметра

Описание

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

Обязательный параметр

port

Порт, на котором запустится JMX-сервер

Да

trustStorePath

Путь к файлу хранилища доверенных сертификатов JMX-сервера. Если путь не задан, будет использоваться SecurityPluginConfiguration#trustStorePath

SecurityPluginConfiguration#trustStorePath

Нет

trustStorePassword

Пароль от хранилища доверенных сертификатов JMX-сервера. Если пароль не задан, будет использоваться SecurityPluginConfiguration#trustStorePassword

SecurityPluginConfiguration#trustStorePassword

Нет

remoteAccessFile

Путь к файлу с правами в JMX-формате.

Если путь задан, авторизация операций будет осуществляться с помощью встроенных механизмов JMX.

Если путь не задан, авторизация будет делегироваться плагину безопасности. В этом случае для операций чтения через JMX будет проверяться наличие права ADMIN_VIEW, для операций записи — права ADMIN_OPS.

Исключение: JMX-команды из группы management. Хотя все команды из данной группы — это операции записи, перед их выполнением будет проверяться наличие разрешения соответствующей выполняемой операции. Например, для выполнения операции активации кластера потребуется право ADMIN_CLUSTER_STATE и так далее

Нет

XML#
<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:

Название параметра

Описание

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

Обязательный параметр

sourceSystemName

Имя автоматизированной системы

IgniteSE

Нет

moduleName

Имя кластера

IgniteSE

Нет

nodeName

Имя узла

Имя хоста, на котором запущен узел

Нет

XML#
<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:

Название параметра

Описание

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

Обязательный параметр

sourceSystemName

Имя автоматизированной системы

IgniteSE

Нет

moduleName

Имя кластера

IgniteSE

Нет

nodeName

Имя узла

Имя хоста, на котором запущен узел

Нет

host

Имя хоста удаленного сервера syslog, к которому будет выполнено подключение

Да

port

Порт удаленного сервера syslog, к которому будет выполнено подключение

Да

facility

Параметр syslog facility

LOCAL3

Нет

severity

Параметр syslog level

INFORMATIONAL

Нет

XML#
<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#

Java#
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#

Пример создания подключения:

Java#
 // Зарегистрируйте 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 и подключитесь.