Руководство по установке#

В руководстве приведены инструкции по установке компонента Поисковой движок (SRHX) продукта Platform V Search (SRH).

Расшифровку основных понятий см. в документе "Термины и определения".

Системные требования#

Настройки безопасности окружения и перечень платформенных (дополнительных внешних) продуктов, используемых для установки, настройки и контроля в конечной информационной системе (далее — ИС), выбираются при разработке конечной ИС, исходя из характера обрабатываемой в ней информации и иных требований информационной безопасности (далее — ИБ), предъявляемых к ней.

Системное программное обеспечение#

Ниже представлены категории системного программного обеспечения (далее — ПО), которые обязательны или опциональны для установки, настройки, контроля и функционирования компонента SRHX. В каждой категории перечислены все поддерживаемые продукты сторонних правообладателей. Отдельно обозначены варианты, которые рекомендует АО «СберТех» (маркировка «Рекомендовано» в столбце «Продукт, функциональная совместимость с которым подтверждена»). Клиенту необходимо выбрать один из продуктов в каждой категории, исходя из условий использования конечной ИС.

Категория ПО

Обязательность установки*

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

Версия

Продукт, функциональная совместимость с которым подтверждена**

Описание

Операционная система

Да

ОС Альт 8 СП

8.2 и выше

Рекомендовано

Среда для запуска модулей компонента

Red Hat Enterprise Linux

8 и выше

Опционально. Правообладателем АО «СберТех» также рекомендован компонент Операционная система INST продукта Platform V SberLinux OS Server SLO, см. раздел «Платформенные зависимости»

Среда для запуска модулей компонента

Java-машина

Да

OpenJDK

17.0.2 и выше

Рекомендовано

Окружение для работы модулей компонента

Программная платформа

Да

NodeJS

18.16.1 и выше

Рекомендовано

Среда выполнения JS

Система управления доступом к информационным ресурсам

Нет

СУДИР

любая актуальная версия

Опционально. Правообладателем АО «СберТех» также рекомендован компонент IAM Proxy продукта Platform V IAM SE, см. раздел «Платформенные зависимости»

Сервис управления доступом и информационными ресурсами

Брокер сообщений

Нет

Kafka

2.7.0

Опционально. Правообладателем АО «СберТех» также рекомендован брокер сообщений, основанный на Kafka, – Platform V Corax, см. раздел «Платформенные зависимости»

Событийный обмен сообщениями между модулями компонента

Примечание

*

  • Да — категория ПО обязательна для функционирования сервиса (это означает, что сервис не может выполнять свои базовые функции без установки данной категории ПО).

  • Нет — категория ПО необязательна для функционирования сервиса (это означает, что сервис может выполнять свои базовые функции без установки данной категории ПО).

**

  • Рекомендовано — рекомендованный правообладателем АО «СберТех» продукт.

  • Опционально — альтернативный по отношению к рекомендованному правообладателем АО «СберТех» продукт.

Платформенные зависимости#

Для настройки, контроля и функционирования компонента реализована интеграция с программными продуктами, правообладателем которых является АО «СберТех»:

Наименование продукта

Код

Версия

Код и наименование компонента

Обязательность установки (да/нет)***

Описание

Аналог других производителей****

Platform V IAM SE

IAM

1.7 и выше

AUTH IAM Proxy

Нет

Сервис управления доступом и информационными ресурсами

СУДИР

Platform V SberLinux OS Server

SLO

8.8 и выше

INST Операционная система

Нет

Операционная система на базе ядра Linux для запуска контейнеризированных приложений

Red Hat Enterprise Linux, ОС Альт 8 СП

Platform V Corax

KFK

8.340.1 и выше

KFKA Corax

Нет

Программный брокер сообщений, представляющий собой распределенную, отказоустойчивую, реплицированную и легко масштабируемую систему передачи сообщений, рассчитанную на высокую пропускную способность

Kafka

Примечание:

***

  • Да — компонент или продукт необходим для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данного компонента).

  • Нет — необязательный для функционирования сервиса компонент или продукт (это означает, что сервис может выполнять свои основные функции без установки данного компонента).

**** Рекомендуется установка программного продукта, правообладателем которого является АО «СберТех», при этом не исключена возможность (допускается правообладателем) использования аналога других производителей. Аналоги, в отношении которых продукт успешно прошел испытания и подтвердил свою работоспособность, указаны в разделе «Системное программное обеспечение».

Аппаратные требования#

Для установки компонента SRHX требуется следующая конфигурация аппаратного обеспечения:

Варианты установки

CPU

RAM

Диск под систему

run-test

2 ядра

2 GB

HDD: 15GB

minimum

4 ядра

8 GB

HDD: 20GB

medium

8 ядра

16 GB

HDD/SSD: 75GB

optimal

16 ядер

32GB

SSD/SSD: 200GB

high-load

32 ядер

64GB

SSD: 300GB

Требования к окружению для установки программного компонента#

Компонент 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

Сбор и отправка событий аудита

Выбор способа установки#

Единственным и целевым способом установки является ручной способ.

Подготовка окружения#

Пользователи в компоненте SRHX#

  1. Создайте пользователей. Описание создания пользователей выполнено в разделе Создание пользователя данного документа.

  • opensearch;

  • opensearch-dashboards.

  1. Добавьте созданных пользователей в группы.

Ниже представлен пример, когда пользователи созданы с таким же паролем, как и их имя. Возможно изменить значения после "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

Добавление переменных для работы компонента SRHX#

  1. Пропишите системные переменные в файл ".bashrc". Переменные пользователей, под которыми будет выполнен запуск компонента SRHX:

  • "OPENSEARCH_JAVA_HOME";

  • "OPENSEARCH_PATH_CONF";

  • "OSD_PATH_CONF".

  1. Примените обновленный файл командой 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 – пути до каталога с конфигурационными файлами для компонента SRHX.

Изменение параметров компонента SRHX#

  1. Установите значение системных параметров "vm.max_map_count = 262144" и "vm.swappiness=0" в файле "/etc/sysctl.conf".

  2. Примените обновленные значения командой "sysctl -p".

  3. Отключите использование swap:

sudo swapoff -a
sudo sh -c "echo -e 'vm.swappiness=0\nvm.max_map_count=262144' >> /etc/sysctl.conf && sysctl -p"

Внимание! Обязательно проверьте значения в данном файле. Если они уже присутствуют, то их необходимо изменить вручную. После применения команды, указанной выше, произойдет дублирование параметров, если они уже существуют.

  1. Проверьте текущее значение или примененные изменения командой:

cat /proc/sys/vm/max_map_count

Изменение лимитов пользователей#

Повысьте лимиты для пользователей, которые будут выполнять запуск компонента SRHX. Это позволит в дальнейшем запускать программы вручную и не получать ошибки от компонента SRHX.

  1. Создайте файлы "/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
  1. Проверьте, что параметр для пользователя задан верно и его значение равно установленному в предыдущем пункте. Проверка возможна только под пользователем, для которого применяли значение:

sudo su opensearch -c 'ulimit -u -n -l'
sudo su opensearch-dashboards -c 'ulimit -u -n'
  1. Посмотрите полный список лимитов:

sudo su opensearch -c 'ulimit -a'
sudo su opensearch-dashboards -c 'ulimit -a'

Создание необходимых директорий#

Создайте необходимые директории для распаковки дистрибутива:

sudo mkdir /usr/share/opensearch
sudo mkdir /etc/opensearch
sudo mkdir /var/log/opensearch
sudo mkdir /var/lib/opensearch
sudo mkdir /usr/share/opensearch-dashboards
sudo mkdir /etc/opensearch-dashboards
sudo mkdir /var/log/opensearch-dashboards

Установка#

Ручная установка сервиса#

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

Распаковка дистрибутива#

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

  1. Загрузите полученный дистрибутив на сервер, распакуйте его и перейдите в созданную директорию:

unzip srhx-1.2-*-distrib.zip -d /tmp && cd /tmp/srhx/
  1. Выполните следующие команды из директории, где находятся распакованные файлы.

[user@vm-name srhx]$ pwd
/tmp/srhx/
[user@vm-name srhx]$ ls -l
total 443700
-rw-r--r-- 1 user user   5741089  audit.zip
-rw-r--r-- 1 user user 108092858  dashboard-2.7.1-SNAPSHOT.zip
-rw-r--r-- 1 user user   1268364  index-management-dashboards-2.7.1.zip
-rw-r--r-- 1 user user   9771017 notifications-dashboards-2.7.1.zip
-rw-r--r-- 1 user user   8276862 opensearch-index-management-2.7.1-SNAPSHOT.zip
-rw-r--r-- 1 user user    808897  opensearch-job-scheduler-2.7.1-SNAPSHOT.zip
-rw-r--r-- 1 user user   2465905  opensearch-notifications-2.7.1-SNAPSHOT.zip
-rw-r--r-- 1 user user  10702700  opensearch-notifications-core-2.7.1-SNAPSHOT.zip
-rw-r--r-- 1 user user  40717425  opensearch-security-2.7.1-SNAPSHOT.zip
-rw-r--r-- 1 user user    150543  prometheus-exporter-2.7.1-SNAPSHOT.zip
-rw-r--r-- 1 user user  46750603  search-healthcheck-plugin-0.0.3.zip
-rw-r--r-- 1 user user 224121025  search-server-2.7.1-SNAPSHOT.zip
-rw-r--r-- 1 user user   1187501  security-dashboards-2.7.1.zip

Установка компонента SRHX#

Выполните команды для распаковки дистрибутива:

sudo unzip -q ./search-server-*-SNAPSHOT.zip -d /usr/share/opensearch/
sudo mv /usr/share/opensearch/config/* /etc/opensearch/ && sudo rm -rf /usr/share/opensearch/config/
sudo mv opensearch-security-*-SNAPSHOT.zip opensearch-index-management-*-SNAPSHOT.zip opensearch-job-scheduler-*-SNAPSHOT.zip opensearch-notifications-*-SNAPSHOT.zip opensearch-notifications-core-*-SNAPSHOT.zip prometheus-exporter-*-SNAPSHOT.zip search-healthcheck-plugin-*.zip /usr/share/opensearch/  
sudo unzip -q ./dashboard-*-SNAPSHOT.zip -d /usr/share/opensearch-dashboards/
sudo mv security-dashboards-*.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/

Установка прав. Наделение правами владельца#

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

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 775 -R /usr/share/opensearch/jdk/
sudo chmod 750 -R /var/log/opensearch
sudo chmod 750 /etc/opensearch
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

Установка плагинов#

  1. Установка плагинов происходит от пользователя, под которым запускается компонент SRHX. Например, для компонента SRHX – пользователи opensearch и opensearch-dashboards.(Не устанавливайте плагины из под root!).

  2. При распаковке дистрибутива переместите все плагины в корневую директорию программы "/usr/share/opensearch/" или "/usr/share/opensearch-dashboards/". Далее при установке плагинов будет использоваться данный путь. Если плагины находятся в другом месте, укажите полный путь до них и проверьте, имеется ли доступ у пользователя opensearch и opensearch-dashboards.

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

sudo su - opensearch -c 'yes | /usr/share/opensearch/bin/opensearch-plugin install \
file:///usr/share/opensearch/opensearch-security-2.7.1-SNAPSHOT.zip \
file:///usr/share/opensearch/opensearch-job-scheduler-2.7.1-SNAPSHOT.zip \
file:///usr/share/opensearch/opensearch-index-management-2.7.1-SNAPSHOT.zip \
file:///usr/share/opensearch/opensearch-notifications-core-2.7.1-SNAPSHOT.zip \
file:///usr/share/opensearch/opensearch-notifications-2.7.1-SNAPSHOT.zip \
file:///usr/share/opensearch/search-healthcheck-plugin-0.0.3.zip \
file:///usr/share/opensearch/prometheus-exporter-2.7.1-SNAPSHOT.zip'
 
sudo su - opensearch-dashboards -c 'yes | /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin install file:///usr/share/opensearch-dashboards/security-dashboards-2.7.1.zip'
sudo su - opensearch-dashboards -c 'yes | /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin install file:///usr/share/opensearch-dashboards/notifications-dashboards-2.7.1.zip'
sudo su - opensearch-dashboards -c 'yes | /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin install file:///usr/share/opensearch-dashboards/index-management-dashboards-2.7.1.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
  1. После установки плагина безопасности потребуется настройка шифрования. Для тестового запуска можно временно отключить плагин безопасности, и проверить работоспособность программы. Для этого в файл "/etc/opensearch/opensearch.yml" добавьте строку 'plugins.security.disabled: true'.

sudo sh -c "echo -e 'plugins.security.disabled: true' >> /etc/opensearch/opensearch.yml"

Создание Unit services и их запуск#

  1. Убедитесь, что все пути указаны корректно.

  2. Создайте Unit services для Server:

sudo nano /etc/systemd/system/opensearch.service
  1. Добавьте:

[Unit]
Description=Platform V Search
Wants=network-online.target
After=network-online.target
 
[Service]
Type=forking
RuntimeDirectory=opensearch
PrivateTmp=true
 
Environment=MAX_LOCKED_MEMORY=unlimited
Environment=OPENSEARCH_PATH_CONF=/etc/opensearch
Environment=PID_DIR=/var/run/opensearch
 
WorkingDirectory=/usr/share/opensearch
ExecStart=/usr/share/opensearch/bin/opensearch -d -p ${PID_DIR}/opensearch.pid
 
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
  1. Создайте следующий Unit services:

sudo nano /etc/systemd/system/opensearch-dashboards.service
  1. Добавьте в Unit services:

[Unit]
Description=Platform V Search 2
Wants=network-online.target
After=network-online.target
 
[Service]
Type=simple
User=opensearch-dashboards
Group=opensearch-dashboards
 
Environment=OSD_PATH_CONF=/etc/opensearch-dashboards
WorkingDirectory=/usr/share/opensearch-dashboards/
ExecStart=/bin/bash -c '/usr/share/opensearch-dashboards/bin/opensearch-dashboards &> /var/log/opensearch-dashboards/stdout.log'
 
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
  1. Выполните перезагрузку systemd:

sudo systemctl daemon-reload
  1. Добавьте сервисы в автозагрузку:

sudo systemctl enable opensearch.service
sudo systemctl enable opensearch-dashboards.service
  1. Запустите сервисы:

sudo systemctl start opensearch 
sudo systemctl start opensearch-dashboards

Настройка компонента 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=admin, O=SBT
  • Сертификаты должны быть в формате PKCS#8. Замените все содержимое файла (удалите весь текст в существующем фале) "/etc/opensearch/opensearch.yml".

### Шаблон безопасной конфигурации сервера для использования в компании.
### Подставьте необходиме значения там, где требуется.
### Символы < > указывают значения, которые требуется заменить. При подстановке необходимых значений символы < > использовать не нужно.
 
bootstrap.memory_lock: true
 
# Настройки хоста
network.host: <FQDN или IP текущего хоста>
http.port: ХХХХХ
transport.port: ХХХХХ
 
# Настройки кластера
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 в кластере>:ХХХХХ
  - <FQDN или IP node 2 в кластере>:ХХХХХ
  - <FQDN или IP node 3 в кластере>:ХХХХХ
 
# Настройки для хранения данных и логов текущей node
path.data: /var/lib/opensearch
path.logs: /var/log/opensearch
 
# Настройки плагина Security
plugins.security.disabled: false
 
plugins.security.ssl.http:
  enabled: true
  pemcert_filepath: "<путь к сертификату для шифрования http-уровня и rest-запросов>"
  pemkey_filepath: "<путь к приватному ключу от сертификата для шифрования http-уровня и rest-запросов>"
  pemtrustedcas_filepath: "<путь к корневому сертификату, для шифрования http-уровня и rest-запросов>"
  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:
  enabled: true
  pemcert_filepath: "<путь к сертификату для межкластерного шифрования>"
  pemkey_filepath: "<путь к приватному ключу от сертификата для межкластерного шифрования>"
  pemtrustedcas_filepath: "<путь к корневому сертификату, для межкластерного шифрования>"
  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 сертификата администратора>,O=<организация которая подписала>'
plugins.security.nodes_dn:
  - 'CN=<Common Name межкластерного сертификата>,O=<организация которая подписала>'
 
plugins.security.audit:
  type: internal_opensearch
  config.disabled_rest_categories: NONE
  config.disabled_transport_categories: NONE
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

Позволяет программе блокировать на сервере определенное количество оперативной памяти, которое указанно в файле "jvm.options" в парамтреах "-Xms" и "-Xmx". Необходимо предварительно настроить параметры "-Xms" и "-Xmx" в "jvm.options" (производится в следующих пунктах). По умолчанию false

network.host: <FQDN или IP текущего хоста>

Сетевой адрес текущего хоста, на котором будет доступен сервер

http.port: ХХХХХ

Порт, на котором будет доступен API сервера. Используется для доступа к серверу по HTTP. По умолчанию 9200

transport.port: ХХХХХ

Порт, на котором будет доступен сервер на транспортном уровне. Используется для связи серверов между собой в кластере. По умолчанию 9300

cluster.name: <ваше имя кластера>

Произвольное имя текущего кластера в котором будет находится данная node

node.name: <ваше имя текущей node>

Произвольное имя текущего сервера в кластере

node.roles:
- cluster_manager
- data

Роли данной node в кластере.
cluster_manager - означает, что данная node участвует в кворуме при выборе нового мастера, если потерян текущий и может стать новым мастером. Оставляйте данную роль на всех серверах. Мастер всегда будет только один.
data - означает, что текущая node хранит и обрабатывает данные

cluster.initial_cluster_manager_nodes:
- <имя вашей node 1>
- <имя вашей node 2>
- <имя вашей node 3>

Перечисление всех заданных ранее имен node (node.name) в кластере

discovery.seed_hosts:
- <FQDN или IP node 1 в кластере>:ХХХХХ
- <FQDN или IP node 2 в кластере>:ХХХХХ
- <FQDN или IP node 3 в кластере>:ХХХХХ

Перечисление адресов и портов всех 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.pemcert_filepath: "<путь к сертификату для шифрования http-уровня и rest-запросов>"
plugins.security.ssl.http.pemkey_filepath: "<путь к приватному ключу от сертификата для шифрования http-уровня и rest-запросов>"
plugins.security.ssl.http.pemtrustedcas_filepath: "<путь к корневому сертификату, для шифрования http-уровня и rest-запросов>"

Путь к сертификату для шифрования http-уровня, rest-запросов и корневой сертификат. Для раскрытия запароленного приватного ключа от сертификата, необходимо добавить параметр "plugins.security.ssl.http.pemkey_password_secure" в opensearch-keystore и указать в нем пароль от приватного ключа

plugins.security.ssl.http.enabled_protocols: ["TLSv1.2", "TLSv1.3"]

Позволяет использовать только указанные методы шифрования для http-уровня

plugins.security.ssl.http.enabled_ciphers: ["TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"]

Позволяет использовать только указанные шифры для http-уровня

plugins.security.ssl.http.clientauth_mode: REQUIRE

Режим проверки сертификатов при запросах к серверу, запросы без сертификатов блокируются. По умолчанию OPTIONAL – ожидать сертификаты, но не требовать их

plugins.security.ssl.transport.enabled: true

Включение шифрования транспортного уровня

plugins.security.ssl.transport.pemcert_filepath: "<путь к сертификату для межкластерного шифрования>"
plugins.security.ssl.transport.pemkey_filepath: "<путь к приватному ключу от сертификата для межкластерного шифрования>"
plugins.security.ssl.transport.pemtrustedcas_filepath: "<путь к корневому сертификату, для межкластерного шифрования>"

Путь к сертификату для межкластерного шифрования и корневой сертификат

plugins.security.ssl.transport.enabled_protocols: ["TLSv1.2", "TLSv1.3"]

Позволяет использовать только указанные методы шифрования для транспортного уровня

plugins.security.ssl.transport.enabled_ciphers: ["TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"]

Позволяет использовать только указанные шифры для транспортного уровня

plugins.security.ssl.transport.enforce_hostname_verification: true

Проверка имени хоста на транспортном уровне. Необязательный. По умолчанию true

plugins.security.authcz.admin_dn:
- '<CN админского сертификата>'

Здесь необходимо указать CN сертификата, который будет использоваться для доступа с правами полного администратора. В основном используется для применения изменений методов аутентификации/авторизации и ролевой модели, указывается при вызове скрипта securityadmin.sh.
Внимание! На всех серверах в кластере данный параметр должен быть идентичен

plugins.security.nodes_dn:
- '<CN межкластерного сертификата>'

Здесь необходимо указать CN сертификата, который будет использоваться для межкластерного шифрования между node и доступа к API сервера. Все REST запросы необходимо осуществлять с данными сертификатами.
Внимание! На всех серверах в кластере данный параметр должен быть идентичен

plugins.security.audit.type: internal_opensearch

Метод хранения данных аудита. "internal_opensearch" - все данные хранятся на node во внутреннем журнале сервера

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: "all_access"

Имя роли, которая может осуществлять системные вызовы через REST-запросы к API сервера. "all_access" - системная роль, которая изначально присвоена только пользователю admin

plugins.security.system_indices.enabled: true

Включить защиту системных индексов указанных в следующем параметре "plugins.security.system_indices.indices"

plugins.security.system_indices.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

Время хранения данных кеша пользователей в минутах. При использовании внешних систем аутентификации/авторизации необходимо установить "0"

Настройка JVM Heap Size параметров#

Для быстрой и стабильной работы рекомендуется выделять компоненту SRHX 50 процентов оперативной памяти сервера.

Для этого:

  1. Unit services компонент SRHX в Linux должен содержать параметры: "Environment=MAX_LOCKED_MEMORY=unlimited" и "LimitMEMLOCK=infinity" (прописывается при создании unit service). В лимитах для пользователя "opensearch" – должен быть установлен параметр "opensearch - memlock unlimited" (описано в разделе Изменение лимитов пользователей данного документа).

  2. В "opensearch.yml" должен быть прописан параметр "bootstrap.memory_lock:" со значением "true".

Укажите нужное значение в параметрах Java. Для этого откройте файл "/etc/opensearch/jvm.options", найдите параметры -Xms и -Xmx и укажите значение в гигабайтах, равное половине оперативной памяти текущего сервера, но не более 32766 Мб.

  1. Узнайте размер оперативной памяти на текущем сервере с помощью команды:

free -g | grep Mem: | awk '{print $2}'
23
  1. Отредактируйте параметры в файле с настройками 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 существует opensearch-keystore. Хранение логина и пароля выполняется в opensearch.yml. Для работы с opensearch-keystore нужно запустить /usr/share/opensearch/bin/opensearch-keystore <параметр> (–help, чтобы увидеть все доступные параметры).

Список часто используемых параметров

Параметр

Описание

create

Создание нового keystore хранилища (дополнительный параметр -p позволит создать keystore, защищенный паролем)

add

Добавление нового параметра в созданный keystore

list

Просмотр параметров, которые хранятся в данный момент в keystore

remove

Удалить существующий параметр из текущего keystore

Для продолжения установки добавьте в opensearch-keystore пароли от приватных ключей для сертификатов. Это будут параметры:

  • plugins.security.ssl.http.pemkey_password_secure. Пароль для приватного ключа от сертификата используемого для шифрования http-уровня.

  • plugins.security.ssl.transport.pemkey_password_secure. Пароль для приватного ключа от сертификата используемого для шифрования транспортного-уровня.

Внимание! opensearch-keystore будет создан для пользователя linux, от которого будут запускаться команды. Не выполняйте команды из под "root"! Используйте для этого пользователя "opensearch".

Создайте keystore с помощью параметра "create". Добавьте необходимые параметры при помощи параметра "add".

#создайе хранилище, если оно еще не существует
sudo su - opensearch -c '/usr/share/opensearch/bin/opensearch-keystore create'
 
sudo su - opensearch -c '/usr/share/opensearch/bin/opensearch-keystore add plugins.security.ssl.http.pemkey_password_secure'
#после команды будет ожидать ввода данных
sudo su - opensearch -c '/usr/share/opensearch/bin/opensearch-keystore add plugins.security.ssl.transport.pemkey_password_secure'
#после команды будет ожидать ввода данных

Настройка параметров в 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 текущего хоста>"
  port: 15601
  ssl:
    enabled: true
    certificate: <путь к сертификату, который будет использоваться для шифрования соединений к самому dashboards>
    key: <путь к приватному ключу от сертификата для шифрования соединений к самому dashboards>
    certificateAuthorities: <путь к корневому сертификату>
  
# Настройки для соединения dashboards с сервером OpenSearch
opensearch:
  hosts:
    - https://<FQDN или IP node 1 в кластере>:ХХХХХ
    - https://<FQDN или IP node 2 в кластере>:ХХХХХ
    - https://<FQDN или IP node 3 в кластере>:ХХХХХ
  ssl:
    alwaysPresentCertificate: true
    verificationMode: full
    certificate: <путь к межкластерному сертификату, который будет использоваться для соединения dashboards с сервером>
    key: <путь к приватному ключу от сертификата для соединения dashboards с сервером>
    certificateAuthorities: <путь к корневому сертификату>
  requestHeadersAllowlist:
    - authorization
    - securitytenant
   
# Настройки логгирования
logging:
  dest: /var/log/opensearch-dashboards/opensearch-dashboards.log
  json: false
  verbose: true
 
# Настройки плагина Security
opensearch_security:
  auth.type: "basicauth"
  cookie.secure: true
  session.keepalive: true
# Указанны значения в миллисекундах
opensearch_security.cookie.ttl: 86400000
opensearch_security.session.ttl: 1200000

Описание всех параметров указанных в примере opensearch_dashboards.yml представлено в таблице ниже.

Имя параметра

Описание

server.host: <FQDN или IP текущего хоста>

Сетевой адрес текущего хоста, на котором будет доступен сервер

server.port: 15601

Порт, на котором будет доступен API сервера. Используется для доступа к серверу по HTTP. По умолчанию 5601

server.ssl.enabled: true

Включить HTTP шифрование

server.ssl.certificate: <путь к сертификату для запуска на https>
server.ssl.key: <путь к ключу от сертификата для шифрования соединения>
server.ssl.certificateAuthorities: <путь к корневому сертификату>

Путь до сертификата для шифрования и корневого.
Для раскрытия запароленного приватного ключа от сертификата, необходимо добавить параметр "server.ssl.keyPassphrase" в opensearch-dashboards-keystore и в нем указать пароль от ключа сертификата

opensearch.hosts:
- https://<FQDN или IP node 1 в кластере>:ХХХХХ
- https://<FQDN или IP node 1 в кластере>:ХХХХХ
- https://<FQDN или IP node 1 в кластере>:ХХХХХ

Перечисление адресов и портов всех серверов в кластере. Порт по умолчанию 9200

opensearch.requestHeadersAllowlist:
- authorization
- securitytenant

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

opensearch.ssl.alwaysPresentCertificate: true

Всегда передавать сертификат при запросах к компоненту SRHX

opensearch.ssl.verificationMode: full

Тип проверки при аутентификации соединения с сервером. "full" – требовать сертификат и проверять, содержится ли имя хоста в сертификате

opensearch.ssl.certificate: <путь до межкластерного сертификата>
opensearch.ssl.key: <путь к ключу от сертификата для шифрования соединения>
opensearch.ssl.certificateAuthorities: <путь к корневому сертификату>

Путь до сертификата для шифрования и корневого.
Для раскрытия запароленного приватного ключа от сертификата, необходимо добавить параметр "opensearch.ssl.keyPassphrase" в opensearch-dashboards-keystore и в нем указать пароль от ключа сертификата

logging:
dest: /var/log/opensearch-dashboards/opensearch-dashboards.log
json: false
verbose: true

Директория для хранения логов и настройка параметров логгирования

opensearch_security.auth.type: "basicauth"

Тип аунтентификации. "basicauth" - использование пары логин/пароль

opensearch_security.cookie.secure: true

Шифрование cookies. Необходимо при включении HTTPS

opensearch_security.session.keepalive: true

Поддерживать сессию, пока действуют cookies.
Логическое значение. Если установлено значение true, время жизни сеанса (opensearch_security.session.ttl) продлевается при каждом запросе. По умолчанию: true

#specified values are in milliseconds
opensearch_security.cookie.ttl: 86400000

Время хранения cookies в миллисекундах. Может быть равно 0 для сессии cookie. По умолчанию – 1 час

opensearch_security.session.ttl: 1200000
#specified values are in milliseconds

Время жизни установленной сессии с пользователем. Если установлено, пользователю будет предложено снова войти в систему через заданное время, независимо от файла cookie. По умолчанию: 1 час

Добавление параметров в opensearch-dashboards-keystore#

Для сокрытия чувствительных данных (например логин/пароль) в компоненте SRHX существует "opensearch-dashboards-keystore".

Для работы с "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

Логин пользователя. Должен присутствовать в "internal_users.yml". Стандартное значение "kibanaserver"

opensearch.password

Пароль от логина, указанного в предыдущем пункте. Должен присутствовать в "internal_users.yml". Стандартное значение "kibanaserver"

opensearch.ssl.keyPassphrase

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

server.ssl.keyPassphrase

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

Внимание! Параметры "opensearch.ssl.keyPassphrase" и "server.ssl.keyPassphrase" при добавлении в "opensearch-dashboards-keystore" необходимо вводить в кавычках. Иначе возможно получить ошибку неправильного типа данных.

Создайте 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'

#После команды будет ожидать ввода данных
sudo su - opensearch-dashboards -c '/usr/share/opensearch-dashboards/bin/opensearch-dashboards-keystore add opensearch.ssl.keyPassphrase'

#После команды будет ожидать ввода данных
sudo su - opensearch-dashboards -c '/usr/share/opensearch-dashboards/bin/opensearch-dashboards-keystore add server.ssl.keyPassphrase'

На этом настройка сервера может быть завершена. Для первого запуска можно использовать ролевую модель по умолчанию с пользователями из internal_users.yml.

Настройка методов аутентификации/авторизации и ролевой модели#

В разделе приведена информация для ознакомления с возможностями ролевой модели компонента SRHX.

  1. Ролевая модель настраивается в файлах "internal_users.yml", "roles.yml", "roles_mapping.yml", которые находятся в "/etc/opensearch/opensearch-security/".

  2. Методы аутентификации настраиваются в файле "config.yml", который находятся в "/etc/opensearch/opensearch-security/".

При старте компонента SRHX в первый раз подгружаются данные из этих файлов. Поэтому на сервере уже будут стандартные пользователи из этих файлов и метод аутентификации "basicauth", который указан в "config.yml". Редактирование файлов выполняется при необходимости.

Создание шифрованного пароля для пользователя#

Все пароли в "internal_users.yml" хранятся в зашифрованном виде. Для шифрования пароля есть скрипт "hash.sh".

  1. Запустите скрипт от пользователя "opensearch".

sudo su - opensearch -c '/usr/share/opensearch/plugins/opensearch-security/tools/hash.sh'
  1. После загрузки скрипта он будет ожидать ввода пароля, который будет зашифрован. В примере используйте пароль "der_parol".

**************************************************************************
** This tool will be deprecated in the next major release of OpenSearch **
**************************************************************************
[Password:]
  1. После ввода данных и нажатия Enter, получите введенный пароль в зашифрованном виде.

$2y$12$MnTVuoi0Ue.Bbn47Np.xFuPjNcGGrazvgAZDkfSDMzSSd69Y3H6SW

Создание пользователя#

  1. В файл "internal_users.yml" добавьте блок нового пользователя:

sudo nano /etc/opensearch/opensearch-security/internal_users.yml
  1. Добавьте, подставив необходимые данные:

pvs_admin:
hash: "$2y$12$MnTVuoi0Ue.Bbn47Np.xFuPjNcGGrazvgAZDkfSDMzSSd69Y3H6SW"
reserved: false
description: "Demo pvs_admin user, using internal role mapping"

Создание роли#

  1. Создайте роль с возможностями администрирования в файле "roles.yml".

sudo nano /etc/opensearch/opensearch-security/roles.yml
  1. Добавьте:

super_administrator:
cluster_permissions:
- 'cluster:admin/*'
- 'cluster:monitor/*'
index_permissions:
- index_patterns:
- '*'
allowed_actions:
- 'indices:admin/*'
- 'indices:data/*'
- 'indices:monitor/*

Связывание созданной роли и пользователя#

  1. Присвойте роль созданному пользователю в файле "roles_mapping.yml".

sudo nano /etc/opensearch/opensearch-security/roles_mapping.yml
  1. Добавьте:

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: 2.7.1
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

Настройка интеграции#

Настройка интеграции с внешним провайдером аудита#

Установка плагина Аудита#

В составе дистрибутива есть архив с плагином аудита "audit.zip". Распакуйте его содержимое во временную директорию и переместите файлы в нужные директории.

unzip audit.zip -d /tmp/audit && cd /tmp/audit

Содержание архива:

Название компонента

Описание

plugin_audit-1.0-SNAPSHOT.jar

Плагин аудита

plugin-security.policy

Файл с привилегиями для Security-plugin

Файлы указанные выше переместите в плагин Security. "/usr/share/opensearch/plugins/opensearch-security/"

Название компонента

Описание

audt-appl.properties

Файл с настройками аудита

audt-appl.properties переместите в директорию с файлами конфигурации для opensearch. "/etc/opensearch/

Переместите распакованные файлы и измените владельца на opensearch.

sudo cp plugin_audit-1.0-SNAPSHOT.jar plugin-security.policy /usr/share/opensearch/plugins/opensearch-security/ && cp audt-appl.properties /etc/opensearch/
 
sudo chown opensearch:opensearch \
/usr/share/opensearch/plugins/opensearch-security/plugin_audit-1.0-SNAPSHOT.jar \
/usr/share/opensearch/plugins/opensearch-security/plugin-security.policy \
/etc/opensearch/audt-appl.properties
Настройка внешнего провайдера Аудита#

Включение Аудита в 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
  config.disabled_rest_categories: NONE
  config.disabled_transport_categories: NONE

Настройка параметров Аудита

Большинство настроек Аудита описываются в файле "/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.2>

#Заполнять в соответствии с вашим стендом
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,TLSv1.1
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,TLSv1.1
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,TLSv1.1
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
#Максимальное количество асинхронно выполняемых задач отправки событий аудита
#MAX_ASYNC_SEND_TASKS=1001

Описание всех параметров указанных в примере 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

Наименование топика с событиями уровня CRITICAL для кластера 1

kafka_2.topic.audit-events-crit-in

Наименование топика с событиями уровня CRITICAL для кластера 2

kafka_1.topic.audit-events-uncrit-in

Наименование топика с событиями уровня UNCRITICAL для кластера 1

kafka_2.topic.audit-events-uncrit-in

Наименование топика с событиями уровня UNCRITICAL для кластера 2

kafka_1.topic.audit-metamodel-in

Наименование топика регистрации метамоделей для кластера 1

circuit-breaker.mode

Наименование топика регистрации метамоделей для кластера 2

Группы балансировки (union-audit.balance_group.)

Наименование топика регистрации метамоделей для кластера 2

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, ЕФС - параметр UFS, ППРБ - параметр 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.providers, union_audit_2.providers

Провайдер, к которому применяются настройки.(Значения kafka_1 или kafka_2)

Режим отправки сообщений (union-audit.)

Провайдер, к которому применяются настройки.(Значения 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

MAX_ASYNC_SEND_TASKS

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

Настройка SSL соединения#

При подключении по протоколу SSL, укажите плагин месторасположение сертификатов и паролей от них в виде аргументов для java машины в файле "/etc/opensearch/jvm.options".

Параметры необходимые для работы плагина аудита по SSL:

# Полный путь до keyStore с сертификатами для подключения к kafka
-Djavax.net.ssl.keyStore=/etc/opensearch/certs/<crets-for-kafka>.keystore.jks
# Полный путь до keyStore с корневым сертификатом для подключения к kafka
-Djavax.net.ssl.trustStore=/etc/opensearch/certs/<crets-for-kafka>.truststore.jks
# Игнорировать имена хостов
-Dweblogic.security.SSL.ignoreHostnameVerify
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false

Для этого откройте файл "/etc/opensearch/jvm.options", и укажите в нем переменные, заменив значения на необходимые.

sudo nano /etc/opensearch/jvm.options
-Djavax.net.ssl.keyStore=/etc/opensearch/certs/audit.keystore.jks
-Djavax.net.ssl.trustStore=/etc/opensearch/certs/audit.truststore.jks
-Dweblogic.security.SSL.ignoreHostnameVerify
-Dcom.ibm.mq.cfg.useIBMCipherMappings=false
 
## JVM configuration
 
################################################################
## IMPORTANT: JVM heap size
################################################################

Добавление параметров в opensearch-keystore

Для сокрытия чувствительных данных (например логин/пароль) в компоненте SRHX существует opensearch-keystore. Добавьте в opensearch-keystore пароли от keystore с сертификатами шифрования Аудита. Это будут параметры:

  • plugins.security.ssl.audit.keystore_password_secure. Пароль от keystore с сертификатом для шифрования соединения Аудита. (сертификаты для подключения к kafka).

  • plugins.security.ssl.audit.truststore_password_secure. Пароль от keystore с корневым сертификатом для шифрования соединения Аудита.

Внимание!

Для работы с opensearch-keystore используйте для этого пользователя opensearch.

Добавьте необходимые параметры при помощи параметра 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'
#после команды будет ожидать ввода данных

Настройка Java permissions

Для работы плагина аудита требуются повышенные привилегии java машины.

В каталоге, где находится Java, по пути: "path_to_java/lib/security" – отредактируйте файл "default.policy". Добавьте дополнительные привилегии. Откройте файл "default.policy":

sudo nano /usr/share/opensearch/jdk/lib/security/default.policy

В самом конце файла, под комментарием "//permissions needed by applications using java.desktop module" замените содержание на текст из блока ниже:

// permissions needed by applications using java.desktop module
grant {
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
    permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete";  
    permission java.net.SocketPermission "*", "connect,accept,resolve,listen";
    permission java.util.PropertyPermission "javax.net.ssl.keyStorePassword", "write";
    permission java.util.PropertyPermission "javax.net.ssl.trustStorePassword", "write";
    permission javax.management.MBeanPermission "*", "*";
    permission javax.management.MBeanTrustPermission "register";
    permission javax.management.MBeanServerPermission "createMBeanServer";
    permission java.lang.RuntimePermission "modifyThread";
    permission java.lang.RuntimePermission "getClassLoader";
    permission java.lang.RuntimePermission "modifyThreadGroup";
    permission java.lang.RuntimePermission "setContextClassLoader";
    permission java.lang.RuntimePermission "accessDeclaredMembers";
    permission java.lang.RuntimePermission "accessClassInPackage.com.apple.*";
    permission java.lang.RuntimePermission "accessClassInPackage.com.sun.beans";
    permission java.lang.RuntimePermission "accessClassInPackage.com.sun.beans.*";
    permission java.lang.RuntimePermission "accessClassInPackage.com.sun.java.swing.plaf.*";
};

Настройка интеграции с компонентом 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.
Используется только для работы плагина HealthCheck. Для работы плагина необходимо установить значение "true" и создать роль "anonymous" без каких-либо прав

config, dynamic, authc

Здесь происходит перечисление тех методов аутентификации, которые будут использоваться в данном кластере

basic_internal_auth_domain:

Имя метода

description: "Authenticate via HTTP Basic against internal users database"

Краткое описание метода

http_enabled: true

Включить работу метода на http-уровне

transport_enabled: true

Включить работу метода на транспортном-уровне

order: 4

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

http_authenticator:

Блок настройки параметров данного метода аутентификации

type: basic

Тип используемой аутентификации. "basic" - по логин/паролю

challenge: true

Требовать запрос данных при каждом запросе. Сервер будет ожидать заголовки аутентификации в запросе

authentication_backend:

Блок настройки проверки аутентифкационных данных

type: intern

Тип проверки. "intern" - проверка происходит по внутренней базе компонента SRHX

Настройка аутентификации с IAM/СУДИР с проверкой токена#

Внимание! Для соединения с компонентом IAM Proxy в компоненте SRHX должны использоваться сертификаты, подписанные тем же УЦ, что и сертификаты в "Proxy".

  1. Замените все содержимое файла "/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
  1. При заполнении используйте следующие параметры.

Имя параметра

Описание

xff:

remoteIpHeader

В данном заголовке передаются все адреса серверов прокси, которые будут использоваться. Все остальные адреса, которые не будут здесь указаны, система будет считать клиентскими.
"x-forwarded-for" - стандартное название. Точное значение параметра уточните у владельца прокси

internalProxies

Вместо указывается IP-адрес, на котором запущен компонент SRHX. ВНИМАНИЕ! Обязательно указывать именно IP адрес

proxy_auth_domain.http_authenticator:

user_header

Должно быть указано имя заголовка http-запроса, в котором будет содержаться логин пользователя

roles_header

Должно быть указано имя заголовка http-запроса, в котором будут содержаться роли пользователя. Роли отправляются самим прокси

"x-proxy-user" и "x-proxy-roles" – стандартные названия заголовков. Точное значение параметра уточните у владельца прокси.

Внимание! После редактирования файла "config.yml", примените новые значения, с помощью запуска скрипта "securityadmin.sh". Этот процесс подробно описан в разделе Настройка методов аутентификации/авторизации и ролевой модели в пункте Применение данных к кластеру данного документа.

  1. Добавьте в файл "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
  1. Для настройки соединения заполните следующие параметры:

Имя параметра

Описание

opensearch.requestHeadersAllowlist

В данном параметре перечисляются имена заголовков, которые будут считываться из HTTP-запроса.
Должны быть указаны дополнительные значения "x-forwarded-for","x-proxy-user","x-proxy-roles".
Например: opensearch.requestHeadersAllowlist: ["authorization", "security_tenant", "x-forwarded-for","x-proxy-user","x-proxy-roles"]

opensearch_security.auth.type

Отвечает за разрешенные типы аутентификации - данный параметр должен иметь значение "proxy"

opensearch_security.proxycache.user_header

Должно быть указано имя заголовка http-запроса, в котором будет содержаться логин пользователя

opensearch_security.proxycache.roles_header

Должно быть указано имя заголовка http-запроса, в котором будут содержаться роли пользователя. Роли отправляются самим прокси

Если подключение происходит к прокси, у которого существует несколько ответвлений, то дополнительно должны быть заполнены следующие параметры:

Имя параметра

Описание

server.basePath

Данный параметр должен содержать адрес ответвления. Например, если ответвление на IAM находится по адресу "https://:/example", то в параметре basePath должно быть указано значение /example

server.rewriteBasePath

Данный параметр позволяет вырезать указанный выше дополнительный адрес из запросов к серверу. Должен быть в значении "true"

Внимание! После внесенных изменений перезагрузите компонент SRHX.

Настройка аутентификации с IAM Proxy/СУДИР без проверки токена#

  1. Замените все содержимое вашего файла "/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
            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
  1. Заполните:

Имя параметра

Описание

openid_connect_url

Должна быть указана ссылка на параметры конфигурации OIDC. Обычно ссылка имеет вид "http(s)://:/auth/realms//.well-known/openid-configuration"

openid_connect_idp.pemtrustedcas_filepath

Должен быть указан путь к корневому сертификату, который использует провайдер

jwks_uri

Должна быть указана ссылка на место хранения публичных ключей конфигурации OIDC

subject_key

Должно быть установлено значение параметра токена с логином пользователя

roles_key

Должно быть установлено значение параметра токена с ролями пользователя

Внимание!

После редактирования файла "config.yml", примените новые значения, с помощью запуска скрипта "securityadmin.sh". Этот процесс подробно описан в разделе Настройка методов аутентификации/авторизации и ролевой модели в пункте Применение данных к кластеру данного документа.

  1. Добавьте в файл "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
  1. Для настройки соединения заполните следующие параметры:

Имя параметра

Описание

opensearch.requestHeadersAllowlist

В данном параметре перечисляются имена заголовков, которые сервис будет считывать из HTTP-запроса.
Должны быть добавлены значения "authorization" и "security_tenant". Например: opensearch.requestHeadersAllowlist: ["authorization", "security_tenant"]

opensearch_security.auth.type

Отвечает за разрешенные типы авторизации - данный параметр должен иметь значение "jwt"

opensearch_security.jwt.enabled

Должен быть в значении "true"

opensearch_security.jwt.url_param

Если токен передается не в http-заголовке, а как параметр URL, то нужно указать этот параметр здесь

Внимание! После внесенных изменений перезагрузите компонент SRHX.

Обновление#

Для обновления на новую версию или переустановки компонента SRHX:

  1. Очистите директорию "/usr/share/opensearch/*".

  2. Распакуйте новую версию компонента SRHX в эту директорию.

  3. Измените владельца и права на директорию и файлы.

  4. Установите плагины для компонента 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:ХХХХХ/

Пример ответа:

Проверка наличия плагинов#

После успешной установки компонента необходимо проверить, что плагины были установлены.

Проверить в пришедшем списке присутствие всех устанавливаемых плагинов на каждой 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

Пример ответа:

Проверка корректной работоспособности аудита#

  1. Настройте стенд компонента SRHX с плагином Audit.

  2. Выполните запрос на проверку включения аудита.

  3. Проверьте, что параметр "enabled": true и параметр "enabled": true в объекте compliance

GET 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
        }
    }
}
  1. Выполните запрос на создание индекса "test_audit" и загрузку в него документа через пользователя "admin".

PUT https://host:port/_bulk

Body:

{ "index" : { "_index" : "test_audit", "_id" : "0001" } }
{ "technic": "ноут это моя жизнь в этом мире","furniture": "стол, стул","companies": "Сбертех","date": "2023-06-13T10:30:00","specialists": "лидер разработчик","rating": 2,"status": true,"colors": "Багровый красный изотоп","age": 1,"phrases": "Шёл по лесу и увидел дуб"}

Basic Auth: admin/admin

p.s. Для Postman или аналогичных по, в запросе требуется оставлять последнюю строчку пустой

Ответ 200 ОК

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "test_audit"
}
  1. Перейдите в 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\": \"Сбертех\",\"trees\": \"Дуб\",\"specialists\": \"лидер разработчик\",\"games\": \"Прятки\",\"sports\": \"Футбол\",\"colors\": \"Багровый красный\",\"age\": 1,\"phrases\": \"Шёл по лесу и увидел дуб\",\"location\":\"34.423,58.432\"}\n{ \"index\" : {\"_id\" : \"0002\" } }\n{ \"technic\": \"Комп\",\"furniture\": \"Диван\",\"companies\": \"Сбертехи\",\"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[10.23.132.69: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": "DZO"
},
{
"name": "ufs.serverLocation",
"value": "{значение}"
},
{
"name": "ufs.terBankCode",
"value": null
},
{
"name": "ufs.vspCode",
"value": null
}
],
"changedParams": []
}

Проверка работоспособности internal users при настроенной аутентификации OIDC (JWT)#

  1. Произведите настройку в opensearch-security/config.yml.

  2. Добавьте параметры для аутентификации по OIDC.

---

_meta:
type: "config"
config_version: 2

config:
dynamic:
http:
anonymous_auth_enabled: false
xff:
enabled: true
remoteIpHeader: "x-forwarded-for"
internalProxies: "opensearch-dashboards-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

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

Отображается пример заполненного корректного конфигурационного файла (в зависимости от стендов, значения могут различаться):

---

_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://platformauth-ift3.sc.dev.sbt/auth/realms/PlatformAuth/.well-known/openid-configuration
            openid_connect_idp:
              enable_ssl: true
              verify_hostnames: false
              pemtrustedcas_filepath: /etc/opensearch/certs/pd10-ca.crt
            jwks_uri: https://platformauth-ift3.sc.dev.sbt/auth/realms/PlatformAuth/protocol/openid-connect/certs
            subject_key: preferred_username
            roles_key: realm_access
        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
  1. Выполните запрос к серверу без выбора параметра авторизации.

GET https://host:port/ No Auth

Ответ 401

Отображается ошибка о том что пользователь не авторизован.

  1. Выполните запрос к серверу с выбором Basic Auth авторизации и пользователем IAM.

GET https://host:port/

Basic Auth

user IAM / password IAM

Ответ 401

Отображается ошибка о том что пользователь не авторизован, так как пользователь не существует на сервере.

  1. Выполните запрос для проверки, что internal user может отправить запрос на сервер.

GET https://host:port/

Basic Auth: admin / admin

Ответ 200 ОК

Отображается информация о сервере.

Проверка работоспособности internal users при настроенной аутентификации IAM Proxy#

  1. Произведите настройку в opensearch-security/config.yml.

  2. Добавьте параметры для аутентификации по IAM Proxy.

_meta:
type: "config"
config_version: 2

config:
dynamic:
http:
anonymous_auth_enabled: false
xff:
enabled: true
remoteIpHeader: "x-forwarded-for"
internalProxies: "opensearch-dashboards-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

Отображается пример заполненного корректного конфигурационного файла (в зависимости от стендов, значения могут различаться):

_meta:
  type: "config"
  config_version: 2

config:
  dynamic:
    http:
      anonymous_auth_enabled: false
      xff:
        enabled: true
        remoteIpHeader: "x-forwarded-for"
        internalProxies: 10.23.132.78

    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: "iv-user"
            roles_header: "iv-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
          config:
            openid_connect_url: https: //platformauth-ift3.sc.dev.sbt/auth/realms/PlatformAuth/.well-known/openid-configuration
            openid_connect_idp:
              enable_ssl: true
              verify_hostnames: false
              pemtrustedcas_filepath: /etc/opensearch/certs/pd10-ca.crt
            jwks_uri: https: //platformauth-ift3.sc.dev.sbt/auth/realms/PlatformAuth/protocol/openid-connect/certs
            subject_key: preferred_username
            roles_key: realm_access
            roles_sub_key: roles
        authentication_backend:
type: intern
  1. Выполните запрос к серверу без выбора параметра авторизации.

GET https://host:port/

No Auth

Ответ 401

Отображается ошибка о том, что пользователь не авторизован.

  1. Выполните запрос к серверу с выбором Basic Auth авторизации и пользователя IAM.

GET https://host:port/

Basic Auth

Если доступ отсутствует, то обратитесь к администратору стенда.

Ответ 401

Отображается ошибка о том, что пользователь не авторизован, так как пользователь не существует на сервере.

  1. Выполните запрос к серверу используя "Basic Auth" и пользователя admin.

GET https://host:port/

Basic Auth: admin / admin

Ответ 200 ОК

Отображается информация о сервере.

Откат#

Автоматической процедуры отката нет.

  1. Откат к предыдущей версии компонента SRHX представляет собой удаление и установку последней стабильной версии компонента SRHX.

  2. Для отката необходимо выполнить установку предыдущей стабильной версии компонента SRHX в соответствии с разделом Установка текущего документа.

Чек-лист валидации установки#

  1. Убедитесь, что выполнена подготовка окружения согласно разделу Подготовка окружения данного документа.

  2. Выполните проверку работоспособности компонента SRHX согласно разделу Проверка работоспособности настоящего документа.