Руководство по установке#
В руководстве приведены инструкции по установке компонента Поисковый движок (SRHX) продукта Platform V Search (SRH).
Расшифровку основных понятий смотрите в перечне Термины и определения.
Системные требования#
Настройки безопасности окружения и перечень платформенных (дополнительных внешних) продуктов, используемых для установки, настройки и контроля в конечной информационной системе (далее — ИС), выбираются при разработке конечной ИС, исходя из характера обрабатываемой в ней информации и иных требований информационной безопасности (далее — ИБ), предъявляемых к ней.
Системное программное обеспечение#
Ниже представлены категории системного программного обеспечения (далее — ПО), которые обязательны или опциональны для установки, настройки, контроля и функционирования компонента SRHX. В каждой категории перечислены все поддерживаемые продукты сторонних правообладателей. Отдельно обозначены варианты, которые рекомендует АО «СберТех» (маркировка «Рекомендовано» в столбце «Продукт, функциональная совместимость с которым подтверждена»). Клиенту необходимо выбрать один из продуктов в каждой категории, исходя из условий использования конечной ИС.
Категория ПО |
Обязательность установки* |
Наименование ПО |
Версия |
Продукт, функциональная совместимость с которым подтверждена** |
Описание |
|---|---|---|---|---|---|
Операционная система |
Да |
ОС Альт 8 СП |
9 и выше |
Опционально. Правообладателем АО «СберТех» также рекомендован компонент Операционная система INST продукта Platform V SberLinux OS Server SLO, см. раздел «Платформенные зависимости» |
Среда для запуска модулей компонента |
Red Hat Enterprise Linux |
8.8.1 и выше |
Опционально. Правообладателем АО «СберТех» также рекомендован компонент Операционная система INST продукта Platform V SberLinux OS Server SLO, см. раздел «Платформенные зависимости» |
Среда для запуска модулей компонента |
||
Среда контейнеризации |
Да |
Kubernetes |
1.26 и выше |
Опционально. Правообладателем АО «СберТех» также рекомендован компонент K8S Core K8SC продукта Platform V DropApp, см. раздел «Платформенные зависимости» |
Платформа контейнеризации для запуска компонентов сервиса |
Java-машина |
Да |
OpenJDK |
17.0.12.0.7-2 и выше до потери обратной совместимости (в рамках 17 версии) |
Рекомендовано |
Окружение для работы модулей компонента |
Программная платформа |
Да |
NodeJS |
18.20.4-1 и выше до потери обратной совместимости (в рамках 18 версии) |
Рекомендовано |
Среда выполнения JS |
Система управления доступом к информационным ресурсам |
Нет |
СУДИР |
любая актуальная версия |
Опционально. Правообладателем АО «СберТех» также рекомендован компонент IAM Proxy продукта Platform V IAM SE, см. раздел «Платформенные зависимости» |
Сервис управления доступом и информационными ресурсами |
Брокер сообщений |
Нет |
Kafka |
3.4.1 и выше |
Опционально. Правообладателем АО «СберТех» также рекомендован брокер сообщений, основанный на Kafka, – Platform V Corax, см. раздел «Платформенные зависимости» |
Событийный обмен сообщениями между модулями компонента |
Система создания, хранения и распространения секретов |
Нет |
HashiCorp Vault |
1.15.0 и выше |
Опционально |
Система, обеспечивающая безопасный и надежный способ создания, хранения и распространения секретов |
Secret Management System |
1.16.1 и выше до потери обратной совместимости |
Опционально |
Система управления аутентификационными данными сервисных аккаунтов или учетных записей |
||
Браузер |
Да |
Яндекс Браузер |
19.1.3.281 и выше |
Рекомендовано |
Браузер для входа в UI |
Сервис интеграции и оркестрации микросервисов в облаке |
Да |
Istio |
1.12 и выше |
Опционально. Правообладателем АО «СберТех» также рекомендован компонент Platform V Synapse Service Mesh, см. раздел «Платформенные зависимости» |
ISTIO - это платформа для управления трафиком и обеспечения безопасности микросервисных приложений |
Примечание
*
Да — категория ПО обязательна для функционирования сервиса (это означает, что сервис не может выполнять свои базовые функции без установки данной категории ПО).
Нет — категория ПО необязательна для функционирования сервиса (это означает, что сервис может выполнять свои базовые функции без установки данной категории ПО).
**
Рекомендовано — рекомендованный правообладателем АО «СберТех» продукт.
Опционально — альтернативный по отношению к рекомендованному правообладателем АО «СберТех» продукт.
Платформенные зависимости#
Для настройки, контроля и функционирования компонента реализована интеграция с программными продуктами, правообладателем которых является АО «СберТех»:
Наименование продукта |
Код |
Версия |
Код и наименование компонента |
Обязательность установки (да/нет) |
Описание |
Аналог других производителей |
|---|---|---|---|---|---|---|
Platform V IAM SE |
IAM |
1.8.12 и выше до потери обратной совместимости |
AUTH IAM Proxy |
Нет |
Сервис управления доступом и информационными ресурсами |
СУДИР |
Platform V SberLinux OS Server |
SLO |
9.4.2 и выше до потери обратной совместимости |
INST Операционная система |
Да |
Операционная система на базе ядра Linux для запуска контейнеризированных приложений |
Red Hat Enterprise Linux, ОС Альт 8 СП |
Platform V Corax |
KFK |
10.340.2 и выше до потери обратной совместимости |
KFKA Corax |
Нет |
Программный брокер сообщений, представляющий собой распределенную, отказоустойчивую, реплицированную и легко масштабируемую систему передачи сообщений, рассчитанную на высокую пропускную способность. Данная инсталляция Platform V Corax не входит в состав компонента SRHX, принадлежит провайдеру аудита и необходима для передачи событий аудита. Если нет необходимости в передачи событий провайдеру аудита, то настройка взаимодействия с инсталляцией Platform V Corax не требуется. При необходимости передачи данных из Kafka (Platform V Corax) в компонент Поисковый движок (SRHX) используйте сервис DataPrepper, доступный в дистрибутиве компонента SRHX. |
Kafka |
Platform V DropApp |
K8S |
2.1.0 и выше до потери обратной совместимости |
K8SC K8S Core |
Да |
Дистрибутив Kubernetes со встроенными механизмами мультитенантности и бессерверным исполнением |
Kubernetes |
Platform V Synapse Service Mesh |
SSM |
4.3 и выше до потери обратной совметимости |
IGEG Граничный и сервисный прокси |
Да |
Synapse Service Mesh предназначен для установки и подключения к namespace (проекту) |
Istio |
Примечание
***
Да — компонент или продукт необходим для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данного компонента).
Нет — необязательный для функционирования сервиса компонент или продукт (это означает, что сервис может выполнять свои основные функции без установки данного компонента).
**** Рекомендуется установка программного продукта, правообладателем которого является АО «СберТех», при этом не исключена возможность (допускается правообладателем) использования аналога других производителей. Аналоги, в отношении которых продукт успешно прошел испытания и подтвердил свою работоспособность, указаны в разделе «Системное программное обеспечение».
Аппаратные требования#
Расчет потребности в физическом оборудовании происходит на основе коэффициентов повторной подписки, применяемых к требованиям по виртуальным ресурсам для каждого из стендов.
Для установки компонента требуется следующая конфигурация аппаратного обеспечения:
Название компонента |
ПО среды функционирования |
Количество |
CPU (кол-во ядер) |
ОЗУ (ГБ) |
Внутренние диски (ГБ) |
Горизонтальное масштабирование |
|---|---|---|---|---|---|---|
SRHX |
x86_vm |
3 node |
16 |
64 |
200 |
Да |
Требования к окружению для установки программного компонента#
Компонент SRHX не выдвигает требований к настройкам безопасности окружения.
Состав дистрибутива#
Элемент дистрибутива |
Описание |
|---|---|
Search-server |
Компонент SRHX, управляемый посредством REST |
Search-dashboard |
Компонент серверной части, отвечающий за аутентификацию |
Search-healthcheck |
Проверка работоспособности компонента SRHX |
Search-notifications |
Управление уведомлениями от плагинов компонента SRHX |
Search-security |
Безопасность, шифрование и авторизация компонента SRHX |
Search-index-management |
Автоматизация действия по управлению индексами |
Search-job-scheduler |
Создание расписаний для общих задач, выполняемых в кластере |
Search-Prometheus-exporter |
Сбор и отправка метрик в формате prometheus |
Search-audit |
Сбор и отправка событий аудита |
Search-sql |
Плагин, позволяющий использовать SQL синтаксис |
Search-queryWorkbenchDashboards |
Плагин, позволяющий использовать SQL синтаксис в Dashboards |
Search-KNN |
Плагин, позволяющий использовать векторный поиск |
Search-custom-codecs |
Плагин добавляет пользовательские кодеки для кодирования индексов на диске |
Выбор способа установки#
Единственным и целевым способом установки является ручной способ.
Подготовка окружения#
Создание пользователей на сервере#
Создайте пользователей:
opensearch – для сервера opensearch;
opensearch-dashboards – для сервера opensearch-dashboards, в том случае, если он будет устанавливаться на данном сервере.
Добавьте созданных пользователей в необходимые группы.
Ниже представлен пример, когда пользователи созданы с таким же паролем, как и их имя. Возможно изменить значения после
passwd -1на необходимые:sudo useradd -p $(openssl passwd -1 opensearch) opensearch sudo useradd -p $(openssl passwd -1 opensearch-dashboards) opensearch-dashboards sudo usermod -aG opensearch-dashboards opensearch sudo usermod -aG opensearch opensearch-dashboards
Установка java#
Установите последнюю доступную в репозитории Java 17. Удалите директорию /usr/share/opensearch/jdk, если существует. Выполните symlink из /etc/alternatives/jre в /usr/share/opensearch/jdk.
ln -s /etc/alternatives/jre /usr/share/opensearch/jdk
Добавление переменных для работы компонента SRHX#
Пропишите системные переменные в файл
.bashrc. Переменные пользователей, под которыми будет выполнен запуск компонента SRHX:
OPENSEARCH_JAVA_HOME;OPENSEARCH_PATH_CONF;OSD_PATH_CONF.
Примените обновленный файл командой
source.Ниже описан алгоритм для пользователей opensearch и opensearch-dashboards:
sudo sh -c "echo -e 'export OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk\nexport OPENSEARCH_PATH_CONF=/etc/opensearch\nexport OSD_PATH_CONF=/etc/opensearch-dashboards' >> /home/opensearch/.bashrc && source /home/opensearch/.bashrc" sudo sh -c "echo -e 'export OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk\nexport OPENSEARCH_PATH_CONF=/etc/opensearch\nexport OSD_PATH_CONF=/etc/opensearch-dashboards' >> /home/opensearch-dashboards/.bashrc && source /home/opensearch-dashboards/.bashrc"OPENSEARCH_JAVA_HOME – путь до JAVA, который будет использовать компонент SRHX. При использовании JAVA вместе с дистрибутивом, заранее укажите путь, где будет находиться Java, после распаковки дистрибутива.
OPENSEARCH_PATH_CONF и OSD_PATH_CONF – пути до каталога с конфигурационными файлами для сервера opensearch-dashboards.
Изменение параметров компонента SRHX#
Установите значение системных параметров
vm.max_map_count = 262144иvm.swappiness=0в файле/etc/sysctl.conf.Примените обновленные значения командой
sysctl -p.Отключите использование swap:
sudo swapoff -a sudo sh -c "echo -e 'vm.swappiness=0\nvm.max_map_count=262144' >> /etc/sysctl.conf && sysctl -p"
Внимание!
Обязательно проверьте значения в данном файле. Если они уже присутствуют, то их необходимо изменить вручную. После применения команды, указанной выше, произойдет дублирование параметров, если они уже существуют. Команда
swapoff -aработает только до перезагрузки.
Проверьте текущее значение или примененные изменения командой:
cat /proc/sys/vm/max_map_count
Изменение лимитов пользователей#
Повысьте лимиты для пользователей, которые будут выполнять запуск компонента SRHX. Это позволит в дальнейшем запускать программы вручную и не получать ошибки от компонента SRHX.
Создайте файлы
/etc/security/limits.d/opensearch.confи/etc/security/limits.d/opensearch-dashboards.confи внесите в них данные, используя следующие команды:#для создания файлов /etc/security/limits.d/opensearch.conf , /etc/security/limits.d/opensearch-dashboards.conf и установки лимитов SRHX sudo sh -c "echo -e 'opensearch - nproc 65535\nopensearch - nofile 500000\nopensearch - memlock unlimited' >> /etc/security/limits.d/opensearch.conf" sudo sh -c "echo -e 'opensearch-dashboards - nproc 8096\nopensearch-dashboards - nofile 8096' >> /etc/security/limits.d/opensearch-dashboards.conf"После исполнения команд файлы должны иметь вид:
#для /etc/security/limits.d/opensearch.conf opensearch - nofile 500000 opensearch - nproc 65535 opensearch - memlock unlimited #для /etc/security/limits.d/opensearch-dashboards.conf opensearch-dashboards - nofile 8096 opensearch-dashboards - nproc 8096Проверьте, что параметр для пользователя задан верно и его значение равно установленному в предыдущем пункте. Проверка возможна только под пользователем, для которого применяли значение:
sudo su opensearch -c 'ulimit -u -n -l' sudo su opensearch-dashboards -c 'ulimit -u -n'Посмотрите полный список лимитов:
sudo su opensearch -c 'ulimit -a' sudo su opensearch-dashboards -c 'ulimit -a'
Создание необходимых директорий#
Создайте необходимые директории для распаковки дистрибутива:
sudo mkdir /usr/share/opensearch \
sudo mkdir -p /etc/opensearch/secman/certs \
sudo mkdir /etc/opensearch/usertoken \
sudo mkdir /var/log/opensearch \
sudo mkdir /var/lib/opensearch
#если на данную виртуальную машину устанавливается opensearch-dashboards
sudo mkdir /usr/share/opensearch-dashboards \
sudo mkdir -p /etc/opensearch-dashboards/secman/certs \
sudo mkdir /etc/opensearch-dashboards/usertoken \
sudo mkdir /var/log/opensearch-dashboards
Подробное описание директорий
Название |
Описание |
|---|---|
/usr/share/opensearch |
Директория, куда будет установлен компонент SRHX |
/etc/opensearch |
Директория, где будут размещены конфигурационные файлы компонента SRHX |
/var/log/opensearch |
Директория для хранения логов компонента SRHX, которую нужно указать в настройках |
/var/lib/opensearch |
Директория для данных кластера, которую нужно указать в настройках |
/etc/opensearch/secman/certs |
Директория, где будут храниться зашифрованные JKS-архивы с сертификатами, получаемые из Secret Management System |
/etc/opensearch/usertoken |
Директория для перекладки wrapped-токена компонента SRHX |
/usr/share/opensearch-dashboards |
Директория, куда будет установлен |
/etc/opensearch-dashboards |
Директория, где будут размещены конфигурационные файлы |
/var/log/opensearch-dashboards |
Директория для хранения логов |
/etc/opensearch-dashboards/secman/certs |
Директория, где будут храниться зашифрованные JKS-архивы с сертификатами Dashboards, получаемые из Secret Management System |
/etc/opensearch-dashboards/usertoken |
Директория для перекладки wrapped-токена Dashboards |
Создайте пустые файлы для переменных компонента SRHX, которые он считывает при запуске. Ссылаться на эти файлы нужно в Unit service:
sudo touch /etc/sysconfig/opensearch
#если на данную виртуальную машину устанавливается opensearch-dashboards
sudo touch /etc/sysconfig/opensearch-dashboards
Повышение привилегий пользователя#
Выдайте права пользователю opensearch на управление unit-сервисом, который будет создан далее.
Примечание
Это может понадобиться только для удобства работы под пользователем
opensearch.
sudo nano /etc/sudoers.d/opensearch
Добавьте:
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl start opensearch.service, /bin/systemctl start opensearch
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl restart opensearch.service, /bin/systemctl restart opensearch
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl stop opensearch.service, /bin/systemctl stop opensearch
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl enable opensearch.service, /bin/systemctl enable opensearch
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl disable opensearch.service, /bin/systemctl disable opensearch
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl start opensearch-dashboards.service, /bin/systemctl start opensearch-dashboards
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl restart opensearch-dashboards.service, /bin/systemctl restart opensearch-dashboards
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl stop opensearch-dashboards.service, /bin/systemctl stop opensearch-dashboards
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl enable opensearch-dashboards.service, /bin/systemctl enable opensearch-dashboards
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl disable opensearch-dashboards.service, /bin/systemctl disable opensearch-dashboards
opensearch ALL=(ALL) NOPASSWD: /bin/systemctl daemon-reload
Необходимый софт на сервере#
Внимание!
Установить:
node.js – требуется для работы и запуска dashboards; unzip (если не установлен по умолчанию в системе); nano (или любой другой редактор текста).
Установка#
Ручная установка сервиса#
Перед началом установки убедитесь, что выполнена подготовка окружения.
Распаковка дистрибутива#
Внимание!
Название и версии дистрибутива будут различаться, внимательно проверьте и укажите необходимые.
Загрузите полученный дистрибутив на сервер, распакуйте его и перейдите в созданную директорию:
unzip srhx-1.5.0-*-distrib.zip -d /tmp && cd /tmp/srhx/Выполните следующие команды из директории, где находятся распакованные файлы.
[user@vm-name srhx]$ pwd /tmp/srhx/ [user@vm-name srhx]$ ls -l -rw-r--r-- 1 user root 327821009 Mar 5 20:54 dashboard-1.5.0.zip -rw-r--r-- 1 root root 2045982 Mar 5 20:47 index-management-dashboards-1.5.0.zip -rw-r--r-- 1 root root 756487 Mar 5 20:45 notifications-dashboards-1.5.0.zip -rw-r--r-- 1 root root 14842422 Mar 5 21:54 opensearch-index-management-1.5.0.zip -rw-r--r-- 1 root root 9198790 Mar 5 22:04 opensearch-job-scheduler-1.5.0.zip -rw-r--r-- 1 root root 4919467 Mar 5 21:59 opensearch-notifications-1.5.0.zip -rw-r--r-- 1 root root 10896680 Mar 5 21:59 opensearch-notifications-core-1.5.0.zip -rw-r--r-- 1 root root 101699727 Mar 5 21:40 opensearch-security-1.5.0.zip -rw-r--r-- 1 root root 44754603 Mar 5 22:11 opensearch-sql-1.5.0.zip -rw-r--r-- 1 root root 44754603 Mar 5 22:11 opensearch-knn-1.5.0.zip -rw-r--r-- 1 root root 150311 Mar 5 22:07 prometheus-exporter-1.5.0.zip -rw-r--r-- 1 root root 2700708 Mar 5 20:47 queryWorkbenchDashboards-1.5.0.zip -rw-r--r-- 1 root root 7771 Mar 5 21:50 search-healthcheck-plugin-1.5.0.zip -rw-r--r-- 1 root root 232892620 Mar 5 20:29 search-server-1.5.0.zip -rw-r--r-- 1 root root 1170157 Mar 5 20:44 security-dashboards-1.5.0.zip -rw-r--r-- 1 root root 1170157 Mar 5 20:44 opensearch-custom-codecs-1.5.0.zip
Краткое описание распакованных компонентов
Название компонента |
Описание |
|---|---|
search-server-1.5.0 |
Дистрибутив компонента Поисковый движок SRHX |
opensearch-security-1.5.0 |
Плагин безопасности для компонента Поисковой движок SRHX, содержащий в себе плагин audit |
Дополнительные плагины для компонента Поисковый движок (SRHX) |
opensearch-index-management-1.5.0, |
dashboard-1.5.0 |
UI для компонента Поисковый движок (SRHX) |
security-dashboards-1.5.0 |
Плагин безопасности для Dashboards |
Дополнительные плагины для Dashboards |
index-management-dashboards-1.5.0, |
Установка компонента SRHX#
Выполните команды для распаковки дистрибутива:
sudo unzip -q ./search-server-*.zip -d /usr/share/opensearch/
sudo mv /usr/share/opensearch/config/* /etc/opensearch/ && sudo rm -rf /usr/share/opensearch/config/
sudo sh -c "echo -e 'path.data: /var/lib/opensearch\npath.logs: /var/log/opensearch' >> /etc/opensearch/opensearch.yml"
sudo mv opensearch-security-*.zip opensearch-sql-*.zip opensearch-index-management-*.zip opensearch-job-scheduler-*.zip opensearch-notifications-*.zip opensearch-notifications-core-*.zip prometheus-exporter-*.zip search-healthcheck-plugin-*.zip opensearch-knn-*.zip opensearch-custom-codecs-*.zip /usr/share/opensearch/
Описание общего списка команд#
Распакуйте сервер в директорию
/usr/share/opensearch:sudo unzip -q ./search-server-1.5.0.zip -d /usr/share/opensearch/Переместите конфигурационные файлы из
/usr/share/opensearch/configв заранее созданную директорию, для конфигурационных файлов компонента Поискового движка SRHX –/etc/opensearchи удалите пустую директорию/usr/share/opensearch/config:sudo mv /usr/share/opensearch/config/* /etc/opensearch/ && sudo rm -rf /usr/share/opensearch/config/Укажите директории в конфигурационном файле OpenSearch, где он будет хранить данные кластера (path.data) и логи (path.logs). В примере ниже данные кластера будут храниться по пути
/var/lib/opensearch, а логи в/var/log/opensearch, если требуется изменить места хранения, то укажите корректные директории в командах ниже.sudo sh -c "echo -e 'path.data: /var/lib/opensearch\npath.logs: /var/log/opensearch' >> /etc/opensearch/opensearch.yml"Переместите плагины в домашнюю директорию компонента Поисковый движок (SRHX):
sudo mv \ opensearch-sql-*.zip \ opensearch-security-*.zip \ opensearch-index-management-*.zip \ opensearch-job-scheduler-*.zip \ opensearch-notifications-core-*.zip \ opensearch-notifications-*.zip \ prometheus-exporter-*.zip \ opensearch-knn-*.zip \ search-healthcheck-plugin-*.zip \ opensearch-custom-codecs-*.zip \ /usr/share/opensearch/
Установка Dashboards#
Примечание
Dashboards используется один на весь кластер. Не устанавливайте Dashboards на каждый сервер, где стоит компонент Поисковый движок SRHX.
Внимание!
Используйте команды ниже, только если требуется установить Dashboards на сервер, с которым работаете в данный момент.
Общий список выполняемых команд для распаковки дистрибутива:
sudo unzip -q ./dashboards-*.zip -d /usr/share/opensearch-dashboards/
sudo mv security-dashboards-*.zip queryWorkbenchDashboards-*.zip index-management-dashboards-*.zip notifications-dashboards-*.zip /usr/share/opensearch-dashboards/
sudo mv /usr/share/opensearch-dashboards/config/* /etc/opensearch-dashboards/ && sudo rm -rf /usr/share/opensearch-dashboards/config/
Описание общего списка команд выше#
Распакуйте сервер в директорию
/usr/share/opensearch-dashboards:sudo unzip -q ./dashboards-1.5.0.zip -d /usr/share/opensearch-dashboards/Переместите плагины для opensearch-dashboards к нему в домашнюю директорию:
sudo mv security-dashboards-1.5.0.zip queryWorkbenchDashboards-1.5.0.zip index-management-dashboards-1.5.0.zip notifications-dashboards-1.5.0.zip /usr/share/opensearch-dashboards/Переместите конфигурационные файлы
/usr/share/opensearch-dashboards/configв заранее созданную директорию для конфигурационных файлов компонента Поискового движка SRHX -/etc/opensearch-dashboardsи удалите пустую директорию/usr/share/opensearch-dashboards/config:sudo mv /usr/share/opensearch-dashboards/config/* /etc/opensearch-dashboards/ && sudo rm -rf /usr/share/opensearch-dashboards/config/
Установка прав. Наделение правами владельца#
После распаковки измените владельцев директорий и выставите необходимые права.
sudo chown -R opensearch:opensearch /usr/share/opensearch
sudo chown -R opensearch:opensearch /var/log/opensearch
sudo chown -R opensearch:opensearch /var/lib/opensearch
sudo chown -R opensearch:opensearch /etc/opensearch
sudo chown opensearch:opensearch /etc/sysconfig/opensearch
sudo chown -R opensearch-dashboards:opensearch-dashboards /usr/share/opensearch-dashboards
sudo chown -R opensearch-dashboards:opensearch-dashboards /var/log/opensearch-dashboards
sudo chown -R opensearch-dashboards:opensearch-dashboards /etc/opensearch-dashboards
sudo chown opensearch-dashboards:opensearch-dashboards /etc/sysconfig/opensearch-dashboards
sudo chmod 740 /var/lib/opensearch
sudo chmod 750 /usr/share/opensearch
sudo chmod 750 /usr/share/opensearch/logs
sudo chmod 750 -R /usr/share/opensearch/bin
sudo chmod 750 -R /usr/share/opensearch/plugins
sudo chmod 750 -R /var/log/opensearch
sudo chmod 750 /etc/opensearch
sudo chmod 0700 -R /etc/opensearch/secman
sudo chmod 770 -R /etc/opensearch/usertoken
sudo chmod 750 /usr/share/opensearch-dashboards
sudo chmod 750 -R /usr/share/opensearch-dashboards/bin
sudo chmod 750 -R /usr/share/opensearch-dashboards/plugins
sudo chmod 750 -R /var/log/opensearch-dashboards
sudo chmod 750 /etc/opensearch-dashboards
sudo chmod 0700 -R /etc/opensearch-dashboards/secman
sudo chmod 770 -R /etc/opensearch-dashboards/usertoken
Установка плагинов#
Команды по установке плагинов могут быть применены, только в том случае, если валидно заполнен файл opensearch.yml.
Название компонента |
Описание |
|---|---|
search-server-1.5.0 |
Дистрибутив компонента Поисковой движок SRHX |
opensearch-security-1.5.0 |
Плагин безопасности для компонента Поисковой движок SRHX |
Дополнительные плагины для компонента Поисковой движок SRHX |
opensearch-index-management-1.5.0 |
opensearch-job-scheduler-1.5.0 |
|
opensearch-notifications-1.5.0 |
|
opensearch-notifications-core-1.5.0 |
|
prometheus-exporter-1.5.0 |
|
search-healthcheck-plugin-1.5.0 |
|
opensearch-sql-1.5.0 |
|
opensearch-knn-1.5.0 |
|
opensearch-custom-codecs-1.5.0 |
|
dashboard-1.5.0 |
UI для компонента Поисковый движок SRHX |
security-dashboards-1.5.0 |
Плагин безопасности для Dashboards |
Дополнительные плагины для Dashboards |
index-management-dashboards-1.5.0 |
queryWorkbenchDashboards-1.5.0 |
|
notifications-dashboards-1.5.0 |
Установка плагинов от пользователя opensearch на opensearch-server#
При распаковке дистрибутива все плагины перемещены в корневую директорию программы
/usr/share/opensearch/. Далее при установке плагинов будет использоваться указанный путь.Если плагины находятся в другом месте, укажите полный путь до них и проверьте, имеется ли доступ туда у пользователя opensearch.
Внимание!
Установку плагинов выполните от пользователя, под которым запускается компонент SRHX. Для компонента Поисковый движок (SRHX) используйте пользователя –
opensearch.(Не устанавливайте плагины из-под root!)Название и версии плагинов могу различаться, внимательно проверьте и укажите необходимые.
sudo su - opensearch -c 'yes | /usr/share/opensearch/bin/opensearch-plugin install \ file:///usr/share/opensearch/opensearch-knn-1.5.0.zip \ file:///usr/share/opensearch/opensearch-custom-codecs-1.5.0.zip \ file:///usr/share/opensearch/opensearch-sql-1.5.0.zip \ file:///usr/share/opensearch/opensearch-security-1.5.0.zip \ file:///usr/share/opensearch/opensearch-job-scheduler-1.5.0.zip \ file:///usr/share/opensearch/opensearch-index-management-1.5.0.zip \ file:///usr/share/opensearch/opensearch-notifications-core-1.5.0.zip \ file:///usr/share/opensearch/opensearch-notifications-1.5.0.zip \ file:///usr/share/opensearch/search-healthcheck-plugin-1.5.0.zip \ file:///usr/share/opensearch/prometheus-exporter-1.5.0.zip'Возможна установка плагинов по одиночке:
sudo su - opensearch -c 'yes | /usr/share/opensearch/bin/opensearch-plugin install file:///usr/share/opensearch/opensearch-security-1.5.0.zip'После установки плагина безопасности появятся скрипты:
securityadmin.sh;
hash.sh;
audit_config_migrater.sh,
которые находятся по пути /usr/share/opensearch/plugins/opensearch-security/tools. Необходимо сделать их исполняемыми.
sudo chmod +x \
/usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh \
/usr/share/opensearch/plugins/opensearch-security/tools/hash.sh \
/usr/share/opensearch/plugins/opensearch-security/tools/audit_config_migrater.sh
После установки плагина безопасности потребуется настройка шифрования. Для тестового запуска можно временно отключить плагин безопасности и проверить работоспособность программы. Для этого в файл
/etc/opensearch/opensearch.ymlдобавьте строкуplugins.security.disabled: true.sudo sh -c "echo -e 'plugins.security.disabled: true' >> /etc/opensearch/opensearch.yml"
Установка плагинов от пользователя opensearch-dashboards на opensearch-dashboards#
При распаковке дистрибутива все плагины перемещены в корневую директорию программы
usr/share/opensearch-dashboards/. Далее при установке плагинов будет использоваться указанный путь.Если плагины находятся в другом месте, укажите полный путь до них и проверьте, имеется ли доступ туда у пользователя opensearch-dashboards.
Внимание!
Установку плагинов выполните от пользователя, под которым запускается компонент SRHX. Для компонента Поисковый движок (SRHX) используйте пользователя –
opensearch-dashboards.(Не устанавливайте плагины из-под root!)Название и версии плагинов могу различаться, внимательно проверьте и укажите необходимые.
sudo su - opensearch-dashboards -c 'yes | /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin install file:///usr/share/opensearch-dashboards/security-dashboards-1.5.0.zip' sudo su - opensearch-dashboards -c 'yes | /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin install file:///usr/share/opensearch-dashboards/notifications-dashboards-1.5.0.zip' sudo su - opensearch-dashboards -c 'yes | /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin install file:///usr/share/opensearch-dashboards/index-management-dashboards-1.5.0.zip' sudo su - opensearch-dashboards -c 'yes | /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin install file:///usr/share/opensearch-dashboards/queryWorkbenchDashboards-1.5.0.zip'
Создание Unit services и их запуск#
Убедитесь, что все пути указаны корректно.
Создайте точки монтирования в RAM для Server:
sudo nano /etc/systemd/system/etc-opensearch-secman-secrets.mountДобавьте:
[Unit] Description=Mount /etc/opensearch/secman/secrets DefaultDependencies=no Before=shutdown.target reboot.target halt.target [Mount] What=tmpfs Where=/etc/opensearch/secman/secrets Type=tmpfs Options=mode=0700,uid=opensearch,gid=opensearch,size=100m ForceUnmount=true [Install] WantedBy=multi-user.target shutdown.target reboot.target halt.targetСоздайте точки монтирования в RAM для Dashboards:
sudo nano /etc/systemd/system/etc-opensearch\\x2ddashboards-secman-secrets.mountДобавьте:
[Unit] Description=Mount /etc/opensearch-dashboards/secman/secrets DefaultDependencies=no Before=shutdown.target reboot.target halt.target [Mount] What=tmpfs Where=/etc/opensearch-dashboards/secman/secrets Type=tmpfs Options=mode=0700,uid=opensearch-dashboards,gid=opensearch-dashboards,size=100m ForceUnmount=true [Install] WantedBy=multi-user.target shutdown.target reboot.target halt.targetСоздайте Unit services для Server:
sudo nano /etc/systemd/system/opensearch.serviceДобавьте:
[Unit] Description=Platform V Search Wants=network-online.target After=network-online.target etc-opensearch-secman-secrets.mount [Service] Type=forking RuntimeDirectory=opensearch PrivateTmp=true Environment=MAX_LOCKED_MEMORY=unlimited Environment=OPENSEARCH_PATH_CONF=/etc/opensearch EnvironmentFile=-/etc/sysconfig/opensearch Environment=PID_DIR=/var/run/opensearch Environment=KNN_LIB_DIR=/usr/share/opensearch/plugins/opensearch-knn/lib Environment=LD_LIBRARY_PATH=/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib:/usr/share/opensearch/plugins/opensearch-knn/lib WorkingDirectory=/usr/share/opensearch ExecStartPre=/usr/share/opensearch/bin/init_script.sh ExecStart=/usr/share/opensearch/bin/opensearch -d -p ${PID_DIR}/opensearch.pid ExecStopPost=/usr/share/opensearch/bin/saving-secman-data.sh User=opensearch Group=opensearch StandardOutput=journal StandardError=inherit # Service restart - 5 times with an interval of 30 seconds for 200 seconds Restart=on-failure RestartSec=30 StartLimitInterval=200 StartLimitBurst=5 # Unlimited memory lock for service LimitMEMLOCK=infinity # Specifies the maximum file descriptor number that can be opened by this process LimitNOFILE=65535 # Specifies the maximum number of processes LimitNPROC=4096 # Specifies the maximum size of virtual memory LimitAS=infinity # Specifies the maximum file size LimitFSIZE=infinity # Disable timeout logic and wait until process is stopped TimeoutStopSec=0 # SIGTERM signal is used to stop the Java process KillSignal=SIGTERM # Send the signal only to the JVM rather than its control group KillMode=process # Java process is never killed SendSIGKILL=no # When a JVM receives a SIGTERM signal it exits with code 143 SuccessExitStatus=143 # Allow a slow startup before the systemd notifier module kicks in to extend the timeout TimeoutStartSec=75 [Install] WantedBy=multi-user.targetСоздайте Unit services для Dashboards (Если на данном сервере установлен opensearch-dashboards):
sudo nano /etc/systemd/system/opensearch-dashboards.serviceДобавьте
[Unit] Description=Platform V Search Dashboard Wants=network-online.target After=network-online.target etc-opensearch\\x2ddashboards-secman-secrets.mount [Service] Type=simple User=opensearch-dashboards Group=opensearch-dashboards Environment=OSD_PATH_CONF=/etc/opensearch-dashboards EnvironmentFile=-/etc/sysconfig/opensearch-dashboards WorkingDirectory=/usr/share/opensearch-dashboards/ ExecStartPre=/usr/share/opensearch-dashboards/bin/init_script.sh ExecStart=/bin/bash -c '/usr/share/opensearch-dashboards/bin/opensearch-dashboards &> /var/log/opensearch-dashboards/stdout.log' ExecStopPost=/usr/share/opensearch-dashboards/bin/saving-dashboards-secman-data.sh StandardOutput=journal StandardError=inherit # Service restart - 5 times with an interval of 30 seconds for 200 seconds Restart=on-failure RestartSec=30 StartLimitInterval=200 StartLimitBurst=5 [Install] WantedBy=multi-user.targetВыполните перезагрузку systemd:
sudo systemctl daemon-reloadДобавьте точку монтирования в автозагрузку и запустите:
sudo systemctl enable etc-opensearch-secman-secrets.mount --now sudo systemctl enable etc-opensearch\\x2ddashboards-secman-secrets.mount --nowДобавьте opensearch-services в автозагрузку и запустите:
sudo systemctl enable opensearch.service --nowДобавьте opensearch-dashboards-services в автозагрузку и запустите:
sudo systemctl enable opensearch-dashboards.service --now
Настройка компонента SRHX#
Настройка параметров в opensearch.yml#
Большинство настроек компонента SRHX описываются в файле /etc/opensearch/opensearch.yml и считываются при запуске.
Внимание!
Для настройки кластера подготовьте два сертификата с разными CN и подписанные одним УЦ. Один сертификат используется для межкластерного шифрования и шифрования HTTP-уровня. Второй, сертификат администратора, для доступа с правами администратора.
Сертификаты администратора — это обычные клиентские сертификаты с повышенными правами внутри компонента SRHX, для выполнения административных задач. Сертификат администратора необходим для изменения конфигурации плагина безопасности с помощью plugins/opensearch-security/tools/securityadmin.sh или REST API. Сертификаты администратора настраиваются в opensearch.yml путем указания их DN:
plugins.security.authcz.admin_dn:
- 'CN=<Common Name вашего сертификата администратора>, OU=<Подразделение организации>, O=<Наименование организации, выдавшей сертификат>, STREET=<Наименование улицы, на которой располагается организация>, L=<Населенный пункт, в котором расположена организация>, ST=<Наименование региона, в котором расположен сертификат>, C=<Наименование страны, в которой расположена организация>'
Сертификаты должны быть в формате PKCS#8.
Замените все содержимое файла (удалите весь текст в существующем фале) /etc/opensearch/opensearch.yml.
### Шаблон безопасной конфигурации сервера.
### Подставьте необходимые значения там, где требуется.
### Символы < > указывают значения, которые требуется заменить. При подстановке необходимых значений символы < > использовать не нужно.
bootstrap.memory_lock: true
# Настройки хоста
network.host: <FQDN или IP текущего хоста>
http.port: `<Необходимо выбрать один любой порт выше 10000 (например:19200 )>`
transport.port: `<Необходимо выбрать один любой порт выше 10000 (например:19301)>`
# Настройки кластера
cluster.name: <ваше имя кластера>
node.name: <ваше имя текущей node>
node.roles:
- cluster_manager
- data
cluster.initial_cluster_manager_nodes:
- <node.name node 1 в кластере>
- <node.name node 2 в кластере>
- <node.name node 3 в кластере>
discovery.seed_hosts:
- <FQDN или IP node 1 в кластере>:<Значение указанное в параметре "transport.port">
- <FQDN или IP node 2 в кластере>:<Значение указанное в параметре "transport.port">
- <FQDN или IP node 3 в кластере>:<Значение указанное в параметре "transport.port">
# Настройки для хранения данных и логов текущей node
path.data: /var/lib/opensearch
path.logs: /var/log/opensearch
# Настройки плагина Security
#############################################################
## Не отключаемые параметры.
plugins.security.disabled: false
plugins.security.secman.enabled: true
plugins.security.ssl.http.enabled: true
plugins.security.ssl.transport.enabled: true
plugins.security.ssl.http:
keystore_filepath: "/etc/opensearch/secman/certs/http.jks"
truststore_filepath: "/etc/opensearch/secman/certs/httptrust.jks"
enabled_protocols: ["TLSv1.2", "TLSv1.3"]
enabled_ciphers: ["TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"]
clientauth_mode: REQUIRE
plugins.security.ssl.transport:
keystore_filepath: "/etc/opensearch/secman/certs/transport.jks"
truststore_filepath: "/etc/opensearch/secman/certs/transport.jks"
enabled_protocols: ["TLSv1.2", "TLSv1.3"]
enabled_ciphers: ["TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"]
enforce_hostname_verification: true
plugins.security.authcz.admin_dn:
- 'CN=<Common Name вашего сертификата администратора>, OU=<Подразделение организации>, O=<Наименование организации, выдавшей сертификат>, STREET=<Наименование улицы, на которой располагается организация>, L=<Населенный пункт, в котором расположена организация>, ST=<Наименование региона, в котором расположен сертификат>, C=<Наименование страны, в которой расположена организация>'
plugins.security.nodes_dn:
- 'CN=<Common Name межкластерного сертификата/Параметр указанный в plugins.security.secman.transport.cn>, OU=<Подразделение организации>, O=<Наименование организации, выдавшей сертификат>, STREET=<Наименование улицы, на которой располагается организация>, L=<Населенный пункт, в котором расположена организация>, ST=<Наименование региона, в котором расположен сертификат>, C=<Наименование страны, в которой расположена организация>'
plugins.security.audit.type: ru.sbt.audit.PlatformVAuditSink
plugins.security.allow_default_init_securityindex: true
plugins.security.restapi.roles_enabled: "all_access"
plugins.security.system_indices:
enabled: true
indices: [".plugins-ml-model", ".plugins-ml-task", ".opendistro-alerting-config", ".opendistro-alerting-alert*", ".opendistro-anomaly-results*", ".opendistro-anomaly-detector*", ".opendistro-anomaly-checkpoints", ".opendistro-anomaly-detection-state", ".opendistro-reports-*", ".opensearch-notifications-*", ".opensearch-notebooks", ".opensearch-observability", ".opendistro-asynchronous-search-response*", ".replication-metadata-store"]
plugins.security.cache.ttl_minutes: 120
## Не отключаемые параметры.
#############################################################
Описание всех параметров указанных в примере opensearch.yml приведены в таблице ниже.
Имя параметра |
Описание |
|---|---|
bootstrap.memory_lock: true |
Позволяет программе блокировать на сервере определенное количество оперативной памяти, которое указано в файле |
network.host: <FQDN или IP текущего хоста> |
Сетевой адрес текущего хоста, на котором будет доступен сервер |
http.port: ХХХХХ |
Порт, на котором будет доступен API сервера. Используется для доступа к серверу по HTTP. По умолчанию 9200 |
transport.port: ХХХХХ |
Порт, на котором будет доступен сервер на транспортном уровне. Используется для связи серверов между собой в кластере. По умолчанию 9300 |
cluster.name: <ваше имя кластера> |
Произвольное имя текущего кластера в котором будет находится данная node |
node.name: <ваше имя текущей node> |
Произвольное имя текущего сервера в кластере |
node.roles: |
Роли данной node в кластере. |
cluster.initial_cluster_manager_nodes: |
Перечисление всех заданных ранее имен node (node.name) в кластере |
discovery.seed_hosts: |
Перечисление адресов и портов всех node, которые будут находится в кластере |
path.data: /var/lib/opensearch |
Директория для хранения данных node |
path.logs: /var/log/opensearch |
Директория для хранения логов node |
plugins.security.disabled: false |
Принудительное включение плагина безопасности |
plugins.security.ssl.http.enabled: true |
Включение шифрования HTTP-уровня |
plugins.security.ssl.http.keystore_filepath: «/etc/opensearch/secman/certs/http.jks» |
Путь к месту хранения сертификатов для HTTP-уровня |
plugins.security.ssl.http.truststore_filepath: «/etc/opensearch/secman/certs/httptrust.jks» |
Путь к месту хранения цепочки сертификатов HTTP-уровня |
plugins.security.ssl.http.enabled_protocols: |
Позволяет использовать только указанные методы шифрования для HTTP-уровня |
plugins.security.ssl.http.enabled_ciphers: |
Позволяет использовать только указанные шифры для HTTP-уровня |
plugins.security.ssl.http.clientauth_mode: REQUIRE |
Режим проверки сертификатов при запросах к серверу, запросы без сертификатов блокируются. По умолчанию OPTIONAL – ожидать сертификаты, но не требовать их |
plugins.security.ssl.transport.enabled: true |
Включение шифрования транспортного уровня |
plugins.security.ssl.transport.keystore_filepath: «/etc/opensearch/secman/certs/transport.jks» |
Путь к месту хранения сертификатов для транспортного уровня |
plugins.security.ssl.transport.truststore_filepath: «/etc/opensearch/secman/certs/transport.jks» |
Путь к месту хранения цепочки сертификатов транспортного уровня |
plugins.security.ssl.transport.extended_key_usage_enabled:false |
Параметр, отвечающий за работу отдельно с клиентским и серверным сертификатом на транспортном уровне взаимодействия |
plugins.security.ssl.transport.enabled_protocols: |
Позволяет использовать только указанные методы шифрования для транспортного уровня |
plugins.security.ssl.transport.enabled_ciphers: |
Позволяет использовать только указанные шифры для транспортного уровня |
plugins.security.ssl.transport.enforce_hostname_verification: true |
Проверка имени хоста на транспортном уровне. Необязательный. По умолчанию true |
plugins.security.authcz.admin_dn |
Здесь необходимо указать полный DN сертификата, который будет использоваться для доступа с правами полного администратора. В основном используется для применения изменений методов аутентификации/авторизации и ролевой модели, указывается при вызове скрипта securityadmin.sh. Должен состоять из CN, OU, O, STREET, L, ST, C. |
plugins.security.nodes_dn |
Здесь необходимо указать полный DN сертификата, который будет использоваться для межкластерного шифрования между node и доступа к API сервера. Все REST запросы необходимо осуществлять с данными сертификатами. Должен состоять из CN, OU, O, STREET, L, ST, C. |
plugins.security.audit.type: internal_opensearch |
Метод хранения данных аудита. |
plugins.security.audit.config.disabled_rest_categories: NONE |
Принудительно включить запись всех событий HTTP-уровня в журнал аудита |
plugins.security.audit.config.disabled_transport_categories: NONE |
Принудительно включить запись всех событий транспортного уровня в журнал аудита |
plugins.security.allow_default_init_securityindex: true |
Позволяет инициализировать системные индексы, если они не были созданы |
plugins.security.restapi.roles_enabled: |
Имя роли, которая может осуществлять системные вызовы через REST-запросы к API сервера. |
plugins.security.system_indices.enabled: true |
Включить защиту системных индексов указанных в следующем параметре |
plugins.security.system_indices.indices: |
Доступ к данным индексам будет ограничен |
plugins.security.cache.ttl_minutes: 120 |
Время хранения данных кеша пользователей в минутах. При использовании внешних систем аутентификации/авторизации необходимо установить |
plugins.security.secman.enabled: true |
Включение интеграции с Secret Management System |
Настройка JVM Heap Size параметров#
Для быстрой и стабильной работы рекомендуется выделять компоненту SRHX 50 процентов оперативной памяти сервера.
Для этого:
Unit services компонента SRHX в Linux должен содержать параметры:
Environment=MAX_LOCKED_MEMORY=unlimitedиLimitMEMLOCK=infinity(прописывается при создании unit service). В лимитах для пользователяopensearch– должен быть установлен параметрopensearch - memlock unlimited(описано в разделе Изменение лимитов пользователей данного документа).В
opensearch.ymlдолжен быть прописан параметрbootstrap.memory_lock:со значениемtrue.
Укажите нужное значение в параметрах Java. Для этого откройте файл /etc/opensearch/jvm.options, найдите параметры -Xms и -Xmx и укажите значение в гигабайтах, равное половине оперативной памяти текущего сервера, но не более 32766 Мб.
Узнайте размер оперативной памяти на текущем сервере с помощью команды:
free -g | grep Mem: | awk '{print $2}' 23Отредактируйте параметры в файле с настройками JVM и укажите округленные значения, равные половине числа, полученного в предыдущей команде.
sudo nano /etc/opensearch/jvm.options # JVM configuration ################################################################ ## IMPORTANT: JVM heap size ################################################################ # Xms represents the initial size of total heap space # Xmx represents the maximum size of total heap space -Xms11g -Xmx11g
Добавление параметров в opensearch-keystore#
Внимание!
Выполнение данного пункта для компонента Поисковый движок (SRHX) требуется для обеспечения работы при недоступности Secret Management System. Обратите внимание, что Dashboards имеет свой собственный Keystore –
opensearch-dashboards-keystore. Его настройка отличается и описана в пункте Добавление параметров в opensearch-dashboards-keystore.
Создайте keystore с помощью параметра create.
#создайте хранилище, если оно еще не существует
sudo su - opensearch -c '/usr/share/opensearch/bin/opensearch-keystore create'
Внимание!
opensearch-keystore будет создан для пользователя linux, от которого будут запускаться команды. Не выполняйте команды из под
root! Используйте для этого пользователяopensearch.
Opensearch-keystore используется для сохранения сертификатов на случай недоступности Secret Management System и для сокрытия чувствительных данных (например логин/пароль) в компоненте Поисковый движок (SRHX). Хранение логина и пароля выполняется в opensearch.yml.
Список часто используемых параметров
Параметр |
Описание |
|---|---|
help |
Список доступных команд |
create |
Создание нового keystore хранилища (дополнительный параметр -p позволит создать keystore, защищенный паролем) |
add |
Добавление нового параметра в созданный keystore |
list |
Просмотр параметров, которые хранятся в данный момент в keystore |
remove |
Удалить существующий параметр из текущего keystore |
Настройка параметров в opensearch_dashboards.yml#
Большинство настроек компонента SRHX описываются в файле /etc/opensearch-dashboards/opensearch_dashboards.yml и считываются при запуске компонента SRHX.
Внимание!
Должны быть подготовлены сертификаты для межкластерного шифрования и шифрования HTTP-уровня. Здесь используются те же сертификаты, которые были установлены ранее.
Замените все содержимое файла (удалите весь текст в существующем файле) /etc/opensearch-dashboards/opensearch_dashboards.yml текстом указанным в готовом образце opensearch_dashboards.yml, изменив значения на необходимые.
Готовый образец opensearch_dashboards.yml
### Шаблон безопасной конфигурации dashboards.
### Подставьте необходимые значения там, где требуется.
### Символы < > указывают значения, которые требуется заменить. При подстановке необходимых значений символы < > использовать не нужно.
# Настройки для самого dashboards
server.host: "<FQDN или IP текущего хоста>"
server.port: 15601
server.ssl.enabled: true
server.ssl.keystore.path: /etc/opensearch-dashboards/secman/certs/http.p12
server.ssl.truststore.path: /etc/opensearch-dashboards/secman/certs/trust.p12
# Настройки для соединения dashboards с сервером OpenSearch
opensearch.hosts:
- https://<FQDN или IP node 1 в кластере>:ХХХХХ
- https://<FQDN или IP node 2 в кластере>:ХХХХХ
- https://<FQDN или IP node 3 в кластере>:ХХХХХ
opensearch.ssl.alwaysPresentCertificate: true
opensearch.ssl.verificationMode: full
opensearch.ssl.keystore.path: /etc/opensearch-dashboards/secman/certs/transport.p12
opensearch.ssl.truststore.path: /etc/opensearch-dashboards/secman/certs/trust.p12
opensearch.requestHeadersAllowlist:
- authorization
- securitytenant
# Настройки логирования
logging.dest: /var/log/opensearch-dashboards/opensearch-dashboards.log
logging.json: false
logging.verbose: true
# Настройки плагина Security
opensearch_security.auth.type: "basicauth"
opensearch_security.cookie.secure: true
opensearch_security.session.keepalive: true
# Указанны значения в миллисекундах
opensearch_security.cookie.ttl: 86400000
opensearch_security.session.ttl: 1200000
i18n.locale: "ru"
secman.enabled: true
#Настройка метрик в Dashboards
prometheus.metrics.job_name: opensearch_dashboards
prometheus.metrics.path: _prometheus/metrics
Описание всех параметров указанных в примере opensearch_dashboards.yml представлено в таблице ниже.
Имя параметра |
Описание |
|---|---|
server.host: <FQDN или IP текущего хоста> |
Сетевой адрес текущего хоста, на котором будет доступен сервер |
server.port: 15601 |
Порт, на котором будет доступен API сервера. Используется для доступа к серверу по HTTP. По умолчанию 5601 |
server.ssl.enabled: true |
Включить HTTP шифрование |
server.ssl.keystore.path: /etc/opensearch-dashboards/secman/certs/http.p12 |
Путь к сертификату для HTTP-уровня. |
server.ssl.truststore.path: /etc/opensearch-dashboards/secman/certs/trust.p12 |
Путь к цепочке сертификата HTTP-уровня. |
opensearch.hosts: |
Перечисление адресов и портов всех серверов в кластере. Порт по умолчанию 9200. Вместо ХХХХХ необходимо указать нужный порт |
opensearch.requestHeadersAllowlist: |
Перечисление заголовков, которые сервер будет считывать, при отправке запросов к нему |
opensearch.ssl.alwaysPresentCertificate: true |
Всегда передавать сертификат при запросах к компоненту SRHX |
opensearch.ssl.verificationMode: full |
Тип проверки при аутентификации соединения с сервером. |
opensearch.ssl.keystore.path: /etc/opensearch-dashboards/secman/certs/transport.p12 |
Путь к сертификату для транспортного уровня. |
opensearch.ssl.truststore.path: /etc/opensearch-dashboards/secman/certs/trust.p12 |
Путь к цепочке сертификата транспортного уровня. |
opensearch_security.auth.type: |
Тип аутентификации. |
opensearch_security.cookie.secure: true |
Шифрование cookies. Необходимо при включении HTTPs |
opensearch_security.session.keepalive: true |
Поддерживать сессию, пока действуют cookies. |
#specified values are in milliseconds |
Время хранения cookies в миллисекундах. Может быть равно 0 для сессии cookie. По умолчанию – 1 час |
opensearch_security.session.ttl: 1200000 |
Время жизни установленной сессии с пользователем. Если установлено, пользователю будет предложено снова войти в систему через заданное время, независимо от файла cookie. По умолчанию: 1 час |
i18n.locale: ru |
Выбранный язык локализации. Необязательный параметр. По умолчанию - en |
secman.enabled: false |
Параметр, отвечающий за активацию интеграции с Secret Management System. Необязательный параметр. По умолчанию - false |
prometheus.metrics.job_name: opensearch_dashboards |
Параметр обозначающий префикс для метрик, котрые откидывает сервис dashboards. В примере метрики будут с префиксом opensearch_dashboards |
prometheus.metrics.path: _prometheus/metrics |
Путь по умолчанию, может быть параметризирован. |
opensearch_security.auth.anonymous_auth_enabled: false |
Включает или отключает анонимную аутентификацию. Анонимный доступ должен быть запрещён! |
Добавление параметров в opensearch-dashboards-keystore#
Для сокрытия чувствительных данных (например логин/пароль) в компоненте SRHX существует opensearch-dashboards-keystore.
Внимание!
Выполнение данного пункта для Dashboards требуется для обеспечения работы при недоступности Secret Management System.
Для работы с opensearch-dashboards-keystore запустите /usr/share/opensearch-dashboards/bin/opensearch-dashboards-keystore <параметр> (--help, чтобы увидеть все доступные параметры).
Список часто используемых параметров
Параметр |
Описание |
|---|---|
create |
Создание нового keystore хранилища (дополнительный параметр -p позволит создать keystore, защищенный паролем) |
add |
Добавление нового параметра в созданный keystore |
list |
Просмотр параметров, которые хранятся в данный момент в keystore |
remove |
Удалить существующий параметр из текущего keystore |
Для продолжения установки добавьте в opensearch-dashboards-keystore логин и пароль для соединения с компонентом SRHX, так же пароли от сертификатов. Это будут параметры:
Параметр |
Описание |
|---|---|
opensearch.username |
Логин пользователя. Должен присутствовать в |
opensearch.password |
Пароль от логина, указанного в предыдущем пункте. Должен присутствовать в |
Создайте keystore с помощью параметра create. Добавьте необходимые параметры при помощи параметра add.
Внимание!
opensearch-dashboards-keystoreбудет создан для пользователя, который будет запускать команды. Не выполняйте команды из-подroot! Используйте для этого пользователяopensearch-dashboards.
#Создайте хранилище, если оно еще не существует
sudo su - opensearch-dashboards -c '/usr/share/opensearch-dashboards/bin/opensearch-dashboards-keystore create'
#После команды будет ожидать ввода данных
sudo su - opensearch-dashboards -c '/usr/share/opensearch-dashboards/bin/opensearch-dashboards-keystore add opensearch.username'
#После команды будет ожидать ввода данных
sudo su - opensearch-dashboards -c '/usr/share/opensearch-dashboards/bin/opensearch-dashboards-keystore add opensearch.password'
На этом настройка сервера может быть завершена. Для первого запуска можно использовать ролевую модель по умолчанию с пользователями из internal_users.yml.
Настройка методов аутентификации/авторизации и ролевой модели#
В разделе приведена информация для ознакомления с возможностями ролевой модели компонента SRHX.
Ролевая модель настраивается в файлах
internal_users.yml,roles.yml,roles_mapping.yml, которые находятся в/etc/opensearch/opensearch-security/.Методы аутентификации настраиваются в файле
config.yml, который находится в/etc/opensearch/opensearch-security/.
При старте компонента SRHX в первый раз подгружаются данные из этих файлов. Поэтому на сервере уже будут стандартные пользователи из этих файлов и метод аутентификации basicauth, который указан в config.yml. Редактирование файлов выполняется при необходимости.
Создание шифрованного пароля для пользователя#
Все пароли в internal_users.yml хранятся в зашифрованном виде. Для шифрования пароля есть скрипт hash.sh.
Запустите скрипт от пользователя
opensearch.sudo su - opensearch -c '/usr/share/opensearch/plugins/opensearch-security/tools/hash.sh'После загрузки скрипта он будет ожидать ввода пароля, который будет зашифрован. В примере используйте пароль
der_parol.************************************************************************** ** This tool will be deprecated in the next major release of OpenSearch ** ************************************************************************** [Password:]После ввода данных и нажатия Enter, получите введенный пароль в зашифрованном виде.
$2y$12$MnTVuoi0Ue.Bbn47Np.xFuPjNcGGrazvgAZDkfSDMzSSd69Y3H6SW
Создание пользователя#
В файл
internal_users.ymlдобавьте блок нового пользователя:sudo nano /etc/opensearch/opensearch-security/internal_users.ymlДобавьте, подставив необходимые данные:
pvs_admin: hash: "$2y$12$MnTVuoi0Ue.Bbn47Np.xFuPjNcGGrazvgAZDkfSDMzSSd69Y3H6SW" reserved: false description: "Demo pvs_admin user, using internal role mapping`
Создание роли#
Создайте роль с возможностями администрирования в файле
roles.yml.sudo nano /etc/opensearch/opensearch-security/roles.ymlДобавьте:
super_administrator: cluster_permissions: - 'cluster:admin/*' - 'cluster:monitor/*' index_permissions: - index_patterns: - '*' allowed_actions: - 'indices:admin/*' - 'indices:data/*' - 'indices:monitor/*
Связывание созданной роли и пользователя#
Присвойте роль созданному пользователю в файле
roles_mapping.yml.sudo nano /etc/opensearch/opensearch-security/roles_mapping.ymlДобавьте:
super_administrator: reserved: false users: - "pvs_admin" description: "Maximum access to everything"
Применение данных к кластеру#
Внимание!
После применения новой конфигурации к кластеру, предыдущие параметры будут перезаписаны без возможности восстановления. Для сохранения текущих параметров используйте опцию
-backup.
После редактирования данных в файлах примените их к кластеру.
Запустите скрипт securityadmin.sh, который находится по пути /usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh.
При запуске этого скрипта укажите дополнительные параметры.
Параметры |
Описание |
|---|---|
-backup my-backup-directory |
Необязательно. Создание копии текущих настроек сервера |
-icl |
Игнорировать имя кластера (не использовать вместе с параметром -cn) |
-nhnv |
Отключить проверку имени host’a |
-cd |
Путь до конфигурационных файлов opensearch-security |
-h |
FQDN или IP-адрес хоста для подключения |
-p |
API-Порт подключения |
-cacert |
Путь до корневого сертификата |
-cert |
Путь до сертификата администратора |
-key |
Путь до приватного ключа для сертификата администратора |
-keypass |
Пароль от приватного ключа для сертификата администратора |
Параметры для работы с хранилищем сертификатов p12 или jks. Нельзя использовать вместе с параметрами для обычных сертификатов.
Параметры |
Описание |
|---|---|
-ks |
Путь до keystore с сертификатом администратора |
-kspass |
Пароль от keystore с сертификатом администратора |
-ts |
Путь до keystore с корневым сертификатом администратора |
-tspass |
Пароль от keystore с корневым сертификатом администратора |
Пример запуска скрипта от пользователя opensearch:
sudo su - opensearch -c '/usr/share/opensearch/plugins/opensearch-security/tools/securityadmin.sh \
-icl \
-nhnv \
-cd /etc/opensearch/opensearch-security/ \
-h "<адрес вашего хоста, где запущен компонент SRHX>" \
-p "ХХХХХ" \
-cacert "/etc/opensearch/certs/<имя вашего корневого сертификата>" \
-cert "/etc/opensearch/certs/<имя вашего сертификата администратора>" \
-key "/etc/opensearch/certs/<имя вашего приватного ключа для сертификата администратора>" \
-keypass "<пароль от приватного ключа для сертификата администратора>"'
Пример вывода успешного выполнения скрипта. В конце должна быть надпись Done with success
Security Admin v7
Will connect to <адрес вашего хоста, где запущен SRHX>:ХХХХХ ... done
Connected as "CN=<CN вашего админ-сертификата>,O=<имя вашего УЦ>"
OpenSearch Version: 1.5.0
Contacting opensearch cluster 'opensearch' and wait for YELLOW clusterstate ...
Clustername: <название вашего кластера>
Clusterstate: GREEN
Number of nodes: 3
Number of data nodes: 3
.opendistro_security index already exists, so we do not need to create one.
Populate config from /etc/opensearch/opensearch-security/
Will update '/config' with /etc/opensearch/opensearch-security/config.yml
SUCC: Configuration for 'config' created or updated
Will update '/roles' with /etc/opensearch/opensearch-security/roles.yml
SUCC: Configuration for 'roles' created or updated
Will update '/rolesmapping' with /etc/opensearch/opensearch-security/roles_mapping.yml
SUCC: Configuration for 'rolesmapping' created or updated
Will update '/internalusers' with /etc/opensearch/opensearch-security/internal_users.yml
SUCC: Configuration for 'internalusers' created or updated
Will update '/actiongroups' with /etc/opensearch/opensearch-security/action_groups.yml
SUCC: Configuration for 'actiongroups' created or updated
Will update '/tenants' with /etc/opensearch/opensearch-security/tenants.yml
SUCC: Configuration for 'tenants' created or updated
Will update '/nodesdn' with /etc/opensearch/opensearch-security/nodes_dn.yml
SUCC: Configuration for 'nodesdn' created or updated
Will update '/whitelist' with /etc/opensearch/opensearch-security/whitelist.yml
SUCC: Configuration for 'whitelist' created or updated
Will update '/audit' with /etc/opensearch/opensearch-security/audit.yml
SUCC: Configuration for 'audit' created or updated
Will update '/allowlist' with /etc/opensearch/opensearch-security/allowlist.yml
SUCC: Configuration for 'allowlist' created or updated
SUCC: Expected 10 config types for node {"updated_config_types":["allowlist","tenants","rolesmapping","nodesdn","audit","roles","whitelist","internalusers","actiongroups","config"],"updated_config_size":10,"message":null} is 10 (["allowlist","tenants","rolesmapping","nodesdn","audit","roles","whitelist","internalusers","actiongroups","config"]) due to: null
Done with success
Установка Data Prepper#
Сборка Docker образа#
В директории с Data Prepper расположены следующие файлы:
data-prepper-jdk-2.8.0-linux-x64.tar.gz – архив с Data Prepper;
папка config – pipeline.yaml конфигурации по настройке pipeline обработки данных и data-prepper-config.yaml конфигурационный файл настройки сервера;
Dockerfile – файл с описанием образа.
В данной директории соберите Dockerfile.
Ниже представлено описание Dockerfile:
FROM '<path-to-image>'
ARG PIPELINE_FILEPATH=/usr/share/data-prepper/pipelines
ARG CONFIG_FILEPATH=/usr/share/data-prepper/config
ARG ARCHIVE_NAME=opensearch-data-prepper-jdk-2.8.0-SNAPSHOT-linux-x64
ARG ARCHIVE_FILE=$ARCHIVE_NAME.tar.gz
ARG ARCHIVE_FILE_UNPACKED=$ARCHIVE_NAME
ENV DATA_PREPPER_PATH /usr/share/data-prepper
ENV ENV_CONFIG_FILEPATH=$CONFIG_FILEPATH/data-prepper-config.yaml
ENV ENV_PIPELINE_FILEPATH=$PIPELINE_FILEPATH/pipelines.yaml
RUN mkdir -p /var/log/data-prepper
ADD $ARCHIVE_FILE /usr/share
RUN mv /usr/share/$ARCHIVE_FILE_UNPACKED /usr/share/data-prepper
COPY config/data-prepper-config.yaml $ENV_CONFIG_FILEPATH
COPY config/pipeline.yaml $ENV_PIPELINE_FILEPATH
WORKDIR $DATA_PREPPER_PATH
CMD ["bin/data-prepper"]
Соберите образ с помощью команды и укажите тэг с
registry.docker build -t `<path-to-registry>`/data-prepper:latest .Загрузите образ в nexus.
docker push `<path-to-registry>`/data-prepper:latest
После выполнения данных команд будет создан готовый образ Data Prepper.
Пример
pipelines.yaml: |
main-pipeline:
source:
kafka:
encryption:
type: none
bootstrap_servers:
- your-server-host
topics:
- name: dataprepper
group_id: dataprepperGroup
buffer:
bounded_blocking:
buffer_size: 1024
batch_size: 256
processor:
- parse_json:
source: message
- grok:
grok_when: '(/fields != null and /fields != "") and contains(/fields/app_name, "merchant_profile")'
match:
message: [ '\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{LOGLEVEL:level}\s?\] [-] UnPrs \[%{GREEDYDATA:unparsedMerchantName}\] \[%{GREEDYDATA:city}\] \[%{GREEDYDATA:country}\] \[%{GREEDYDATA:merchantId}\] \[%{GREEDYDATA:mccCode}\] \[%{GREEDYDATA:isCategoryParsed}\]' ]
- add_entries:
entries:
- key: "uniqueMerchantNameStat"
value_expression: /unparsedMerchantName
add_when: '/timestamp != null'
- grok:
grok_when: '/timestamp == null'
match:
message: [ '\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{LOGLEVEL:level}\s?\] [-] Prs \[%{GREEDYDATA:parsedMerchantName}\] \[%{GREEDYDATA:city}\] \[%{GREEDYDATA:country}\] \[%{GREEDYDATA:merchantId}\] \[%{GREEDYDATA:mccCode}\] \[%{GREEDYDATA:brandName}\] \[%{GREEDYDATA:logoFilename}\] \[%{GREEDYDATA:address}\] \[%{GREEDYDATA:location}\] \[%{GREEDYDATA:feedbackAllowed}\] \[%{GREEDYDATA:isCategoryLogo}\] \[%{GREEDYDATA:isCategoryParsed}\] \[%{GREEDYDATA:isFullSearchMatched}\]' ]
- add_entries:
entries:
- key: "uniqueMerchantNameStat"
value_expression: /parsedMerchantName
add_when: '/timestamp != null'
- grok:
grok_when: '/timestamp == null'
match:
message: [ '\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{LOGLEVEL:level}\s?\] [-] Prs \[%{GREEDYDATA:parsedMerchantName}\] \[%{GREEDYDATA:city}\] \[%{GREEDYDATA:country}\] \[%{GREEDYDATA:merchantId}\] \[%{GREEDYDATA:mccCode}\] \[%{GREEDYDATA:brandName}\] \[%{GREEDYDATA:logoFilename}\] \[%{GREEDYDATA:isCategoryLogo}\] \[%{GREEDYDATA:isCategoryParsed}\]' ]
- add_entries:
entries:
- key: "uniqueMerchantNameStat"
value_expression: /parsedMerchantName
add_when: '/timestamp != null'
- key: "address"
value_expression: "false"
add_when: '/timestamp != null'
- key: "location"
value: "false"
add_when: '/timestamp != null'
- key: "isFullSearchMatched"
value: "false"
add_when: '/timestamp != null'
- grok:
grok_when: '/timestamp == null'
match:
message: [ '\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{LOGLEVEL:level}\s?\] [-] PrsDup \[%{GREEDYDATA:duplicateMerchantName}\] \[%{GREEDYDATA:city}\] \[%{GREEDYDATA:country}\] \[%{GREEDYDATA:merchantId}\] \[%{GREEDYDATA:mccCode}\] \[%{GREEDYDATA:brandName}\] \[%{GREEDYDATA:logoFilename}\] \[%{GREEDYDATA:isCategoryLogo}\] \[%{GREEDYDATA:isCategoryParsed}\]' ]
- add_entries:
entries:
- key: "parsedMerchantName"
value_expression: /duplicateMerchantName
add_when: '/timestamp != null'
- key: "address"
value: "false"
add_when: '/timestamp != null'
- key: "location"
value: "false"
add_when: '/timestamp != null'
- grok:
grok_when: '/timestamp == null'
match:
message: [ '\[%{TIMESTAMP_ISO8601:timestamp}\] \[%{LOGLEVEL:level}\s?\] [-] PrsDupIn \[%{GREEDYDATA:parsedMerchantName}\] \[%{GREEDYDATA:city}\] \[%{GREEDYDATA:country}\] \[%{GREEDYDATA:merchantId}\] \[%{GREEDYDATA:mccCode}\] \[%{GREEDYDATA:brandName}\] \[%{GREEDYDATA:logoFilename}\] \[%{GREEDYDATA:isCategoryLogo}\] \[%{GREEDYDATA:isCategoryParsed}\]' ]
- add_entries:
entries:
- key: "address"
value: "false"
add_when: '/timestamp != null'
- key: "location"
value: "false"
add_when: '/timestamp != null'
- key: "isFullSearchMatched"
value: "false"
add_when: '/timestamp != null'
route:
- alpha: '/fields/app_name != null and /fields/app_name != ""'
- beta: '/level != null and /level == "INFO"'
sink:
- opensearch:
routes:
- alpha
connection:
insecure: true
hosts: [ "your-opensearch-host-1" ]
index: "logs-${/fields/app_name}-datastream"
username: "{{ search_username }}"
password: "{{ search_password }}"
- opensearch:
routes:
- beta
connection:
insecure: true
hosts: [ "your-opensearch-host-2" ]
index: fallback
username: "{{ search_username }}"
password: "{{ search_password }}"
- stdout:
Deploy приложения в DropApp#
Для deploy приложения понадобится создать 4 манифеста:
Config map для описания конфигурации приложения (data-prepper-config);
Service для приложения (data-prepper-server);
Service для метрик приложения (data-prepper-metrics);
Deployment для описания deploy приложения (data-prepper).
Создайте директорию k8s с помощью команды (выбор пути для создания директории опционален):
mkdir -p /usr/share/k8s
Перейдите в данную директорию:
cd /usr/share/k8s
Создайте в ней файлы, представленные ниже.
Примеры манифестов:
В Config map можно переопределить pipeline.yaml и data-prepper-config.yaml. Config map монтируется в volume в разделе deployment.
Config map для описания конфигурации приложения (cm-data-prepper.yml):
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: data-prepper
name: data-prepper-config
data:
pipelines.yaml: |
simple-sample-pipeline:
workers: 2 # the number of workers
delay: 5000 # in milliseconds, how long workers wait between read attempts
source:
random:
buffer:
bounded_blocking:
buffer_size: 1024 # max number of records the buffer accepts
batch_size: 256 # max number of records the buffer drains after each read
processor:
- string_converter:
upper_case: true
sink:
- stdout:
data-prepper-config.yaml: |
ssl: false
- Service для приложения (svc-data-prepper-server.yml):
apiVersion: v1
kind: Service
metadata:
labels:
app: data-prepper
name: data-prepper-server
spec:
clusterIP: None
ports:
- name: "21890"
port: 21890
targetPort: 21890
selector:
app: data-prepper
- Service для метрик (svc-data-prepper-metrics.yml):
apiVersion: v1
kind: Service
metadata:
labels:
app: data-prepper
name: data-prepper-metrics
spec:
type: NodePort
ports:
- name: "4900"
port: 4900
targetPort: 4900
selector:
app: data-prepper
- Deployment для приложения (dc-data-prepper.yml)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: data-prepper
name: data-prepper
spec:
replicas: 1
selector:
matchLabels:
app: data-prepper
strategy:
type: Recreate
template:
metadata:
labels:
app: data-prepper
spec:
containers:
- args:
- bin/data-prepper
- /etc/data-prepper/pipelines.yaml
- /etc/data-prepper/data-prepper-config.yaml
image: `<path-to-registry>`/data-prepper:latest
name: data-prepper
ports:
- containerPort: 2021
resources: {}
volumeMounts:
- mountPath: /etc/data-prepper
name: prepper-configmap-claim0
imagePullSecrets:
- name: nexuscred
restartPolicy: Always
serviceAccountName: ""
volumes:
- name: prepper-configmap-claim0
configMap:
name: data-prepper-config
В директории k8s с манифестами примените команду:
kubectl apply -f .Проверьте корректность deploy.
В namespace в разделе workloads появится pod с data-prepper, в логах контейнера будут указаны сгенерированные сообщения.
Безопасная конфигурация Data Prepper в корпоративной среде#
Чтобы настроить mTLS между DataPrepper и внешними компонентами (далее в качестве примера будут рассмотрены Search и Kafka) выполните следующие действия:
В первую очередь на кластере Kubernetes установите Synapse Service Mesh или Istio.
Далее включите его в namespace, где размещен DataPrepper:
apiVersion: v1 kind: Namespace metadata: name: data-prepper labels: pod-security.kubernetes.io/enforce: restricted istio-injection: enabled istio.io/rev: istio-systemСоздайте секрет для подключения к Kafka, где будут находиться клиентская пара сертификат-ключ и сертификат УЦ:
kind: Secret apiVersion: v1 metadata: name: kafka-secret namespace: data-prepper data: root.crt: <сертификат удостоверяющего центра в base64> tls.crt: <сертификат клиента в base64> tls.key: <ключ клиента в base64> type: OpaqueСоздайте секрет для подключения к Search:
kind: Secret apiVersion: v1 metadata: name: pvs-secret namespace: data-prepper data: root.crt: <сертификат удостоверяющего центра в base64> tls.crt: <сертификат клиента в base64> tls.key: <ключ клиента в base64> type: OpaqueCоздайте экземпляр istio-egressgateway в том же пространстве имен:
kind: Deployment apiVersion: apps/v1 metadata: name: istio-egressgateway namespace: data-prepper labels: app: istio-egressgateway istio: egressgateway spec: replicas: 1 selector: matchLabels: app: istio-egressgateway istio: egressgateway template: metadata: labels: app: istio-egressgateway istio: egressgateway annotations: istio.io/rev: istio-system sidecar.istio.io/inject: 'false' spec: restartPolicy: Always schedulerName: default-scheduler securityContext: runAsNonRoot: true runAsUser: 1002120000 runAsGroup: 1002120000 fsGroup: 1002120000 seccompProfile: type: RuntimeDefault serviceAccountName: default terminationGracePeriodSeconds: 60 containers: - resources: limits: cpu: '2' memory: 1Gi requests: cpu: 100m memory: 128Mi readinessProbe: httpGet: path: /healthz/ready port: 15021 scheme: HTTP initialDelaySeconds: 1 timeoutSeconds: 1 periodSeconds: 2 successThreshold: 1 failureThreshold: 30 terminationMessagePath: /dev/termination-log name: istio-proxy env: - name: PROXY_CONFIG value: > {"discoveryAddress":"istiod-istio-system.istio-system.svc:15012","drainDuration":"61s","terminationDrainDuration":"59s"} - name: JWT_POLICY value: third-party-jwt - name: PILOT_CERT_PROVIDER value: istiod - name: CA_ADDR value: 'istiod-istio-system.istio-system.svc:15012' - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: INSTANCE_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP - name: HOST_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.hostIP - name: ISTIO_CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpu divisor: '0' - name: SERVICE_ACCOUNT valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.serviceAccountName - name: ISTIO_META_WORKLOAD_NAME value: istio-egressgateway - name: ISTIO_META_OWNER value: >- kubernetes://apis/apps/v1/namespaces/data-prepper/deployments/istio-egressgateway - name: ISTIO_META_MESH_ID value: cluster.local - name: TRUST_DOMAIN value: cluster.local - name: ISTIO_META_UNPRIVILEGED_POD value: 'true' - name: ISTIO_META_CLUSTER_ID value: Kubernetes - name: ISTIO_META_NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName securityContext: capabilities: drop: - ALL privileged: false readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 1002120000 runAsGroup: 1002120000 fsGroup: 1002120000 allowPrivilegeEscalation: false seccompProfile: type: RuntimeDefault ports: - containerPort: 15021 protocol: TCP - containerPort: 8080 protocol: TCP - containerPort: 8443 protocol: TCP - name: http-envoy-prom containerPort: 15090 protocol: TCP imagePullPolicy: Always volumeMounts: - name: kafka-secret mountPath: /etc/istio/kafka-secret readOnly: true - name: pvs-secret mountPath: /etc/istio/pvs-secret readOnly: true - name: workload-socket mountPath: /var/run/secrets/workload-spiffe-uds - name: credential-socket mountPath: /var/run/secrets/credential-uds - name: workload-certs mountPath: /var/run/secrets/workload-spiffe-credentials - name: istio-envoy mountPath: /etc/istio/proxy - name: config-volume mountPath: /etc/istio/config - name: istiod-ca-cert mountPath: /var/run/secrets/istio - name: istio-token readOnly: true mountPath: /var/run/secrets/tokens - name: istio-data mountPath: /var/lib/istio/data - name: podinfo mountPath: /etc/istio/pod - name: egressgateway-certs readOnly: true mountPath: /etc/istio/egressgateway-certs - name: egressgateway-ca-certs readOnly: true mountPath: /etc/istio/egressgateway-ca-certs terminationMessagePolicy: File image: istio/proxyv2:1.20.2 args: - proxy - router - '--domain' - $(POD_NAMESPACE).svc.cluster.local - '--proxyLogLevel=info' - '--proxyComponentLogLevel=misc:error' - '--log_output_level=default:info' volumes: - name: kafka-secret secret: secretName: kafka-secret - name: pvs-secret secret: secretName: pvs-secret - name: workload-socket emptyDir: {} - name: credential-socket emptyDir: {} - name: workload-certs emptyDir: {} - name: istiod-ca-cert configMap: name: istio-ca-root-cert defaultMode: 256 - name: podinfo downwardAPI: items: - path: labels fieldRef: apiVersion: v1 fieldPath: metadata.labels - path: annotations fieldRef: apiVersion: v1 fieldPath: metadata.annotations defaultMode: 256 - name: istio-envoy emptyDir: {} - name: istio-data emptyDir: {} - name: istio-token projected: sources: - serviceAccountToken: audience: istio-ca expirationSeconds: 3600 path: istio-token defaultMode: 256 - name: config-volume configMap: name: istio-istio-system defaultMode: 256 optional: true - name: egressgateway-certs secret: secretName: istio-egressgateway-certs defaultMode: 256 optional: true - name: egressgateway-ca-certs secret: secretName: istio-egressgateway-ca-certs defaultMode: 256 optional: true dnsPolicy: ClusterFirst strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 100% revisionHistoryLimit: 10 progressDeadlineSeconds: 600 --- kind: Service apiVersion: v1 metadata: name: istio-egressgateway namespace: data-prepper labels: app: istio-egressgateway istio: egressgateway spec: ports: - name: http2 protocol: TCP port: 80 targetPort: 8080 - name: https protocol: TCP port: 443 targetPort: 8443 - name: pvs protocol: TCP port: 19200 targetPort: 19200 - name: kafka protocol: TCP port: 9093 targetPort: 9093 internalTrafficPolicy: Cluster selector: app: istio-egressgatewayДля создания доступа к кластеру Kafka из 3 узлов через Istio для начала создайте объект шлюза - Gateway:
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: istio-egressgateway-kafka namespace: data-prepper spec: selector: istio: egressgateway servers: - hosts: - <FQDN узла #1> - <FQDN узла #2> - <FQDN узла #3> port: name: kafka number: 9093 protocol: tcpДля каждого узла кластера Kafka, указанного в Gateway, по примеру ниже создайте VirtualService, ServiceEntry и DestinationRule:
--- apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-external-kafka-1 namespace: data-prepper spec: gateways: - mesh - istio-egressgateway-kafka hosts: - <FQDN узла #1> tcp: - match: - gateways: - mesh port: 9093 route: - destination: host: istio-egressgateway.data-prepper.svc.cluster.local port: number: 9093 - match: - gateways: - istio-egressgateway-kafka port: 9093 route: - destination: host: <FQDN узла #1> port: number: 9093 weight: 100 exportTo: - "." --- apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: se-external-kafka-1 namespace: data-prepper spec: addresses: - <IP-адрес узла #1> exportTo: - . hosts: - <FQDN узла #1> location: MESH_EXTERNAL ports: - name: tcp number: 9093 protocol: TLS --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: dsr-external-kafka-1 namespace: data-prepper spec: host: <FQDN узла #1> trafficPolicy: portLevelSettings: - port: number: 9093 tls: mode: MUTUAL caCertificates: /etc/istio/kafka-secret/root.crt clientCertificate: /etc/istio/kafka-secret/tls.crt privateKey: /etc/istio/kafka-secret/tls.key exportTo: - "."Схожим образом настройте Istio для Search — 1 Gateway и по одному VirtualService, ServiceEntry и DestinationRule для каждого узла, но уже с сертификатами для Search:
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: istio-egressgateway-pvs namespace: data-prepper spec: selector: istio: egressgateway servers: - hosts: - <FQDN узла #1> - <FQDN узла #2> - <FQDN узла #3> port: name: pvs-http number: 19200 protocol: http apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-external-pvs-1 namespace: data-prepper spec: hosts: - <FQDN узла #1> gateways: - mesh - istio-egressgateway-pvs http: - match: - gateways: - mesh port: 19200 route: - destination: host: istio-egressgateway.data-prepper.svc.cluster.local port: number: 19200 - match: - gateways: - istio-egressgateway-pvs port: 19200 route: - destination: host: <FQDN узла #1> port: number: 19200 weight: 100 exportTo: - "." --- apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: se-external-pvs-1 namespace: data-prepper spec: hosts: - <FQDN узла #1> addresses: - <IP-адрес узла #1> endpoints: - address: <IP-адрес узла #1> ports: - name: pvs-http number: 19200 protocol: HTTP resolution: DNS location: MESH_EXTERNAL exportTo: - "." --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: dsr-external-pvs-1 namespace: data-prepper spec: host: <FQDN узла #1> trafficPolicy: portLevelSettings: - port: number: 19200 tls: mode: MUTUAL caCertificates: /etc/istio/pvs-secret/root.crt clientCertificate: /etc/istio/pvs-secret/tls.crt privateKey: /etc/istio/pvs-secret/tls.key workloadSelector: matchLabels: app: istio-egressgateway istio: egressgateway exportTo: - "."
Настройка аудита компонента SRHX#
При старте сервиса компонент Поисковый движок (SRHX) проверяет наличие в директории /etc/opensearch/audit/ файла с настройками аудита audit.yml и при наличии файла применяет его настройки на кластер. Из других директорий применение данного файла невозможно.
Важно
Применение настроек аудита кластера возможно только через файл audit.yml, изменение настроек через файл opensearch.yml, REST-запросы или с помощью скрипта securityadmin.sh заблокировано.
Если файл не найден, то применяются настройки по умолчанию, соответствующие файлу audit.yml ниже
_meta:
type: "audit"
config_version: 2
config:
# enable/disable audit logging
enabled: true
audit:
# Enable/disable REST API auditing
enable_rest: true
# Categories to exclude from REST API auditing
disabled_rest_categories:
# Enable/disable Transport API auditing
enable_transport: true
# Categories to exclude from Transport API auditing
disabled_transport_categories:
# Users to be excluded from auditing. Wildcard patterns are supported. Eg:
# ignore_users: ["test-user1", "test-user2"]
ignore_users:
# Requests to be excluded from auditing. Wildcard patterns are supported. Eg:
# ignore_requests: ["indices:data/read/*", "SearchRequest"]
ignore_requests: []
# Log individual operations in a bulk request
resolve_bulk_requests: true
# Include the body of the request (if available) for both REST and the transport layer
log_request_body: true
# Logs all indices affected by a request. Resolves aliases and wildcards/date patterns
resolve_indices: true
# Exclude sensitive headers from being included in the logs. Eg: Authorization
exclude_sensitive_headers: true
compliance:
# enable/disable compliance
enabled: true
# Log updates to internal security changes
internal_config: true
# Log external config files for the node
external_config: true
# Log only metadata of the document for read events
read_metadata_only: false
# Map of indexes and fields to monitor for read events. Wildcard patterns are supported for both index names and fields. Eg:
# read_watched_fields: {
# "twitter": ["message"]
# "logs-*": ["id", "attr*"]
# }
read_watched_fields: {"*": ["*"]}
# List of users to ignore for read events. Wildcard patterns are supported. Eg:
# read_ignore_users: ["test-user", "employee-*"]
read_ignore_users:
# Log only metadata of the document for write events
write_metadata_only: false
# Log only diffs for document updates
write_log_diffs: true
# List of indices to watch for write events. Wildcard patterns are supported
# write_watched_indices: ["twitter", "logs-*"]
write_watched_indices: ["*"]
# List of users to ignore for write events. Wildcard patterns are supported. Eg:
# write_ignore_users: ["test-user", "employee-*"]
write_ignore_users:
Описание всех параметров указанных в примере audit.yml:
Имя параметра |
Описание |
Значение по умолчанию |
|---|---|---|
config.enabled |
Включение/отключение регистрации событий аудита |
true |
config.audit.enable_rest |
Включение/отключение регистрации событий аудита REST-уровня |
true |
config.audit.disabled_rest_categories |
Перечень типов событий аудита REST-уровня, которые не нужно регистрировать |
- |
config.audit.enable_transport |
Включение/отключение регистрации событий аудита Transport-уровня |
true |
config.audit.disabled_transport_categories |
Перечень типов событий аудита Transport-уровня, которые не нужно регистрировать |
- |
config.audit.ignore_users |
Перечень пользователей, события аудита которых не нужно регистрировать |
- |
config.audit.ignore_requests |
Перечень запросов, события аудита которых не нужно регистрировать |
- |
config.audit.resolve_bulk_requests |
Параметр, отвечающий за регистрацию одного события при массовой реиндексации индексов. При отключении данного параметра каждая реиндексация будет регистрироваться как отдельное событие |
true |
config.audit.log_request_body |
Параметр, отвечающий за наличие тела запроса в событии аудита |
true |
config.audit.resolve_indices |
Параметр, отвечающий за наличие наименования индекса и его псевдонимов в событии аудита. Может быть отключен только вместе с параметром config.audit.log_request_body |
true |
config.audit.exclude_sensitive_headers |
Параметр, отвечающий за исключение чувствительных заголовков из событий аудита. Например, Authorization |
true |
config.compliance.enabled |
Включение/отключение регистрации событий аудита, связанных с изменением настроек индексов и конфигурационных файлов |
true |
config.compliance.internal_config |
Параметр, отвечающий за регистрацию событий аудита, связанных с изменением параметров плагина Security |
true |
config.compliance.external_config |
Параметр, отвечающий за регистрацию событий аудита, связанных с изменением параметров плагина Security через конфигурационные параметры на сервере |
true |
config.compliance.read_metadata_only |
Параметр, отвечающий за наличие в событии аудита метаданных запроса чтения. |
false |
config.compliance.read_watched_fields |
Перечень индексов и полей индекса, которые могут регистрироваться в событиях аудита чтения |
{ |
config.compliance.read_ignore_users |
Перечень пользователей, события чтения индексов которых не нужно регистрировать |
- |
config.compliance.write_metadata_only |
Параметр, отвечающий за наличие в событии аудита метаданных запроса записи |
true |
config.compliance.write_log_diffs |
Параметр, отвечающий за наличие в событии аудита новых и предыдущих метаданных |
true |
config.compliance.write_watched_indices |
Перечень индексов, которые могут регистрироваться в событиях аудита записи данных |
[ |
config.compliance.write_ignore_users |
Перечень пользователей, события записи в индексы которых не нужно регистрировать |
true |
Настройка интеграции#
Настройка интеграции с Secret Management System#
Для включения интеграции с Secret Management System:
Создайте группу Active Directory экземпляра компонента Поисковый движок (SRHX) в Secret Management System.
Активируйте KV-engine и PKI-engine.
Разместите в KV-engine корневой сертификат.
Выпустите PKI-engine роль с привилегиями:
Allow IP Subject Alternative Names;
Use CSR Subject Alternative Names;
Enforce hostnames;
Require Common Name;
Use CSR Common Name;
Allow localhost;
Allow bare domains;
Allow subdomains;
Server flag;
Client flag.
Получите доступ к методу аутентификации
Approle.Получите из Secret Management System параметры role_id и secret_id при помощи API. secret_id и role_id являются данными для доступа к созданным engine в Secret Management System.
Параметр secret_id отправьте по методу wrap Secret Management System с ключом secret_id для получения wrapped-токен. Wrapped-токен – это одноразовый токен (wrapped-token) в виде файла, который необходим для получения secret_id. secret_id и role_id являются данными для доступа к созданному хранилищу в Secret Management System.
Разместите wrapped-токен на файловой системе компонента Поисковый движок (SRHX) в каталоге /etc/opensearch/secman.
Заполните в файле opensearch.yml параметры:
plugins.security.secman.enabled значением true;
Параметры plugins.security.ssl.*
Заполните файл secman.yml. Большинство настроек интеграции с Secret Management System описываются в файле
/etc/opensearch/secman.ymlи считываются при запуске программы. Ниже пример готового файла.
# Блок параметров для авторизации в Secman
# Адрес сервера SecMan-а
plugins.security.secman.address: https://secman.host:secman.port
# Пространство имён SecMan-а (HashiCorp enterprise feature)
plugins.security.secman.namespace: YOUR_NAME_FOR_NAMESPACE
# Значение идентификатора Approle, настроенной в App Role authentication backend
plugins.security.secman.role_id: 11111111-1111-1111-1111-111111
# Блок параметров для wrapped-token
# Имя файла с wrapped-token-ом
plugins.security.secman.wrapped_token.path: /etc/opensearch/secman/approle_wrapped_secret_id
# Блок параметров для KV (Получение траст-сертификатов)
# Тип сертификатов, получаемых из KV
plugins.security.secman.kv.cert.type: pem
# Версия KV движка
plugins.security.secman.kv.engine_version: 1
# Путь до KV движка
plugins.security.secman.kv.mount.path: NAMESPACE/KV/MOUNT/PATH/KV
# Наименование папки в KV, где находится ключ(параметр), в котором лежит цепочка трастовых сертификатов
plugins.security.secman.kv.dir.path: dir_in_your_kv
# Название ключа, в котором находится цепочка трастовых сертификатов в папке "plugins.security.secman.kv.dir.path"
plugins.security.secman.kv.truststore_key: key_name_in_your_kv_dir_for_trust_cert
# Блок параметров для PKI (Генерация сертификатов для PVS)
# Тип сертификатов, получаемых из PKI
plugins.security.secman.pki.cert.type: pem
# Путь до PKI-движка
plugins.security.secman.pki.fetch.mount.path: path_to_PKI_engine
# SberCA-роль для выпуска клиент-серверных сертификатов с проверкой CN по DNS
plugins.security.secman.pki.fetch.role: PKI-client-server-DNS-role-name
# Блок по сертификатам
# Common name для транспортных сертификатов
plugins.security.secman.transport.cn: vm-fqdn
# Common name для сертификата
plugins.security.secman.http.cn: vm-fqdn
# Блок по сертификатам для audit-а
# Common name для сертификата
plugins.security.secman.audit.cn: cn_for_audit_certs
# SberCA-роль для выпуска клиентских сертификатов
plugins.security.secman.audit.pki.role: PKI-client-role-name
# Путь, где будут сохранены клиентские-сертификаты для аудита на диске
plugins.security.ssl.audit.keystore_filepath: /etc/opensearch/secman/certs/audit.jks
# Путь где будут сохранены траст-сертификаты для аудита на диске
plugins.security.ssl.audit.kv.truststore_path: /etc/opensearch/secman/certs/audittrust.jks
Описание всех возможных параметров файла secman.yml
Параметр |
Описание параметра |
Обязательность |
Значение по умолчанию |
|---|---|---|---|
plugins.security.secman.address |
Хост и порт - Адрес Secret Management System |
Да |
- |
plugins.security.secman.namespace |
Используемый namespace |
Да |
- |
plugins.security.secman.role_id |
role_id хранилища Secret Management System |
Да |
- |
plugins.security.secman.role_id.path |
Путь к значению role_id в файле, если его значение не указано в параметре plugins.security.secman.role_id. |
Нет |
Должен быть заполнен либо plugins.security.secman.role_id.path либо plugins.security.secman.role_id. Если заполнены оба параметра, то по умолчанию используется параметр plugins.security.secman.role_id. |
plugins.security.secman.wrapped_token.path |
Место хранения wrapped-токена для получения secret_id |
Да |
– |
plugins.security.secman.pki.fetch.mount.path |
Путь до PKI-engine |
Нет |
PKI |
plugins.security.secman.pki.fetch.role |
Наименование роли PKI движка Secret Management System, которая позволяет выпускать и обновлять сертификаты |
Да |
– |
plugins.security.secman.pki.fetch.client_role |
Имя клиентской роли для доступа к SberCA |
Нет |
Параметры для использования клиент и серверной роли по отдельности, при невозможности использования клиент-серверной роли. В opensearch.yml должен быть указан параметр «plugins.security.ssl.transport.extended_key_usage_enabled» со значением «true». Нельзя одновременно указывать plugins.security.secman.pki.fetch.role и эти параметры.При включении параметров будут автоматически подставлены роли для следующих уровней: |
plugins.security.secman.pki.fetch.server_role |
Имя серверной роли для доступа к SberCA |
Нет |
Параметры для использования клиент и серверной роли по отдельности, при невозможности использования клиент-серверной роли. В opensearch.yml должен быть указан параметр «plugins.security.ssl.transport.extended_key_usage_enabled» со значением «true». Нельзя одновременно указывать plugins.security.secman.pki.fetch.role и эти параметры.При включении параметров будут автоматически подставлены роли для следующих уровней: |
plugins.security.secman.pki.alt_names |
Массив alt names сертификатов |
Да |
– |
plugins.security.secman.pki.cert.type |
Формат PKI сертификатов. Возможные значения pem, pkcs12 и jks. |
Нет |
pkcs12 |
plugins.security.secman.kv.mount.path |
Путь до KV engine |
Да |
– |
plugins.security.secman.kv.engine_version |
Версия KV engine. Возможные варианты заполнения: «1» или «2». Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
1 |
plugins.security.secman.kv.dir.path |
Путь до каталога с секретами в KV engine. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр не заполнен, то для каждого сертификата используется его собственное значение пути, указанное в параметрах …filepath |
plugins.security.secman.kv.truststore_key |
Ключ к цепочке KV сертификатов. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр не заполнен, то для каждого сертификата используется его собственное значение пути, указанное в параметрах …truststore_key |
plugins.security.secman.kv.password_key |
Ключ от пароля к цепочке KV сертификатов. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр не заполнен, то для каждого сертификата используется его собственное значение пути, указанное в параметрах …password_key |
plugins.security.secman.kv.cert.type |
Формат KV сертификатов. Возможные значения pem, pkcs12 и jks. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
pkcs12 |
plugins.security.secman.token.ttl.sec |
Время жизни wrapped-токена. По умолчанию - 86400 секунд (24 часа). ВАЖНО: если в параметре указано значение больше, чем указано на сервере Secret Management System - SRHX будет использовать значение, которое приходит от сервера Secret Management System. Если в параметре указано значение меньше, чем на сервере Secret Management System - SRHX использует значение в параметре plugins.security.secman.token.ttl.sec |
Нет |
86400s |
plugins.security.secman.token.refresh.period.sec |
Период обновления wrapped-токена в секундах |
Нет |
По умолчанию 10/35 периода обновления токена на сервере Secret Management System |
plugins.security.secman.token.secret.key |
Ключ wrapped-токена |
Нет |
secret_id |
plugins.security.secman.open.timeout.sec |
Connection timeout при отправке запроса на Secret Management System сервер. По умолчанию 5 секунд |
Нет |
5 |
plugins.security.secman.read.timeout.sec |
Read timeout при отправке чтении ответа от Secret Management System сервера. По умолчанию 5 секунд |
Нет |
5 |
plugins.security.secman.retries.max |
Максимальное количество повторов каждого запроса к Secret Management System серверу в случае ошибок. По умолчанию 6 попыток |
Нет |
6 |
plugins.security.secman.retries.interval.ms |
Время ожидания между повторами в миллисекундах. |
Нет |
По умолчанию время ожидания между повторами увеличивается экспоненциально с каждой попыткой. Начальное значение - 1с |
plugins.security.secman.cert.ttl.sec |
Время жизни сертификата в секундах. По умолчанию - 2592000 секунд (1 месяц) |
Нет |
2592000s |
plugins.security.secman.cert.refresh.period.sec |
Период запуска проверки обновления сертификата. По умолчанию 3600 секунд (1 час). Как часто SRHX проверяет, не наступил ли момент времени для обновления сертификата равный значению Даты истечения сертификата в секундах минус значение параметра plugins.security.secman.cert.refresh.before.sec |
Нет |
3600s (если plugins.security.secman.cert.ttl.sec больше данного параметра) иначе 2/3 от значения параметра plugins.security.secman.cert.ttl.sec |
plugins.security.secman.cert.refresh.before.sec |
Интервал времени перед моментом устаревания текущего сертификата, в течении которого производятся попытки обновления сертификата. По умолчанию 86400 секунд (24 часа). Интервал времени в секундах, за который необходимо инициировать процесс обновления сертификата до даты его истечения |
Нет |
24h |
plugins.security.secman.alias.certificate |
Alias клиентского (keystore) сертификата |
Нет |
ee |
plugins.security.secman.alias.root |
Alias корневого сертификата |
Нет |
root |
plugins.security.secman.alias.chain |
Alias цепочки сертификатов |
Нет |
private_key |
plugins.security.secman.base64_certs |
Параметр, отвечающий за необходимость раскодирования сертификатов из кодировки Base64. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
true |
plugins.security.secman.base64_passwords |
Параметр, отвечающий за необходимость раскодирования паролей от сертификатов из кодировки Base64. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
false |
plugins.security.secman.auth_method |
Путь к движку аутентификации по approle |
Нет |
approle |
plugins.security.secman.ssl.verify |
Параметр, отвечающий за проверку сертификата Secret Management System для установки доверительного соединения |
Нет |
false |
plugins.security.secman.ssl.truststore_filepath |
Место расположение сертификатов, которые позволяют установить доверительное соединение с Secret Management System |
Да, если plugins.security.secman.ssl.verify равен true |
- |
Настройка сертификата для шифрования внутрикластерного взаимодействия
Параметр |
Описание параметра |
Обязательность |
Значение по умолчанию |
|---|---|---|---|
plugins.security.secman.transport.cn |
CN сертификата транспортного уровня |
Да |
– |
plugins.security.secman.transport.pki.role |
Наименование роли PKI движка Secret Management System для transport уровная |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.pki.fetch.role). Если не заполнен, то значение роли определяется по значению параметра plugins.security.secman.pki.fetch.role |
plugins.security.secman.transport.pki.alt_names |
alt names сертификата транспортного уровня |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.pki.alt_names). Если не заполнен, то значение alt names сертификата определяется по значению параметра plugins.security.secman.pki.alt_names |
Настройки сертификата для шифрования внешнего взаимодействия с кластером
Параметр |
Описание параметра |
Обязательность |
Значение по умолчанию |
|---|---|---|---|
plugins.security.secman.http.cn |
CN сертификата http-уровня |
Да |
- |
plugins.security.secman.http.pki.role |
Наименование роли PKI движка Secret Management System для http уровная |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.pki.fetch.role). Если не заполнен, то значение роли определяется по значению параметра plugins.security.secman.pki.fetch.role |
plugins.security.ssl.http.kv.truststore_filepath |
Наименование папки http.truststore в KV. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если не указано значение, то используется значение параметра plugins.security.secman.kv.dir.path |
plugins.security.ssl.http.kv.truststore_key |
Ключ к цепочке KV http.truststore. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если не указано значение, то используется значение параметра plugins.security.secman.kv.truststore_key |
plugins.security.ssl.http.kv.truststore_template |
Шаблон для валидации сертификата из KV. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.kv.base64_certs). Если не заполнен, то необходимость раскодирования определяется по значению параметра plugins.security.secman.kv.base64_certs |
plugins.security.ssl.http.kv.password_filepath |
Путь к хранилищу пароля для KV http.truststore. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если не указано значение, то используется значение параметра plugins.security.secman.kv.dir.path |
plugins.security.ssl.http.kv.password_key |
Ключ к паролю http.truststore. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если не указано значение, то используется значение параметра plugins.security.secman.kv.password_key |
plugins.security.ssl.http.kv.password_template |
Шаблон для валидации пароля сертификата из KV. Если plugins.security.secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.base64_passwords). Если не заполнен, то необходимость раскодирования определяется по значению параметра plugins.security.secman.base64_passwords |
plugins.security.secman.http.pki.alt_names |
alt names сертификата http уровня |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.pki.alt_names). Если не заполнен, то значение alt names сертификата определяется по значению параметра plugins.security.secman.pki.alt_names |
Настройка сертификата для взаимодействия с провайдером аудита
Важно
Параметры ниже заполняются только в случае, если настроена интеграция с внешним провайдером аудита согласно пункту Настройка интеграции с внешним провайдером аудита. Если интеграция не настроена, то удалите параметры ниже из файла secman.yml.
Параметр |
Описание параметра |
Обязательность |
Значение по умолчанию |
|---|---|---|---|
plugins.security.secman.audit.cn |
CN сертификата для шифрования соединения с провайдером аудита |
Да |
- |
plugins.security.secman.audit.pki.role |
Наименование роли PKI движка Secret Management System для сертификата аудита |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.pki.fetch.role). Если не заполнен, то значение роли определяется по значению параметра plugins.security.secman.pki.fetch.role |
plugins.security.ssl.audit.keystore_filepath |
Путь к месту хранения сертификата аудита |
Да |
- |
plugins.security.ssl.audit.kv.truststore_path |
Путь к хранилищу audit.truststore сертификата аудита |
Да |
- |
plugins.security.ssl.audit.kv.truststore_filepath |
Наименование папки audit.truststore в KV |
Нет |
Если не указано значение, то используется значение параметра plugins.security.secman.kv.dir.path |
plugins.security.ssl.audit.kv.truststore_key |
Ключ к цепочке KV сертификата аудита |
Нет |
Если не указано значение, то используется значение параметра plugins.security.secman.kv.truststore_key |
plugins.security.ssl.audit.kv.truststore_template |
Шаблон для валидации сертификата аудита |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.kv.base64_certs). Если не заполнен, то необходимость раскодирования определяется по значению параметра plugins.security.secman.kv.base64_certs |
plugins.security.ssl.audit.kv.password_filepath |
Путь к хранилищу пароля для KV сертификата аудита |
Нет |
Если не указано значение, то используется значение параметра plugins.security.secman.kv.dir.path |
plugins.security.ssl.audit.kv.password_key |
Ключ к паролю сертификата аудита |
Нет |
Если не указано значение, то используется значение параметра plugins.security.secman.kv.password_key |
plugins.security.ssl.audit.kv.password_template |
Шаблон для валидации пароля KV сертификата аудита |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.base64_passwords). Если не заполнен, то необходимость раскодирования определяется по значению параметра plugins.security.secman.base64_passwords |
plugins.security.secman.audit.pki.alt_names |
alt names сертификата аудита |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру plugins.security.secman.pki.alt_names). Если не заполнен, то значение alt names сертификата определяется по значению параметра plugins.security.secman.pki.alt_names |
Интеграция сервиса Dashboards компонента Поисковый движок (SRHX) с Secret Management System#
Для включения интеграции с Secret Management System:
Разместите в KV-engine корневой сертификат для Dashboards (если ранее загружали корневые сертификаты для Server, то можно не загружать новые, а использовать корневые сертификаты Server).
Для PKI-engine используйте ранее выпущенную роль для компонента Поисковый движок (SRHX).
Параметр secret_id отправьте по методу wrap Secret Management System с ключом secret_id для получения wrapped-токен.
Разместите wrapped-токен на файловой системе сервиса Dashboards компонента Поисковый движок (SRHX) в каталоге
/etc/opensearch-dashboards/secman.Заполните в файле opensearch-dashboards.yml параметры:
secman.enabled значением true;
параметры
server.ssl.*иopensearch.ssl.*.
Заполните файл secman_dashboards.yml. Большинство настроек интеграции с Secret Management System описываются в файле
/etc/opensearch-dashboards/secman_dashboards.ymlи считываются при запуске программы. Ниже пример готового файла.
# Блок параметров для авторизации в Secman
# Адрес сервера SecMan-а
secman.address: https://secman.host:secman.port
# Пространство имён SecMan-а (HashiCorp enterprise feature)
secman.namespace: YOUR_NAME_FOR_NAMESPACE
# Значение идентификатора Approle, настроенной в App Role authentication backend
secman.role_id: 11111111-1111-1111-1111-111111
# Блок параметров для wrapped-token
# Имя файла с wrapped-token-ом
secman.wrapped_token.path: /etc/opensearch-dashboards/secman/approle_wrapped_secret_id
# Блок параметров для KV (Получение траст-сертификатов)
# Тип сертификатов, получаемых из KV
secman.kv.cert.type: pem
# Версия KV движка
secman.kv.engine_version: 1
# Путь до KV движка
secman.kv.mount.path: NAMESPACE/KV/MOUNT/PATH/KV
# Папка в KV
secman.kv.dir.path: dir_in_your_kv
# Ключ в KV
secman.kv.truststore_key: key_name_in_your_kv_dir_for_trust_cert
# Блок параметров для PKI (Генерация сертификатов для PVS)
# Тип сертификатов, получаемых из PKI
secman.pki.cert.type: pem
# Путь до PKI-движка
secman.pki.fetch.mount.path: path_to_PKI_engine
# PKI-роль для выпуска сертификата
secman.pki.fetch.role: PKI-client-server-DNS-role-name
# Блок по сертификатам для взаимодействия Dashboards с кластером PVS
# Common name для сертификата
secman.dashboard.opensearch.cn: hostname_fqdn
# Блок по сертификатам для взаимодействия Dashboards с клиентом
# Common name для сертификата
secman.dashboard.server.cn: hostname_fqdn
Описание всех возможных параметров файла secman_dashboards.yml
Параметр |
Описание параметра |
Обязательность |
Значение по умолчанию |
|---|---|---|---|
secman.enabled |
Включена интеграция Dashboards с Secret Management System |
Да |
- |
secman.address |
Хост и порт - Адрес Secret Management System |
Да |
- |
secman.namespace |
Используемый namespace |
Да |
- |
secman.role_id |
role_id хранилища Secret Management System |
Да |
- |
secman.role_id.path |
Путь к значению role_id в файле, если его значение не указано в параметре secman.role_id. |
Нет |
Должен быть заполнен либо secman.role_id.path либо secman.role_id. Если заполнены оба параметра, то по умолчанию берется параметр указанный последним. |
secman.wrapped_token.path |
Место хранения wrapped-токена для получения secret_id |
Да |
– |
secman.pki.fetch.mount.path |
Путь до PKI-engine |
Нет |
PKI |
secman.pki.fetch.role |
Наименование роли PKI движка Secret Management System, которая позволяет выпускать и обновлять сертификаты |
Да |
– |
secman.pki.cert.type |
Формат PKI сертификатов. Возможные значения pem, pkcs12 и jks. |
Нет |
pkcs12 |
secman.pki.alt_names |
Массив alt names сертификатов |
Нет |
– |
secman.kv.mount.path |
Путь до KV engine |
Да |
– |
secman.kv.engine_version |
Версия KV engine. Возможные варианты заполнения: «1» или «2». Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
1 |
secman.kv.dir.path |
Путь до каталога с секретами в KV engine. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр не заполнен, то для каждого сертификата используется его собственное значение пути, указанное в параметрах path |
secman.kv.truststore_key |
Ключ к цепочке KV сертификатов. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр не заполнен, то для каждого сертификата используется его собственное значение пути, указанное в параметрах …truststore_key |
secman.kv.password_key |
Ключ от пароля к цепочке KV сертификатов |
Нет |
Если параметр не заполнен, то для каждого сертификата используется его собственное значение пути, указанное в параметрах …password_key |
secman.kv.cert.type |
Формат KV сертификатов. Возможные значения pem, pkcs12 и jks. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
pkcs12 |
secman.token.ttl.sec |
Время жизни wrapped-токена. По умолчанию - 86400 секунд (24 часа). ВАЖНО: если в параметре указано значение больше, чем указано на сервере Secret Management System - SRHX будет использовать значение, которое приходит от сервера Secret Management System. Если в параметре указано значение меньше, чем на сервере Secret Management System - SRHX использует значение в параметре secman.token.ttl.sec |
Нет |
86400s |
secman.token.refresh.period.sec |
Период обновления wrapped-токена в секундах |
Нет |
По умолчанию 10/35 периода обновления токена на сервере Secret Management System |
secman.token.secret.key |
Ключ wrapped-токена |
Нет |
secret_id |
secman.open.timeout.sec |
Connection timeout при отправке запроса на Secret Management System сервер. По умолчанию 5 секунд |
Нет |
5 |
secman.read.timeout.sec |
Read timeout при отправке чтении ответа от Secret Management System сервера. По умолчанию 5 секунд |
Нет |
5 |
secman.retries.max |
Максимальное количество повторов каждого запроса к Secret Management System серверу в случае ошибок. По умолчанию 6 попыток |
Нет |
6 |
secman.retries.interval.ms |
Время ожидания между повторами в миллисекундах. |
Нет |
По умолчанию время ожидания между повторами увеличивается экспоненциально с каждой попыткой. Начальное значение - 1с |
secman.cert.ttl.sec |
Время жизни сертификата в секундах. По умолчанию - 2592000 секунд (1 месяц) |
Нет |
2592000s |
secman.cert.refresh.period.sec |
Период запуска проверки обновления сертификата. По умолчанию 3600 секунд (1 час). Как часто SRHX проверяет, не наступил ли момент времени для обновления сертификата равный значению «Даты истечения сертификата» в секундах минус значение параметра secman.cert.refresh.before.sec |
Нет |
3600s (если secman.cert.ttl.sec больше данного параметра) иначе 2/3 от значения параметра secman.cert.ttl.sec |
secman.cert.refresh.before.sec |
Интервал времени перед моментом устаревания текущего сертификата, в течении которого производятся попытки обновления сертификата. По умолчанию 86400 секунд (24 часа). Интервал времени в секундах, за который необходимо инициировать процесс обновления сертификата до даты его истечения |
Нет |
24h |
secman.ssl.verify |
Параметр, отвечающий за проверку сертификата Secret Management System для установки доверительного соединения |
Нет |
false |
secman.ssl.truststore_filepath |
Место расположение сертификатов, которые позволяют установить доверительное соединение с Secret Management System |
Да, если secman.ssl.verify равен true |
- |
secman.kv.base64_certs |
Параметр, отвечающий за необходимость раскодирования сертификатов из кодировки Base64. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
true |
secman.kv.base64_passwords |
Параметр, отвечающий за необходимость раскодирования паролей от сертификатов из кодировки Base64. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
false |
secman.auth_method |
Путь к движку аутентификации по approle |
Нет |
approle |
Настройка сертификата для шифрования взаимодействия Dashboards с кластером SRHX
Параметр |
Описание параметра |
Обязательность |
Значение по умолчанию |
|---|---|---|---|
secman.dashboard.opensearch.cn |
CN сертификата transport-уровня |
Да |
- |
secman.dashboard.opensearch.pki.role |
Наименование роли PKI движка Secret Management System для внутрикластерного уровня |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру secman.pki.fetch.role). Если не заполнен, то значение роли определяется по значению параметра secman.pki.fetch.role |
secman.dashboard.opensearch.kv.truststore_path |
Наименование папки transport.truststore в KV. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если не указано значение, то используется значение параметра secman.kv.dir.path |
secman.dashboard.opensearch.kv.truststore_key |
Ключ к цепочке KV transport.truststore. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если не указано значение, то используется значение параметра secman.kv.truststore_key |
secman.dashboard.opensearch.kv.truststore_template |
Шаблон для валидации сертификата из KV. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру secman.base64_certs). Если не заполнен, то необходимость раскодирования определяется по значению параметра secman.base64_enabled |
secman.dashboard.opensearch.kv.password_path |
Путь к хранилищу пароля для KV transport.truststore. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если не указано значение, то используется значение параметра secman.kv.dir.path |
secman.dashboard.opensearch.kv.password_key |
Ключ к паролю transport.truststore. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если не указано значение, то используется значение параметра secman.kv.password_key |
secman.dashboard.opensearch.kv.password_template |
Шаблон для валидации пароля сертификата из KV. Если secman.kv.mount.path не заполнен, то парметр не обязательный |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру secman.base64_passwords). Если не заполнен, то необходимость раскодирования определяется по значению параметра secman.base64_enabled |
secman.dashboard.opensearch.pki.alt_names |
alt names сертификата внутрикластерного уровня |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру secman.pki.alt_names). Если не заполнен, то значение alt names сертификата определяется по значению параметра secman.pki.alt_names |
Настройка сертификата для шифрования взаимодействия Dashboards с клиентом
Параметр |
Описание параметра |
Обязательность |
Значение по умолчанию |
|---|---|---|---|
secman.dashboard.server.cn |
CN сертификата http-уровня |
Да |
- |
secman.dashboard.server.pki.role |
Наименование роли PKI движка Secret Management System для шифрования взаимодействия Dashboards с клиентом |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру secman.pki.fetch.role). Если не заполнен, то значение роли определяется по значению параметра secman.pki.fetch.role |
secman.dashboard.server.kv.truststore_path |
Наименование папки http.truststore в KV |
Нет |
Если не указано значение, то используется значение параметра secman.kv.dir.path |
secman.dashboard.server.kv.truststore_key |
Ключ к цепочке KV http.truststore |
Нет |
Если не указано значение, то используется значение параметра secman.kv.truststore_key |
secman.dashboard.server.kv.truststore_template |
Шаблон для валидации сертификата из KV |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру secman.base64_certs). Если не заполнен, то необходимость раскодирования определяется по значению параметра secman.base64_enabled |
secman.dashboard.server.kv.password_path |
Путь к хранилищу пароля для KV http.truststore |
Нет |
Если не указано значение, то используется значение параметра secman.kv.dir.path |
secman.dashboard.server.kv.password_key |
Ключ к паролю http.truststore |
Нет |
Если не указано значение, то используется значение параметра secman.kv.password_key |
secman.dashboard.server.kv.password_template |
Шаблон для валидации пароля сертификата из KV |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру secman.base64_passwords). Если не заполнен, то необходимость раскодирования определяется по значению параметра secman.base64_enabled |
secman.dashboard.server.pki.alt_names |
alt names сертификата взаимодействия Dashboards с клиентом |
Нет |
Если параметр заполнен, то используется значение параметра (даже если значение противоречит параметру secman.pki.alt_names). Если не заполнен, то значение alt names сертификата определяется по значению параметра secman.pki.alt_names |
Настройка интеграции с внешним провайдером аудита#
Установка плагина Аудита#
Плагин Аудита находится в составе плагина Security и устанавливается вместе с ним.
Настройка внешнего провайдера Аудита#
Включение Аудита в SRHX
Для включения аудита и для того, что бы opensearch начал использовать плагин аудита, в opensearch.yml добавьте/измените параметр типа аудита plugins.security.audit.type на ru.sbt.audit.PlatformVAuditSink.
sudo nano /etc/opensearch/opensearch.yml
Пропишите:
plugins.security.audit:
type: ru.sbt.audit.PlatformVAuditSink
Настройка параметров Аудита
Большинство настроек Аудита описываются в файле /etc/opensearch/audt-appl.properties и считываются при запуске программы.
Замените все содержимое файла (удалите весь текст в существующем фале) /etc/opensearch/audt-appl.properties текстом, указанным в готовом образе audt-appl.properties, изменив необходимые значения.
Готовый образец audt-appl.properties
#Шаблон конфигурации аудита для использования в компании
#Подставьте необходимые значения там, где требуется.
#Символы < > указывают значения, которые требуется заменить. При подстановке необходимых значений символы < > использовать не нужно.
#Метод балансировки между группами.
#STD - для переключения на вторую группу, при отказе первой. DUP - всегда писать в обе группы одновременно.
union-audit.circuit-breaker.mode=<STD/DUP>
#Код подсистемы
UFS_SUBSYSTEM_CODE=<PLATFORM_V_SEARCH>
#Имя приложения, которое пишет события
EAR_NAME=<PLATFORM_V_SEARCH>
#Версия приложения, которое пишет события
EAR_VERSION=<R1.3>
#Заполнять в соответствии с вашим стендом
CHANNEL=<SUPPORT>
SECTOR=<DICT>
#Если события аудита нужно писать в формате UNION
#Кластер kafka 1
union-audit.kafka.kafka_1.bootstrap.servers=<sample-efs-kafka-server-01:9093>,<sample-efs-kafka-server-02:9093>
union-audit.kafka.kafka_1.security.protocol=SSL
union-audit.kafka.kafka_1.ssl.enabled.protocols=TLSv1.2
union-audit.kafka.kafka_1.request.timeout.ms=1500
union-audit.kafka.kafka_1.delivery.timeout.ms=1500
union-audit.kafka.kafka_1.topic.audit-events-crit-in=<your.events_topic>
union-audit.kafka.kafka_1.topic.audit-events-uncrit-in=<your.events_topic>
union-audit.kafka.kafka_1.topic.audit-metamodel-in=<your.metamodel_topic>
union-audit.balance_group.union_audit.main=true
union-audit.balance_group.union_audit.priority=-1
union-audit.balance_group.union_audit.eventProtocol=UNION
union-audit.balance_group.union_audit.balanceMode=RR
union-audit.balance_group.union_audit.providers=kafka_1
union-audit.balance_group.union_audit.circuit_breaker.failureThreshold=1
#Если события аудита нужно писать в формате AVRO
# Кластер kafka 2
union-audit.kafka.kafka_2.bootstrap.servers=<sample-union-kafka-server-01:9093>
union-audit.kafka.kafka_2.security.protocol=SSL
union-audit.kafka.kafka_2.ssl.enabled.protocols=TLSv1.2
union-audit.kafka.kafka_2.request.timeout.ms=1500
union-audit.kafka.kafka_2.delivery.timeout.ms=1500
union-audit.kafka.kafka_2.topic.audit-events-crit-in=<your.events_topic>
union-audit.kafka.kafka_2.topic.audit-events-uncrit-in=<your.events_topic>
union-audit.kafka.kafka_2.topic.audit-metamodel-in=<your.metamodel_topic>
union-audit.balance_group.union_audit_2.main=false
union-audit.balance_group.union_audit_2.priority=-1
union-audit.balance_group.union_audit_2.eventProtocol=AVRO
union-audit.balance_group.union_audit_2.balanceMode=RR
union-audit.balance_group.union_audit_2.providers=kafka_2
union-audit.balance_group.union_audit_2.circuit_breaker.failureThreshold=1
#Если события аудита нужно писать в формате UFS
# Кластер kafka 3
union-audit.kafka.kafka_3.bootstrap.servers=<sample-kafka-3-server-01:9093>,<sample-kafka-3-server-02:9093>
union-audit.kafka.kafka_3.security.protocol=SSL
union-audit.kafka.kafka_3.ssl.enabled.protocols=TLSv1.2
union-audit.kafka.kafka_3.request.timeout.ms=1500
union-audit.kafka.kafka_3.delivery.timeout.ms=1500
union-audit.kafka.kafka_3.topic.audit-events-crit-in=<your.events_topic>
union-audit.kafka.kafka_3.topic.audit-events-uncrit-in=<your.events_topic>
union-audit.kafka.kafka_3.topic.audit-metamodel-in=<your.metamodel_topic>
# Группа для отправки сообщений в формате AVRO
union-audit.balance_group.union_audit_3.main=false
union-audit.balance_group.union_audit_3.priority=0
union-audit.balance_group.union_audit_3.eventProtocol=UFS
union-audit.balance_group.union_audit_3.balanceMode=RR
union-audit.balance_group.union_audit_3.providers=kafka_3
union-audit.balance_group.union_audit_3.circuit_breaker.failureThreshold=1
**Настройки ниже идут по умолчанию в продукте Platform V Search**
#Если нужно изменить данные настройки, то укажите их в файле audt-appl.properties как показано ниже
#Максимальное количество отправляемых сообщений уровня WARN
#Quota.Threshold.Warn.Count=50000
#Максимальное значение общего размера отправляемых событий уровня WARN
#Quota.Threshold.Warn.TotalSize=50000
#Максимальное количество отправляемых сообщений уровня ERROR
#Quota.Threshold.Error.count=100000
#Максимальное значение общего размера отправляемых событий уровня ERROR
#Quota.Threshold.Error.TotalSize=100000
#Время эскалации с уровня WARN до уровня ERROR в секундах
#Quota.Escalation.Period=2
#Количество попыток отправки batch сообщений уровня WARN
#Batch.Send.Timeout.Warning.Quota=1
#Количество попыток отправки batch сообщений уровня ERROR
#Batch.Send.Timeout.Error.Quota=2
#Параметр, задающий максимальное количество асинхронно выполняемых задач отправки некритичных событий аудита
#Async.SendUncritical.Max.Tasks=1000
#Параметр, задающий таймаут опроса буфера асинхронных задач в мс.
#LocalBuffer.Queue.CheckInterval=50000
#Параметр, задающий размер локального буфера.
#LocalBuffer.Size=52428800
#Параметр, задающий таймаут ожидания асинхронной отправки в мс.
#LocalBuffer.Async.SendTimeout=50000
#Максимальный размер события аудита
#audit.properties.maxRequestSize=1000000
#Максимамльный размер параметра события аудита
#audit.properties.maxBaseParameterSize=1024
#Максимальное количество потоков в threadpool в кме
#audit.ufs.client_module.context.pool.parallelism=30
#Использовать ли валидатор КМа для проверки правильности полей и событий аудита
#ufs.use.validator=false
#Перезаписывать значение userNode значением remote adress
#UserNode.NotOverride=true
#Выключает логи
#disableLogs=false
Описание всех возможных настроек параметров в audt-appl.properties:
Имя параметра |
Описание |
|---|---|
circuit-breaker.mode |
Режим отправки событий (стандартный - STD /дублированный - DUP) |
UFS_SUBSYSTEM_CODE |
Код подсистемы |
EAR_NAME |
Имя приложения, которое пишет события |
EAR_VERSION |
Версия приложения, которое пишет события |
Kafka (union-audit.kafka.) |
- |
kafka-1.bootstrap.servers |
Имя хоста и порт для подключения к главному кластеру 1 |
kafka-2.bootstrap.servers |
Имя хоста и порт для подключения к резервному кластеру 2 |
kafka_1.ssl.endpoint.identification.algorithm |
Алгоритм идентификации кластера 1 |
kafka_2.ssl.endpoint.identification.algorithm |
Алгоритм идентификации кластера 2 |
kafka_1.security.protocol |
Протокол безопасности подключения к кластеру 1 |
kafka_2.security.protocol |
Протокол безопасности подключения к кластеру 2 |
kafka_1.ssl.enabled.protocols |
Список протоколов кластеру кластера 1, поддерживающихся SSL |
kafka_2.ssl.enabled.protocols |
Список протоколов кластеру кластера 2, поддерживающихся SSL |
kafka_1.request.timeout.ms |
Максимальное время (в миллисекундах), в течение которого клиент будет ждать ответа от сервера для кластера 1. Если сервер не ответит в течение этого времени, запрос будет считаться неудачным |
kafka_2.request.timeout.ms |
Максимальное время (в миллисекундах), в течение которого клиент будет ждать ответа от сервера для кластера 2. Если сервер не ответит в течение этого времени, запрос будет считаться неудачным |
kafka_1.delivery.timeout.ms |
Максимальное время (в миллисекундах), в течение которого запись будет пытаться доставиться перед тем, как будет считаться неудачной в кластера 1 |
kafka_2.delivery.timeout.ms |
Максимальное время (в миллисекундах), в течение которого запись будет пытаться доставиться перед тем, как будет считаться неудачной в кластера 2 |
kafka_1.topic.audit-events-crit-in |
Наименование topic с событиями уровня CRITICAL для кластера 1 |
kafka_2.topic.audit-events-crit-in |
Наименование topic с событиями уровня CRITICAL для кластера 2 |
kafka_1.topic.audit-events-uncrit-in |
Наименование topic с событиями уровня UNCRITICAL для кластера 1 |
kafka_2.topic.audit-events-uncrit-in |
Наименование topic с событиями уровня UNCRITICAL для кластера 2 |
kafka_1.topic.audit-metamodel-in |
Наименование topic регистрации метамоделей для кластера 1 |
kafka_2.topic.audit-metamodel-in |
Наименование topic регистрации метамоделей для кластера 2 |
kafka_1/kafka_2.batch.size |
Максимально допустимый размер пакета сообщений в байтах для кластера 1/2 |
kafka_1/kafka_2.buffer.memory |
Максимально допустимый объем памяти в байтах, которое КМ кластера 1/2 может использовать для буферизации сообщений, ожидающих отправки на сервер |
kafka_1/kafka_2.compression.type |
Тип сжатия для всех данных для кластера 1/2 (none, gzip, snappy, lz4, zstd) |
kafka_1/kafka_2.connections.max.idle.ms |
Время в миллисекундах, спустя которое будут закрыты все бездействующие соединения для кластера 1/2 |
kafka_1/kafka_2.linger.ms |
Время задержки перед отправкой пакета событий в миллисекундах для кластера 1/2. За это время в пакет могут добавиться дополнительные события |
kafka_1/kafka_2.max.block.ms |
Эта настройка определяет время блокировки методов Kafka кластера 1/2 |
kafka_1/kafka_2.max.request.size |
Максимальный размер запроса в байтах для кластера 1/2 |
kafka_1/kafka_2.metadata.max.age.ms |
Интервал в миллисекундах, после которого происходит принудительное обновление метаданных, для раннего обнаружения новых брокеров и разделов кластера 1/2 |
kafka_1/kafka_2.receive.buffer.bytes |
Размер TCP-буфера для получения данных для кластера 1/2. Если установлено значение -1, будет использоваться значение по умолчанию для операционной системы. |
kafka_1/kafka_2.send.buffer.bytes |
Размер TCP-буфера для отправки данных для кластера 1/2. Если установлено значение -1, будет использоваться значение по умолчанию для операционной системы. |
Группы балансировки (union-audit.balance_group.) |
- |
union_audit.main |
Признак основного провайдера аудита. По умолчанию true |
union_audit_2.main |
Признак основного провайдера аудита. По умолчанию false |
union_audit.providerClass, union_audit_2.providerClass |
Класс провайдера |
union_audit.priority, union_audit_2.priority |
Приоритет отправки сообщений. По умолчанию - 1 |
union_audit.eventProtocol, union_audit_2.eventProtocol |
Формат отправки сообщений. (OPM AC Единый аудит - параметр UNION, back - параметр UFS, front - параметр AVRO) |
union_audit.balanceMode, union_audit_2.balanceMode |
Метод балансировки. По умолчанию - RR. (RR - round robin, WRR - weighted round robin) |
union_audit.circuit_breaker.recoveryTimeout, union_audit_2.circuit_breaker.recoveryTimeout |
Время восстановления соединения |
union_audit.circuit_breaker.successThreshold, union_audit_2.circuit_breaker.successThreshold |
Максимальное количество попыток отправки сообщений |
union_audit.circuit_breaker.mode, union_audit_2.circuit_breaker.mode |
Режим работы circuit breaker. По умолчанию – ERROR_WINDOW |
union_audit.circuit_breaker.failureThreshold, union_audit_2.circuit_breaker.failureThreshold |
Минимальное количество попыток отправки событий |
union_audit.circuit_breaker.failureRateThreshold, union_audit_2.circuit_breaker.failureRateThreshold |
Максимальный процент ошибок в потоке запросов, после превышения которого Circuit breaker перейдет в режим OPEN - поток запросов будет прерван |
union_audit.maxMsgSizeBytes, union_audit_2.maxMsgSizeBytes |
Максимальный размер сообщения |
union_audit.providers, union_audit_2.providers |
Провайдер, к которому применяются настройки.(Значения kafka_1 или kafka_2) |
Quota.Threshold.Warn.Count |
Максимальное количество отправляемых сообщений уровня WARN |
Quota.Threshold.Warn.TotalSize |
Максимальное значение общего размера отправляемых событий уровня WARN |
Quota.Threshold.Error.count |
Максимальное количество отправляемых сообщений уровня ERROR |
Quota.Threshold.Error.TotalSize |
Максимальное значение общего размера отправляемых событий уровня ERROR |
Quota.Escalation.Period |
Время эскалации с уровня WARN до уровня ERROR в секундах |
Batch.Send.Timeout.Warning.Quota |
Количество попыток отправки batch сообщений уровня WARN |
Batch.Send.Timeout.Error.Quota |
Количество попыток отправки batch сообщений уровня ERROR |
Async.SendUncritical.Max.Tasks |
Параметр, задающий максимальное количество асинхронно выполняемых задач отправки некритичных событий аудита |
POOL_PARALLELISM |
Размер пула для асинхронной отправки некритичных сообщений. Минимальное значение - 1. Если указать значение меньше минимального, то будет применено значение по умолчанию (16) |
LocalBuffer.Queue.CheckInterval |
Параметр, задающий таймаут опроса буфера асинхронных задач в мс. |
LocalBuffer.Size |
Параметр, задающий размер локального буфера. |
LocalBuffer.Async.SendTimeout |
Параметр, задающий таймаут ожидания асинхронной отправки в мс. |
audit.properties.maxRequestSize |
Максимальный размер события аудита |
audit.properties.maxBaseParameterSize |
Максимамльный размер параметра события аудита |
audit.ufs.client_module.context.pool.parallelism |
Максимальное количество потоков в threadpool в кме |
ufs.use.validator |
Использовать ли валидатор КМа для проверки правильности полей и событий аудита |
UserNode.NotOverride |
Перезаписывать значение userNode значением remote adress |
disableLogs |
Выключает логи |
Настройка SSL соединения#
При подключении по протоколу SSL укажите плагин месторасположения сертификатов и паролей от них в виде аргументов для java машины в файле /etc/opensearch/audt-appl.properties.
Внимание!
Выполнение данного пункта для компонента SRHX требуется для обеспечения работы при недоступности Secret Management System.
Параметры необходимые для работы плагина аудита по SSL:
# Полный путь до keystore с сертификатами для подключения к kafka
audit.kafka.ssl.keystore.location=/etc/opensearch/secman/certs/keystore.jks
# Полный путь до keystore с корневым сертификатом для подключения к kafka
audit.kafka.ssl.keystore.location=/etc/opensearch/secman/certs/keystore.jks
Для этого откройте файл /etc/opensearch/audt-appl.properties и укажите в нем эти переменные, заменив значения на необходимые.
sudo nano /etc/opensearch/audt-appl.properties
audit.kafka.ssl.keystore.location=/etc/opensearch/secman/certs/keystore.jks
audit.kafka.ssl.truststore.location=/etc/opensearch/secman/certs/truststore.jks
Добавление параметров в opensearch-keystore
Добавьте в opensearch-keystore пароли от keystore с сертификатами шифрования Аудита. Это будут параметры:
plugins.security.ssl.audit.keystore_password_secure. Пароль от keystore с сертификатом для шифрования соединения Аудита. (сертификаты для подключения к kafka).
plugins.security.ssl.audit.truststore_password_secure. Пароль от keystore с корневым сертификатом для шифрования соединения Аудита.
Внимание!
opensearch-keystoreбудет создан для пользователя linux, от которого будут запускаться команды. Не выполняйте команды из-подroot! Используйте для этого пользователяopensearch.
Создайте keystore с помощью параметра create, если он еще не был создан до этого.
Если keystore был создан при конфигурации сервера, перейдите к шагу добавления параметров.
Создание нового хранилища
#создаем хранилище, если оно еще не существует
sudo su - opensearch -c '/usr/share/opensearch/bin/opensearch-keystore create'
Добавьте необходимые параметры при помощи параметра add.
sudo su - opensearch -c '/usr/share/opensearch/bin/opensearch-keystore add plugins.security.ssl.audit.keystore_password_secure'
#после команды будет ожидать ввода данных
sudo su - opensearch -c '/usr/share/opensearch/bin/opensearch-keystore add plugins.security.ssl.audit.truststore_password_secure'
#после команды будет ожидать ввода данных
Настройка интеграции с компонентом IAM Proxy/СУДИР (опционально)#
Методы аутентификации настраиваются в файле config.yml, который находится в /etc/opensearch/opensearch-security/.
Пример стандартного config.yml
---
_meta:
type: "config"
config_version: 2
config:
dynamic:
#do_not_fail_on_forbidden: false
http:
anonymous_auth_enabled: false
xff:
enabled: false
internalProxies: '192\.168\.0\.10|192\.168\.0\.11' # regex pattern
#internalProxies: '.*' # trust all internal proxies, regex pattern
#remoteIpHeader: 'x-forwarded-for'
authc:
basic_internal_auth_domain:
description: "Authenticate via HTTP Basic against internal users database"
http_enabled: true
transport_enabled: true
order: 0
http_authenticator:
type: basic
challenge: true
authentication_backend:
type: intern
proxy_auth_domain:
description: "Authenticate via proxy"
http_enabled: false
transport_enabled: false
order: 1
http_authenticator:
type: proxy
challenge: false
config:
user_header: "x-proxy-user"
roles_header: "x-proxy-roles"
authentication_backend:
type: noop
jwt_auth_domain:
description: "Authenticate via Json Web Token"
http_enabled: false
transport_enabled: false
order: 2
http_authenticator:
type: jwt
challenge: false
config:
signing_key: "base64 encoded HMAC key or public RSA/ECDSA pem key"
jwt_header: "Authorization"
jwt_url_parameter: null
jwt_clock_skew_tolerance_seconds: 30
roles_key: null
roles_sub_key: null
subject_key: null
authentication_backend:
type: noop
clientcert_auth_domain:
description: "Authenticate via SSL client certificates"
http_enabled: false
transport_enabled: false
order: 3
http_authenticator:
type: clientcert
config:
username_attribute: cn #optional, if omitted DN becomes username
challenge: false
authentication_backend:
type: noop
Описание основных используемых параметров указанных в примере config.yml:
Имя параметра |
Описание |
|---|---|
config.dynamic: do_not_fail_on_forbidden: false |
Не показывать ошибку или отказ пользователю, если у него нет прав доступа к обращаемому адресу/полю/сегменту |
config.dynamic.http: anonymous_auth_enabled: false |
Разрешить доступ неавторизованным пользователям. По умолчанию false. |
config, dynamic, authc |
Здесь происходит перечисление тех методов аутентификации, которые будут использоваться в данном кластере |
basic_internal_auth_domain: |
Имя метода |
description: |
Краткое описание метода |
http_enabled: true |
Включить работу метода на HTTP-уровне |
transport_enabled: true |
Включить работу метода на транспортном-уровне |
order: 4 |
Порядок вызова данного метода. |
http_authenticator: |
Блок настройки параметров данного метода аутентификации |
type: basic |
Тип используемой аутентификации. |
challenge: true |
Требовать запрос данных при каждом запросе. Сервер будет ожидать заголовки аутентификации в запросе |
authentication_backend: |
Блок настройки проверки аутентификационных данных |
type: intern |
Тип проверки. |
http_authenticator:config:roles_sub_key |
В параметре должно быть установлено значение параметра токена с дополнительными ролями пользователя |
Настройка аутентификации с IAM/СУДИР без проверки токена#
Внимание!
Для соединения с компонентом IAM Proxy в компоненте SRHX должны использоваться сертификаты, подписанные тем же УЦ, что и сертификаты в
Proxy.
Замените все содержимое файла
/etc/opensearch/opensearch-security/config.ymlна текст, указанный ниже:config.yml для Proxy
_meta: type: "config" config_version: 2 config: dynamic: http: anonymous_auth_enabled: false xff: enabled: true remoteIpHeader: "x-forwarded-for" internalProxies: "SRHX-ip-address" authc: proxy_auth_domain: description: "Authenticate via proxy" http_enabled: true transport_enabled: true order: 0 http_authenticator: type: proxy challenge: false config: user_header: "x-proxy-user" roles_header: "x-proxy-roles" authentication_backend: type: noop basic_internal_auth_domain: description: "Authenticate via HTTP Basic against internal users database" http_enabled: true transport_enabled: true order: 1 http_authenticator: type: basic challenge: false authentication_backend: type: internПри заполнении используйте следующие параметры.
Имя параметра |
Описание |
|---|---|
xff: |
|
remoteIpHeader |
В данном заголовке передаются все адреса серверов прокси, которые будут использоваться. Все остальные адреса, которые не будут здесь указаны, система будет считать клиентскими. |
internalProxies |
Вместо |
proxy_auth_domain.http_authenticator: |
|
user_header |
Должно быть указано имя заголовка HTTP-запроса, в котором будет содержаться логин пользователя |
roles_header |
Должно быть указано имя заголовка HTTP-запроса, в котором будут содержаться роли пользователя. Роли отправляются самим прокси |
x-proxy-user и x-proxy-roles – стандартные названия заголовков. Точное значение параметра уточните у владельца прокси.
Внимание!
После редактирования файла
config.yml, примените новые значения, с помощью запуска скриптаsecurityadmin.sh. Этот процесс подробно описан в разделе Настройка методов аутентификации/авторизации и ролевой модели в пункте Применение данных к кластеру данного документа.
Добавьте в файл
opensearch_dashboards.ymlследующие параметры:Пример заполнения файла opensearch_dashboards.yml:
opensearch_dashboards.yml для Proxy
server: host: "имя хоста" port: порт basePath: /pvs rewriteBasePath: true ssl: enabled: true keystore.path: /etc/opensearch/certs/keystore.p12 opensearch: hosts: - https://имя хоста SRHX сервера:порт ssl: alwaysPresentCertificate: true verificationMode: full certificateAuthorities: /etc/opensearch/certs/keystore.p12 keystore.path: /etc/opensearch/certs/keystore.p12 requestHeadersAllowlist: - authorization - securitytenant - x-forwarded-for - x-proxy-user - x-proxy-roles logging: dest: /var/log/opensearch-dashboards.log json: false verbose: true opensearch_security: auth.type: "proxy" proxycache: user_header: "x-proxy-user" roles_header: "x-proxy-roles" cookie.secure: trueДля настройки соединения заполните следующие параметры:
Имя параметра |
Описание |
|---|---|
opensearch.requestHeadersAllowlist |
В данном параметре перечисляются имена заголовков, которые будут считываться из HTTP-запроса. |
opensearch_security.auth.type |
Отвечает за разрешенные типы аутентификации - данный параметр должен иметь значение |
opensearch_security.proxycache.user_header |
Должно быть указано имя заголовка HTTP-запроса, в котором будет содержаться логин пользователя |
opensearch_security.proxycache.roles_header |
Должно быть указано имя заголовка HTTP-запроса, в котором будут содержаться роли пользователя. Роли отправляются самим прокси |
Если подключение происходит к прокси, у которого существует несколько ответвлений, то дополнительно должны быть заполнены следующие параметры:
Имя параметра |
Описание |
|---|---|
server.basePath |
Данный параметр должен содержать адрес ответвления. Например, если ответвление на IAM находится по адресу |
server.rewriteBasePath |
Данный параметр позволяет вырезать указанный выше дополнительный адрес из запросов к серверу. Должен быть в значении |
Внимание!
После внесенных изменений перезагрузите компонент SRHX.
Настройка аутентификации с IAM Proxy/СУДИР с проверкой токена#
Замените все содержимое файла
/etc/opensearch/opensearch-security/config.ymlна текст, указанный ниже:config.yml для JWT
_meta: config_version: 2 type: config config: dynamic: http: anonymous_auth_enabled: false xff: enabled: false authc: openid_auth_domain: description: Authenticate via proxy http_enabled: true transport_enabled: true order: 0 http_authenticator: type: openid challenge: false config: openid_connect_url: https://your-iam-proxy/auth/realms/PlatformAuth/.well-known/openid-configuration openid_connect_idp: enable_ssl: true verify_hostnames: false pemtrustedcas_filepath: /etc/opensearch/certs/ca.crt jwks_uri: https://your-iam-proxy/auth/realms/PlatformAuth/protocol/openid-connect/certs insider_jwt_field: null insider_jwt_value: null insider_jwt_role: null subject_key: sub roles_key: groups authentication_backend: type: noop basic_internal_auth_domain: description: "Authenticate via HTTP Basic against internal users database" http_enabled: true transport_enabled: true order: 1 http_authenticator: type: basic challenge: false authentication_backend: type: internЗаполните:
Имя параметра |
Описание |
|---|---|
openid_connect_url |
Должна быть указана ссылка на параметры конфигурации OIDC. Обычно ссылка имеет вид |
openid_connect_idp.pemtrustedcas_filepath |
Должен быть указан путь к корневому сертификату, который использует провайдер |
jwks_uri |
Должна быть указана ссылка на место хранения публичных ключей конфигурации OIDC |
insider_jwt_field |
Должен быть указан ключ JWT токена, в котором содержится описание дополнительной роли (если применимо) |
insider_jwt_value |
Должно быть указано значение поля JWT токена, при котором применяется дополнительная роль (если применимо) |
insider_jwt_role |
Должно быть указано наименование дополнительной роли (если применимо) |
subject_key |
Должно быть установлено значение параметра токена с логином пользователя |
roles_key |
Должно быть установлено значение параметра токена с ролями пользователя |
Внимание!
После редактирования файла
config.yml, примените новые значения, с помощью запуска скриптаsecurityadmin.sh. Этот процесс подробно описан в разделе Настройка методов аутентификации/авторизации и ролевой модели в пункте Применение данных к кластеру данного документа.
Добавьте в файл
opensearch_dashboards.ymlследующие параметры:Пример заполнения файла opensearch_dashboards.yml:
opensearch_dashboards.yml для JWT
server: host: "имя хоста" port: порт basePath: /pvs rewriteBasePath: true ssl: enabled: true keystore.path: /etc/opensearch/certs/keystore.p12 opensearch: hosts: - https://имя хоста SRHX сервера:порт ssl: alwaysPresentCertificate: true verificationMode: full certificateAuthorities: /etc/opensearch/certs/keystore.p12 keystore.path: /etc/opensearch/certs/keystore.p12 requestHeadersAllowlist: - authorization - securitytenant logging: dest: /var/log/opensearch-dashboards.log json: false verbose: true opensearch_security: auth.type: "jwt" jwt.enabled: true # jwt.url_param: "url_param" cookie.secure: trueДля настройки соединения заполните следующие параметры:
Имя параметра |
Описание |
|---|---|
opensearch.requestHeadersAllowlist |
В данном параметре перечисляются имена заголовков, которые сервис будет считывать из HTTP-запроса. |
opensearch_security.auth.type |
Отвечает за разрешенные типы авторизации – данный параметр должен иметь значение |
opensearch_security.jwt.enabled |
Должен быть в значении |
opensearch_security.jwt.url_param |
Если токен передается не в HTTP-заголовке, а как параметр URL, то нужно указать этот параметр здесь |
Внимание!
После внесенных изменений перезагрузите компонент SRHX.
Настройка плагина KNN#
Для работы плагина KNN установите пакет openblas.
sudo yum install openblas
Обновление#
Для обновления на новую версию или переустановки компонента SRHX:
Очистите директорию
/usr/share/opensearch/*.Распакуйте новую версию компонента SRHX в эту директорию.
Измените владельца и права на директорию и файлы.
Установите плагины для компонента SRHX. Каталог
/etc/opensearchнет необходимости изменять, даже при обновлении версии компонента SRHX. Все настройки сохраняются и автоматически будут обновлены.
Удаление#
Удаление дополнительных средств защиты информации осуществляется в соответствии с документацией к ним. Для удаления компонента SRHX необходимо удалить главную папку opensearch и opensearch-dashboards:
sudo rm -rf /usr/share/opensearch /usr/share/opensearch-dashboards
Проверка работоспособности#
Учетная запись под которой осуществляется проверка, должна иметь достаточно прав, для этих действий. В стандартной ролевой модели можно использовать admin/admin.
После настройки шифрования работает HTTPs, необходимо подставить используемые сертификаты на сервере в запрос.
Пример запроса через curl с сертификатами:
curl -XGET https://host:ХХХХХ/_cluster/health \
--cacert /etc/opensearch/certs/root.crt \
--cert /etc/opensearch/certs/pvs.crt \
--key /etc/opensearch/certs/pvs.key \
-u admin:admin
Проверка жизнеспособности кластера cluster/health#
GET https://host:ХХХХХ/_cluster/health
Пример ответа:

Проверка доступности компонента SRHX#
GET https://host:ХХХХХ/
Пример ответа:

Проверка работоспособности компонента SRHX#
systemctl status opensearch
systemctl status opensearch-dashboards
Если будут ошибки, то сервис будет в статусе failed.
Системные ошибки можно увидеть в самом статусе или выполнив следующую команду:
cat /var/log/messages
Для Dashboards так же доступен файл /SRHX/logs/opensearch-dashboards/stdout.log.
Ошибки программы можно увидеть в файле:
для компонента Search - /SRHX/logs/opensearch/<имя_кластера>.log;
для компонента Search-Dashboards - /SRHX/logs/opensearch-dashboards/opensearch-dashboards.log.
Если все сервисы успешно запущены, то проверить работоспособность Search можно следующими способами:
Через компонент Search-Dashboards. Во вкладке Инструменты разработки (dev tools) отправьте необходимые запросы к серверу.


Отправьте rest-запросы напрямую к Search, например через insomnia или curl, обязательно подставив в запрос сертификаты и логин/пароль пользователя внутри Search. По умолчанию это пользователь admin с паролем, указанным на форме заказа. Сертификаты можно использовать любые, подписанные тем же УЦ, что и сертификаты Search.
Выполните запросы GET _cluster/health и GET _cat/nodes?v и убедитесь, что доступны все node и кластер имеет статус green.
Пример вывода запроса.
Запрос GET _cluster/health
{
"cluster_name": "DEV_SRHX_TEST",
"status": "green",
"timed_out": false,
"number_of_nodes": 13,
"number_of_data_nodes": 10,
"discovered_master": true,
"discovered_cluster_manager": true,
"active_primary_shards": 73,
"active_shards": 155,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100
}
Запрос GET _cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role node.roles cluster_manager name
ip_node_1 15 91 5 0.43 0.37 0.37 m cluster_manager * master-node-02
ip_node_2 42 99 19 3.96 4.43 4.21 d data - data-node-02
ip_node_3 46 98 26 4.23 4.70 4.86 d data - data-node-05
ip_node_4 10 98 5 0.81 0.74 0.66 m cluster_manager - master-node-01
ip_node_5 25 99 23 6.69 5.20 4.63 d data - data-node-04
ip_node_6 16 98 31 3.79 3.94 3.99 d data - data-node-07
ip_node_7 31 99 22 2.60 3.11 3.68 d data - data-node-10
ip_node_8 74 86 5 0.50 0.42 0.37 m cluster_manager - master-node-03
ip_node_9 50 96 17 4.55 5.40 5.09 d data - data-node-01
ip_node_10 42 97 19 2.36 3.79 4.11 d data - data-node-03
ip_node_11 23 99 23 6.01 5.53 5.30 d data - data-node-06
ip_node_12 16 98 20 4.58 3.81 3.82 d data - data-node-09
ip_node_13 12 97 23 4.70 4.49 4.52 d data - data-node-08
Проверка наличия плагинов#
После успешной установки компонента необходимо проверить, что плагины были установлены.
Проверить в пришедшем списке присутствие всех устанавливаемых плагинов на каждой node.
GET https://host:ХХХХХ/_cat/plugins?v
Пример ответа:

Внимание!
Для работы HealthCheck-плагина необходимо включить возможность анонимных запросов. Это настраивается в
config.ymlи применяется с помощью скриптаsecurityadmin.sh.
Параметр:
config:
dynamic:
http:
anonymous_auth_enabled: true
Плагин HealthCheck отвечает за периодическую отправку запросов к компоненту, проверяющих жизнеспособность. Проверьте, что данный Endpoint работоспособен.
Перейдите в браузере по адресу https://host:ХХХХХ/ufs-healthcheck/test или выполните запрос к healthcheck:
GET https://host:ХХХХХ/ufs-healthcheck/<любой англ текст>
Пример ответа:

Проверка работоспособности плагина Prometheus-exporter#
Плагин Prometheus-exporter отвечает за сбор метрик кластера и создания endpoint с доступом к собранным данными в формате prometheus. Проверьте, что данный endpoint работоспособен.
GET https://host:ХХХХХ/_prometheus/metrics
Пример ответа:

Проверка корректной работоспособности аудита#
Настройте стенд компонента SRHX с плагином Security.
Выполните запрос на проверку включения аудита.
Проверьте, что параметр
enabled: true и параметрenabled: true в объекте complianceGET https://host:port/_opendistro/_security/api/audit
Basic Auth: admin/admin
Пример ответа:
{ "_readonly": [], "config": { "compliance": { "enabled": true, "write_log_diffs": false, "read_watched_fields": {}, "read_ignore_users": [ "kibanaserver" ], "write_watched_indices": [], "write_ignore_users": [ "kibanaserver" ], "read_metadata_only": true, "write_metadata_only": true, "external_config": false, "internal_config": true }, "enabled": true, "audit": { "ignore_users": [ "kibanaserver" ], "ignore_requests": [], "disabled_rest_categories": [ "AUTHENTICATED", "GRANTED_PRIVILEGES" ], "disabled_transport_categories": [ "AUTHENTICATED", "GRANTED_PRIVILEGES" ], "log_request_body": true, "resolve_indices": true, "resolve_bulk_requests": false, "exclude_sensitive_headers": true, "enable_transport": true, "enable_rest": true } } }Выполните запрос на создание индекса
test_auditи загрузку в него документа через пользователяadmin.PUT https://host:port/_bulk
Body:
{ "index" : { "_index" : "test_audit", "_id" : "0001" } } { "technic": "ноут – это моя жизнь в этом мире","furniture": "стол, стул","companies": "mycompany","date": "xxxx-xx-xxT10:30:00","specialists": "лидер разработчик","rating": 2,"status": true,"colors": "Багровый красный изотоп","age": 1,"phrases": "Шел по лесу и увидел дуб"}Basic Auth: admin/admin
Для Postman или аналогичных ПО в запросе требуется оставлять последнюю строчку пустой.
Ответ 200 ОК
{ "acknowledged": true, "shards_acknowledged": true, "index": "test_audit" }Перейдите в Kafka и найдите событие
REST_AUTHENTICATEDпо наименованию индексаtest_audit.Пример события в Kafka:
{ "createdAt": 1700747748148, "id": "4b8ce32c-fd36-4d9a-a52a-3a3d8e715c27", "metamodelVersion": "589F77C656B584E63087FD87C8AC0E6F32B47DC52B8773C186D79B47F8BA0997", "metamodelHash": "3F9F54E6444A91F5BBBABF2D0AC746F5E6E81C55B117952D8C252197AC20D7D9", "module": "PLATFORM_V_SEARCH", "name": "SEARCH_PLUGIN_AUDIT_REST_AUTHENTICATED", "nodeId": "", "requestId": null, "userName": "", "userLogin": "admin", "userNode": "{значение}", "session": "NO SESSION", "sourceSystem": "UFS", "tags": [], "params": [ { "name": "CLUSTER_NAME", "value": "srhx_mono_cluster" }, { "name": "IS_ADMIN_DN", "value": "false" }, { "name": "NODE_HOST_ADDRESS", "value": "{значение}" }, { "name": "NODE_HOST_NAME", "value": "{значение}" }, { "name": "NODE_ID", "value": "Y_MN0sMuT7iRe_fXsbjrlg" }, { "name": "NODE_NAME", "value": "{значение}" }, { "name": "REQUEST_BODY", "value": "{ \"index\" : {\"_id\" : \"0001\" } }\n{ \"technic\": \"Ноут\",\"furniture\": \"стол, стул\",\"companies\": \"mycompany\",\"trees\": \"Дуб\",\"specialists\": \"лидер разработчик\",\"games\": \"Прятки\",\"sports\": \"Футбол\",\"colors\": \"Багровый красный\",\"age\": 1,\"phrases\": \"Шёл по лесу и увидел дуб\",\"location\":\"34.423,58.432\"}\n{ \"index\" : {\"_id\" : \"0002\" } }\n{ \"technic\": \"Комп\",\"furniture\": \"Диван\",\"companies\": \"mycompany\",\"trees\": \"Дубы\",\"specialists\": \"Тестировщик\",\"games\": \"Догонялки\",\"sports\": \"Баскетбол\",\"colors\": \"Багровый\",\"age\":\"1\",\"phrases\": \"На холме росла высокая липа\",\"location\":\"36.683,54.983\"}\n" }, { "name": "REQUEST_EFFECTIVE_USER", "value": "admin" }, { "name": "REQUEST_INITIATING_USER", "value": "admin" }, { "name": "REQUEST_LAYER", "value": "REST" }, { "name": "REST_REQUEST_HEADERS", "value": "{Accept\u003d[*/*], User-Agent\u003d[PostmanRuntime/7.31.3], Connection\u003d[keep-alive], Postman-Token\u003d[0b355216-27ca-427b-83a1-e18f7d441049], Host\u003d[ADDRESS:19200], Accept-Encoding\u003d[gzip, deflate, br], Content-Length\u003d[742], Content-Type\u003d[application/json]}" }, { "name": "REST_REQUEST_METHOD", "value": "PUT" }, { "name": "REST_REQUEST_PARAMS", "value": "{index\u003dtest_audit}" }, { "name": "REST_REQUEST_PATH", "value": "/test_audit/_bulk" }, { "name": "UTC_TIMESTAMP", "value": "2023-11-23T13:55:48.147+00:00" }, { "name": "ufs.auditContextUUID", "value": "8146cb89-dc1b-4303-954d-384394847cdf" }, { "name": "ufs.categoryCode", "value": "OTHER" }, { "name": "ufs.channel", "value": "PVS" }, { "name": "ufs.criticality", "value": "UNCRITICAL" }, { "name": "ufs.earName", "value": "PLATFORM_V_SEARCH" }, { "name": "ufs.earVersion", "value": "R1.2" }, { "name": "ufs.employeeLogin", "value": null }, { "name": "ufs.gosbCode", "value": null }, { "name": "ufs.groupCode", "value": "SEARCH_PLUGIN_AUDIT" }, { "name": "ufs.isInitContext", "value": "true" }, { "name": "ufs.isSuccess", "value": "true" }, { "name": "ufs.orgUid", "value": null }, { "name": "ufs.osbCode", "value": null }, { "name": "ufs.sector", "value": "XXX" }, { "name": "ufs.serverLocation", "value": "{значение}" }, { "name": "ufs.terBankCode", "value": null }, { "name": "ufs.vspCode", "value": null } ], "changedParams": [] }
Проверка работоспособности internal users при настроенной аутентификации OIDC (JWT)#
Произведите настройку в opensearch-security/config.yml в соответствии с разделом Настройка аутентификации с IAM Proxy/СУДИР с проверкой токена данного руководства.
Если доступ отсутствует, то обратитесь к администратору стенда, чтобы он настроил параметры для конфигурационных параметров сервера.
Выполните запрос к серверу без выбора параметра авторизации.
GET https://host:port/No Auth
Ответ 401
Отображается ошибка о том что пользователь не авторизован.
Выполните запрос к серверу с выбором Basic Auth авторизации и пользователем IAM.
GET https://host:port/Basic Auth
user IAM / password IAM
Ответ 401
Отображается ошибка о том что пользователь не авторизован, так как пользователь не существует на сервере.
Выполните запрос для проверки, что internal user может отправить запрос на сервер.
GET https://host:port/Basic Auth: admin / admin
Ответ 200 ОК
Отображается информация о сервере.
Проверка работоспособности internal users при настроенной аутентификации IAM Proxy#
Произведите настройку в opensearch-security/config.yml в соответствии с разделом Настройка аутентификации с IAM/СУДИР без проверки токена данного руководства.
Выполните запрос к серверу без выбора параметра авторизации.
GET https://host:port/No Auth
Ответ 401
Отображается ошибка о том, что пользователь не авторизован.
Выполните запрос к серверу с выбором Basic Auth авторизации и пользователя IAM.
GET https://host:port/Basic Auth
Если доступ отсутствует, то обратитесь к администратору стенда.
Ответ 401
Отображается ошибка о том, что пользователь не авторизован, так как пользователь не существует на сервере.
Выполните запрос к серверу, используя
Basic Authи пользователя admin.GET https://host:port/Basic Auth: admin / admin
Ответ 200 ОК
Отображается информация о сервере.
Откат#
Процедура отката предполагает откат максимум до предыдущей версии. Обязательные интеграции осуществляются в соответствии с разделами настоящего документа. При откате на предыдущую версию обязательные интеграции с компонентами Платформы поддерживают обратную совместимость.
Автоматической процедуры отката нет.
Откат к предыдущей версии компонента SRHX представляет собой удаление и установку последней стабильной версии компонента SRHX.
Для отката необходимо выполнить установку предыдущей стабильной версии компонента SRHX в соответствии с разделом Установка текущего документа.
Часто встречающиеся проблемы и пути их устранения#
При возникновении проблемы с отображением страницы конкретного шаблона индекса рекомендуется:
открыть файл .i18nrc.json, вызвав команду sudo nano /usr/share/opensearch-dashboards/.i18nrc.json;
в параметре translations (в стандартном файле - 76 строка) убрать значение в двойных кавычках (например, было
translations:translations/ru.json, сталоtranslations: [];сохранить файл .i18nrc.json;
перезагрузить сервис dashboards, чтобы применить изменения.
Чек-лист валидации установки#
Убедитесь, что выполнена подготовка окружения согласно разделу Подготовка окружения данного документа.
Выполните проверку работоспособности компонента SRHX согласно разделу Проверка работоспособности настоящего документа.