Закрытый контур на Astra Linux с SSL

Внимание

Дисклеймер.

Инструкция содержит примерный порядок действий по установке. Инструкция призвана описать логику действий по установке на простом, абстрактном примере. В зависимости от инфраструктуры сервера (кластера) и его конфигурации, вам могут понадобиться дополнительные или иные шаги.

Эта инструкция не должна восприниматься буквально, а использоваться в качестве основы действий.

Примечание

Ниже приведен пример установки системы в закрытом контуре (без интернета) на Astra Linux 1.7.X «Смоленск». В инструкцию включена настройка SSL

Предупреждение

Инструкция актуальна для установки Юниверс DG версии 2.5 и старше, так как система перешла с Elasticsearch на Opensearch

Предварительные действия:

  • Архив с дистрибутивом предоставляется клиенту при приобретении продукта через менеджера компании "Юниверс Дата".

  • Распакуйте архив дистрибутива, который содержит скрипты для установки, в любое место. Содержимое будет храниться в каталоге DG_manual_install_Astra_1.7. Далее этот каталог будет именоваться как <OFFLINE_REP>.

  • Скопируйте содержимое <OFFLINE_REP> на целевой сервер.

Установка JAVA

Примечание

Java требуется установить на всех серверах, где планируется запускать Opensearch, Tomcat

Все пакеты, необходимые для корректной установки openJDK, располагаются в каталоге Java.

Для установки Java:

  1. Перейдите в директорию Java.

  2. Распакуйте содержимое архива с установочными пакетами.

  3. В распакованном каталоге выполните команду:

    sudo dpkg -i *.deb
    

Установка Opensearch

Для установки Opensearch:

  1. Перейдите в каталог Opensearch и используйте команду:

    sudo dpkg -i *.deb
    

Установка словарей

  1. Скопируйте директорию ./<OFFLINE_REP>/Opensearch/hunspell в /etc/opensearch/:

    sudo cp -rv ./<OFFLINE_REP>/Opensearch/hunspell /etc/opensearch
    
  2. Выдайте права для новой директории:

    sudo chown -R root:opensearch /etc/opensearch/hunspell/
    

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

  1. Выполните команду с указанием полного пути до архива analysis-icu-*.zip:

    sudo /usr/share/opensearch/bin/opensearch-plugin install /<OFFLINE_REP>/Opensearch/analysis-icu-2.7.0.zip
    
    # если вы в директории с файлом analysis-icu-*.zip
    # sudo /usr/share/opensearch/bin/opensearch-plugin install file://`pwd`/analysis-icu-2.7.0.zip
    
  2. Результат выполнения команды будет иметь вид:

    Installed analysis-icu with folder name analysis-icu
    

Конфигурация Opensearch

  1. Очистите файл конфигурации и откройте следующий файл с помощью любого редактора:

    sudo cp -i /etc/opensearch/opensearch.yml /etc/opensearch/opensearch.yml_before_ssl && > /etc/opensearch/opensearch.yml # Очистка файла
    sudo vi /etc/opensearch/opensearch.yml
    
  2. Укажите параметр cluster.name, например:

    cluster.name: dg-os-cluster
    

Имя кластера будет использоваться в настройках приложения для подключения. Каждый параметр в файле указываем с новой строки.

  1. По умолчанию Opensearch прослушивает только localhost, если приложение Tomcat устанавливается на другой сервер, и/или Opensearch будет использоваться в кластере, то необходимо разрешить подключения с других интерфейсов, указав параметр:

    network.host: 0.0.0.0
    
  2. Также необходимо открыть порт 9200 для нод/приложений, которые будут подключаться к Opensearch.

  3. Если планируется использование только одной ноды Opensearch - укажите параметр:

    discovery.type: single-node
    
  4. Укажите каталог для логов и данных:

    path.data: /var/lib/opensearch
    path.logs: /var/log/opensearch
    
  5. Если не требуется SSL шифрование и авторизация, то укажите параметр:

    plugins.security.disabled: true
    

Пример итогового файла opensearch.yml для запуска Opensearch на одной ноде без ssl и авторизации:

cluster.name: dg-os-cluster
network.host: 0.0.0.0
discovery.type: single-node
path.data: /var/lib/opensearch
path.logs: /var/log/opensearch
plugins.security.disabled: true

Настройка кластера Opensearch

Примечание

Приведен пример конфигурации без использования ssl

Для кластерной конфигурации и использования нескольких серверов Opensearch в файле /etc/opensearch/opensearch.yml на каждом сервере измените ряд настроек:

  1. Задайте уникальный node.name для каждой ноды кластера Opensearch:

    # для первого сервера:
    node.name: node01
    
    # для N сервера
    # node.name: nodeN
    
  2. Перечислите все Hostname или ip серверов, которые планируется соединить в кластер в следующих параметрах:

    cluster.initial_master_nodes: ["10.10.24.90","10.10.24.91", "10.10.24.92"]
    discovery.seed_hosts: ["10.10.24.90", "10.10.24.91", "10.10.24.92"]
    
  3. Закомментируйте или уберите следующий параметр, т.к. он противоречит кластерной настройке:

    #discovery.type: single-node
    

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

Настройки потребления RAM Opensearch

Необходимо настроить объем выделяемого ОЗУ в файле /etc/opensearch/jvm.options. Действие выполняется на каждом узле кластера.

Значения выделяемой ОЗУ не должно быть более 50% от общего объема RAM (при условии, что на сервере не устанавливаются другие ресурсоемкие приложения) и не более 32 Гб. Xms должен быть равен Xmx. В примере, указанном ниже, значение равно 16 Гб:

-Xms16g
-Xmx16g

Настройка SSL Opensearch

Совет

Если не требуется подключение по ssl, то описанные шаги можно пропустить

Для работы SSL требуются сертификаты, генерация которых происходит на одной ноде, затем они копируются на остальные ноды.

  1. На каждом узле удалите или переместите стандартные демо сертификаты в сторонний каталог, т.к. они могут помешать запуску:

    cd /etc/opensearch && mkdir -p /opt/_os_default_demo_certs_ && mv  *.pem /opt/_os_default_demo_certs_
    
  2. Сгенерируйте сертификаты (на одной из нод) и перейдите в каталог для сертификатов:

    mdkir -p /etc/opensearch/ssl && cd /etc/opensearch/ssl
    
  3. Создайте корневой сертификат и сертификат администратора, который потребуется для управления настройками:

     # Root CA
    openssl genrsa -out root-ca-key.pem 2048
    openssl req -new -x509 -sha256 -key root-ca-key.pem -subj "/C=CA/O=ORG/OU=UNIT/CN=root-ca.dns.record" -out root-ca.pem -days 9999
    
    # Admin cert
    openssl genrsa -out admin-key-temp.pem 2048
    openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
    openssl req -new -key admin-key.pem -subj "/C=CA/O=ORG/OU=UNIT/CN=A" -out admin.csr
    openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 9999
    
    # очистите промежуточные файлы, которые больше не нужны
    rm admin-key-temp.pem
    rm admin.csr
    
    # days n - срок действия сертификата в днях
    
  4. Создайте сертификат для каждой ноды кластера Opensearch:

    # Node cert 1
    openssl genrsa -out node1-key-temp.pem 2048
    openssl pkcs8 -inform PEM -outform PEM -in node1-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node1-key.pem
    openssl req -new -key node1-key.pem -subj "/C=CA/O=ORG/OU=UNIT/CN=opensearch-node-1" -out node1.csr
    echo 'subjectAltName=DNS:opensearch-node-1' > node1.ext
    openssl x509 -req -in node1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node1.pem -days 9999 -extfile node1.ext
    
    # Node cert 2
    openssl genrsa -out node2-key-temp.pem 2048
    openssl pkcs8 -inform PEM -outform PEM -in node2-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node2-key.pem
    openssl req -new -key node2-key.pem -subj "/C=CA/O=ORG/OU=UNIT/CN=opensearch-node-2" -out node2.csr
    echo 'subjectAltName=DNS:opensearch-node-2' > node2.ext
    openssl x509 -req -in node2.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node2.pem -days 9999 -extfile node2.ext
    
    # очистите промежуточные файлы, которые больше не нужны
    rm node1-key-temp.pem
    rm node1.csr
    rm node1.ext
    rm node2-key-temp.pem
    rm node2.csr
    rm node2.ext
    
  • Выше представлен пример для двух нод. Для каждой последующей ноды важно:

    • Заменить все названия файлов в команде, содержащие nodeN (т.е. node1-key-temp.pem -> node3-key-temp.pem; node1-key.pem -> node3-key.pem ... и т.д.)

    • Указать в параметре CN= действительный hostname/dns адрес для каждой ноды opensearch: -subj "/C=CA/O=ORG/OU=UNIT/CN=opensearch-node-1"

  1. Скопируйте на все ноды Opensearch получившиеся файлы в каталог /etc/opensearch/ssl и выдайте права на каталог и файлы:

    chown opensearch:opensearch -R /etc/opensearch/ssl
    chown +x /etc/opensearch/ssl
    chmod 600 /etc/opensearch/ssl/*
    chmod 644 /etc/opensearch/ssl/root-ca.pem
    

Конфигурация файла opensearch.yml (SSL)

  1. На каждой ноде очистите файл конфигурации и откройте файл (любым редактором):

    sudo cp -i /etc/opensearch/opensearch.yml /etc/opensearch/opensearch.yml_before_ssl && > /etc/opensearch/opensearch.yml # Очистка файла
    sudo vi /etc/opensearch/opensearch.yml
    
  2. Вставьте следующее содержимое:

    cluster.name: universe-os-cluster
    network.host: opensearch-node-1
    node.name: node01
    
    cluster.initial_master_nodes: ["opensearch-node-1","opensearch-node-2"]
    discovery.seed_hosts: ["opensearch-node-2"]
    
    # для кластера параметр ниже должен быть удален, или закомментирован
    #discovery.type: single-node
    
    plugins.security.ssl.transport.pemcert_filepath: /etc/opensearch/ssl/node1.pem
    plugins.security.ssl.transport.pemkey_filepath: /etc/opensearch/ssl/node1-key.pem
    plugins.security.ssl.transport.pemtrustedcas_filepath: /etc/opensearch/ssl/root-ca.pem
    plugins.security.ssl.transport.enforce_hostname_verification: false
    
    # enable ssl 9200
    plugins.security.ssl.http.enabled: true
    plugins.security.ssl.http.pemcert_filepath: /etc/opensearch/ssl/node1.pem
    plugins.security.ssl.http.pemkey_filepath: /etc/opensearch/ssl/node1-key.pem
    plugins.security.ssl.http.pemtrustedcas_filepath: /etc/opensearch/ssl/root-ca.pem
    plugins.security.allow_default_init_securityindex: true
    plugins.security.authcz.admin_dn:
      - 'CN=A,OU=UNIT,O=ORG,C=CA'
    plugins.security.nodes_dn:
      - 'CN=opensearch-node-1,OU=UNIT,O=ORG,C=CA'
      - 'CN=opensearch-node-2,OU=UNIT,O=ORG,C=CA'
    
    plugins.security.enable_snapshot_restore_privilege: true
    plugins.security.check_snapshot_restore_write_privileges: true
    plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
    cluster.routing.allocation.disk.threshold_enabled: false
    plugins.security.audit.config.disabled_rest_categories: NONE
    plugins.security.audit.config.disabled_transport_categories: NONE
    
    plugins.security.allow_unsafe_democertificates: false
    
    path.data: /var/lib/opensearch
    path.logs: /var/log/opensearch
    
  3. Замените описания следующих параметров:

  • Общие для кластера параметры в файле:

    • cluster.name - должен быть одинаковый для всех узлов кластера

    • cluster.initial_master_nodes - указываются все ноды кластера

    • network.host: 0.0.0.0 - при указании 0.0.0.0 используются все доступные интерфейсы и ip адреса, в ином случае можно указать конкретный ip адрес текущего узла, доступный для всех нод

    • plugins.security.authcz.admin_dn - указываются атрибуты админского ключа, получить значение в требуемом формате можно командой openssl x509 -subject -nameopt RFC2253 -noout -in admin.pem

    • В параметре plugins.security.nodes_dn указываются все ноды кластера. Должны быть указаны те атрибуты, которые были использованы в команде при генерации сертификатов:

      • CN=opensearch-node-1,OU=UNIT,O=ORG,C=CA

      • CN=opensearch-node-2,OU=UNIT,O=ORG,C=CA. Формат отличается от того, что указан при генерации. Чтобы отобразить в требуемом виде, можно выполнить команды для каждого сертификата: openssl x509 -subject -nameopt RFC2253 -noout -in node1.pem openssl x509 -subject -nameopt RFC2253 -noout -in node2.pem openssl x509 -subject -nameopt RFC2253 -noout -in nodeN.pem

  • Уникальные для каждой ноды параметры:

    • Уникальный node.name

    • Для параметров укажите путь к сертификатам для текущей ноды кластера, например:

      • plugins.security.ssl.http.pemcert_filepath: /etc/opensearch/ssl/node1.pem

      • plugins.security.ssl.http.pemkey_filepath: /etc/opensearch/ssl/node1-key.pem

      • plugins.security.ssl.http.pemcert_filepath: /etc/opensearch/ssl/node1.pem

      • plugins.security.ssl.http.pemkey_filepath: /etc/opensearch/ssl/node1-key.pem

    • Укажите соседние ноды кластера в параметре discovery.seed_hosts. Если используются 3 ноды, то для opensearch-node-1 параметр будет выглядеть следующим образом ["opensearch-node-2", "opensearch-node-3"]

Создание хранилища ключей для использования в приложении при подключении к Opensearch (SSL)

  1. Создайте truststore и поместите туда сертификат открытого ключа узла:

    keytool -import -trustcacerts -file node1.pem -keystore app-truststore.jks
    
  2. Введите и подтвердите пароль. Например, для MY-TrustStore-pswd введите yes на вопрос Trust this certificate?

  3. Создайте keystore и пометите туда сертификат открытого ключа узла:

    openssl pkcs12 -export -in admin.pem -inkey admin-key.pem -out admin.p12 -CAfile root-ca.srl -caname root
    keytool -importkeystore -destkeystore app-keystore.jks -srckeystore admin.p12 -srcstoretype PKCS12
    
  4. Введите и подтвердите пароль. Например, MY-p_12-pswd:

    keytool -importkeystore -destkeystore app-keystore.jks -srckeystore admin.p12 -srcstoretype PKCS12
    
  5. Задайте новый пароль и подтвердить его, он потребуется в конфигурации приложения. Например, MY-keyStore-pswd.

  6. Введите ранее введенный пароль MY-p_12-pswd.

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

      keytool -importkeystore -deststorepass MY-keyStore-pswd -destkeypass MY-keyStore-pswd -destkeystore app-keystore.jks -srckeystore admin.p12 -srcstoretype PKCS12 -srcstorepass MY-p_12-pswd
      
  7. Удалите промежуточный файл:

    rm -f  admin.p12
    

Пароли и полученные файлы .jks потребуются при настройке приложения

Запуск Opensearch

  1. Обновите службы:

    sudo systemctl daemon-reload
    
  2. Добавьте Opensearch в автозагрузку:

    sudo systemctl enable opensearch.service
    
  3. Запустите Opensearch:

    sudo systemctl start opensearch.service
    
  4. Проверьте статус:

    sudo systemctl status opensearch.service
    

Проверка запуска Opensearch

  1. Проверьте ноды Opensearch:

    curl 'https://localhost:9200' -k -u 'admin:admin'
    
  2. Проверьте статус кластера:

    curl 'https://localhost:9200/_cluster/health?pretty' -k -u 'admin:admin'
    

Примечание

Важно, чтобы "status" = "green", а имя статуса и количество нод совпадали с настроенным значением

Смена логина/пароля для доступа к Opensearch

Пользователи Opensearch хранятся в файле /etc/opensearch/opensearch-security/internal_users.yml. Пароль указан в виде хэша, пример:

admin:
  hash: "$2a$12$VcCDgh2NDk07JGN0rjGbM.Ad41qVR/YFJcgHp0UGns5JDymv..TOG"
  1. Чтобы получить хэш пароля, который необходимо использовать, нужно выполнить команду, ввести свой пароль, и получить хэш, который можно вставить в данный конфиг:

    bash /usr/share/opensearch/plugins/opensearch-security/tools/hash.sh
    
  2. Для применения настроек файла выполните скрипт:

    cd /usr/share/opensearch/plugins/opensearch-security/tools && \
    ./securityadmin.sh -cd /etc/opensearch/opensearch-security -icl -nhnv -h localhost \
       -cacert /etc/opensearch/ssl/root-ca.pem \
       -cert /etc/opensearch/ssl/admin.pem\
       -key /etc/opensearch/ssl/admin-key.pem
    
  3. Результат успешного выполнения команды: Done with success

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

В файле internal_users.yml также можно переименовать пользователя admin, всех остальных удалить и применить конфигурацию.

Установка PostgreSQL 12

Все пакеты, необходимые для корректной установки, располагаются в директории PostgreSQL (/<OFFLINE_REP>/Postgresql).

Для установки postgresql:

  1. Перейдите в директорию PostgreSQL и выполните команду:

    sudo dpkg -i *.deb
    
  2. Основные конфигурационные файлы postgresql находятся в каталоге:

  • /etc/postgresql/12/main/postgresql.conf

  • /etc/postgresql/12/main/pg_hba.conf

  1. В файле /etc/postgresql/12/main/postgresql.conf задайте перечисленные параметры следующим образом. Также замените port=5433 на port=5432:

    listen_addresses = '*'
    max_connections = 1000
    max_prepared_transactions = 300
    
  2. В конец файла /etc/postgresql/12/main/pg_hba.conf добавьте строку, которая разрешит подключение к хосту по паролю, для всех баз:

    host    all             all             all            scram-sha-256
    
  3. Перезагрузите postgresql для применения настроек (допускается изменение параметров под индивидуальные потребности):

    systemctl restart postgresql-12
    
  4. Продолжите настройку в консоли. Зайдите в базу данных под пользователем:

    sudo su
    su postgres
    psql
    
  5. Задайте пароль пользователя:

    ALTER USER postgres WITH PASSWORD 'notpostgres_change_me'
    
  6. Создайте базу данных для приложения (доступен выбор собственного логического наименования, которое будет использовано в дальнейшем):

    CREATE DATABASE universe;
    
  7. Поменяйте timezone (например, MSK+3):

    ALTER SYSTEM SET timezone TO 'W-SU';
    ALTER SYSTEM SET random_page_cost TO 1.1;
    
  8. Раскомментируйте и задайте размер буфера. При ОЗУ 1 ГБ и более значение shared_buffers составляет 25% от объема памяти:

    ALTER SYSTEM SET shared_buffers TO '4GB'
    
  9. Перезагрузите postgresql для применения дополнительных настроек:

    systemctl restart postgresql-12
    
  10. Проверьте подключение к базе и запрос пароля:

    psql -U postgres -h localhost
    

Установка TimescaleDB

Для работы некоторых компонентов DG требуется расширение TimescaleDB для PostgreSQL. Для его установки нужно перейти в каталог с пакетами /<OFFLINE_REP>/TimescaleDB.

  1. Выполните команду:

    dpkg -i *.deb
    
  2. Затем раскомментируйте и измените следующие параметры в файле /<OFFLINE_REP>/postgresql/12/main/postgresql.conf:

    shared_preload_libraries='timescaledb'
    timescaledb.telemetry_level=off
    
  3. Перезагрузите PostgreSQL для применения настроек:

    systemctl restart postgresql-12
    

Дополнительная информация о том, где брать пакеты, если будет использоваться другая версия Postgres/Linux:

# добавляем repo, buster - это debian10, ядро AtraLinux 1.7
echo "deb https://packagecloud.io/timescale/timescaledb/debian/ buster main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo apt-key add -

# скачать пакеты в текущую директорию определенной версии, postgresql-12 и TimescaleDB2.7.0
apt-get download timescaledb-2-oss-2.7.0-postgresql-12  timescaledb-2-loader-postgresql-12=2.7.0~debian10 timescaledb-tools=0.14.3~debian10 timescaledb-toolkit-postgresql-12=1:1.14.0~debian10

Установка OrientDB

Убедитесь, что Java была установлена (инструкцию см. в начале статьи).

Рекомендуется устанавливать Orientdb на выделенный сервер, т.к. он чувствителен к нехватке ресурсов и производительности диска - использование скоростных дисков (nvme) может увеличить производительность до 16 раз.

Для установки OrientDB:

  1. Распакуйте архив /<OFFLINE_REP>/orientdb-community-3.2.23.tar.gz в каталог /opt. Переименуйте каталог /opt/orientdb-community-3.2.23 в /opt/orientdb. Версия может отличаться.

  2. Добавьте пользователя, из-под которого будет запускаться сервис. Выдайте права на каталог:

    useradd -r orientdb -s /sbin/nologin
    chown -R orientdb:orientdb /opt/orientdb/
    
  3. Отредактируйте файл /opt/orientdb/bin/orientdb.sh, указав следующие значения в переменных:

    ORIENTDB_DIR="/opt/orientdb"
    ORIENTDB_USER="orientdb"
    
  4. Добавьте сервис, создав файл:

    sudo vi /etc/systemd/system/orientdb.service
    
  5. В содержимом файле настройте параметры. Введите ORIENTDB_ROOT_PASSWORD и при необходимости отрегулируйте ORIENTDB_OPTS_MEMORY:

    [Unit]
    Description=OrientDB Server
    After=network.target
    After=syslog.target
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    Environment="ORIENTDB_OPTS_MEMORY=-Xms4G -Xmx4G"
    Environment="ORIENTDB_ROOT_PASSWORD=OrientDBPass"
    Environment=JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
    
    User=orientdb
    Group=orientdb
    ExecStart=/opt/orientdb/bin/server.sh
    
  6. В файле /opt/orientdb/config/orientdb-server-config.xml в директиву <storages> добавьте следующую информацию. При запуске сервиса будет создана база данных dg, которая в дальнейшем будет использоваться:

    <storages>
           <storage name="dg" path="plocal:/opt/orientdb/databases/dg"
                                        loaded-at-startup="true" />
    </storages>
    
  7. При необходимости в этом же файле можно заменить порт и интерфейс, который прослушивает порт. Пример:

    <listener protocol="binary" ip-address="0.0.0.0" port-range="2424-2430" socket="default"/>
              <listener protocol="http" ip-address="0.0.0.0" port-range="2480-2490" socket="default">
    
  • Порт 2424 должен быть открыт в файрволе для доступа приложения.

  • ip-address="0.0.0.0" - может быть заменен на конкретный интерфейс. Так же можно указать localhost для http, если требуется ограничить подключения извне к web интерфейсу OrientDB.

  • http порт опциональный, используется для подключения к WEB-интерфейсу через браузер, и может быть закрыт для безопасности.

  1. Запустите сервис:

    systemctl daemon-reload
    systemctl start orientdb.service
    
  2. Для проверки работоспособности можно вызвать консоль и подключиться к базе, указав логин/пароль:

    /opt/orientdb/bin/console.sh
    CONNECT remote:localhost/dg root OrientDBPass
    

В результате появится сообщение об успешном подключении. Введите exit для выхода.

  1. Проверьте доступность web-интерфейса. Пример ссылки:

    curl http://localhost:2480/server/version
    

Также см. документацию https://www.orientdb.org/docs/3.2.x/fiveminute/

Настройка OrientDB (SSL)

Если не требуется подключение по ssl, то пропустите эти шаги.

Генерация сертификатов OrientDB (SSL)

Для работы SSL требуются сертификаты. Для их создания выполните действия ниже.

  1. Создайте каталог и перейдите в него для выполнения последующих команд:

    cd /opt/orientdb/config/ && mkdir -p cert && cd  cert
    
  2. Создайте сертификат и задайте пароль:

    keytool -genkey -alias orientserver -keystore orientdb.ks \
         -keyalg RSA -keysize 2048 -validity 9999
    

Например, orientdb_KS_pass оставьте пустыми (нажмите ENTER). В значениях атрибутов, после вопроса: Is * correct? [no]: yes ответьте yes.

  1. Экспортируйте сертификат, введя пароль orientdb_KS_pass из прошлого шага:

    keytool -export -alias orientserver -keystore orientdb.ks \
         -file orientdb.cert
    

Настройка OrientDB для работы с сертификатами (SSL)

  1. Отредактируйте файл /opt/orientdb/config/orientdb-server-config.xml. Замените следующие строки:

    <listener protocol="binary" ip-address="0.0.0.0" port-range="2424-2430" socket="default"/>
    <listener protocol="http" ip-address="0.0.0.0" port-range="2480-2490" socket="default">
    

На строки:

<listener protocol="binary" ip-address="0.0.0.0" port-range="2434-2434" socket="ssl"/>
<listener protocol="http" ip-address="0.0.0.0" port-range="2480-2480" socket="https">
  • Порт 2424 должен быть открыт в файрволе для доступа приложения.

  • ip-address="0.0.0.0" - может быть заменен на конкретный интерфейс. Так же можно указать localhost для http, если требуется ограничить подключения извне к web интерфейсу OrientDB.

  • http порт опциональный, используется для подключения к WEB-интерфейсу через браузер, и может быть закрыт для безопасности.

  1. В этом же файле замените содержимое директивы <network> и <sockets> на строки из примера ниже. Здесь должны быть указаны пароли, которые были использованы при создании сертификатов:

    <socket implementation="com.orientechnologies.orient.server.network.OServerTLSSocketFactory" name="ssl">
    <parameters>
         <parameter value="false" name="network.ssl.clientAuth"/>
         <parameter value="config/cert/orientdb.ks" name="network.ssl.keyStore"/>
         <parameter value="orientdb_KS_pass" name="network.ssl.keyStorePassword"/>
         <parameter value="config/cert/orientdb.ks" name="network.ssl.trustStore"/>
         <parameter value="orientdb_KS_pass" name="network.ssl.trustStorePassword"/>
    </parameters>
    </socket>
    <socket implementation="com.orientechnologies.orient.server.network.OServerTLSSocketFactory" name="https">
    <parameters>
         <parameter value="false" name="network.ssl.clientAuth"/>
         <parameter value="config/cert/orientdb.ks" name="network.ssl.keyStore"/>
         <parameter value="orientdb_KS_pass" name="network.ssl.keyStorePassword"/>
         <parameter value="config/cert/orientdb.ks" name="network.ssl.trustStore"/>
         <parameter value="orientdb_KS_pass" name="network.ssl.trustStorePassword"/>
    </parameters>
    
  2. Отредактируйте файл подключения из консоли /opt/orientdb/bin/console.sh. Включите SSL, укажите актуальные пароли и сертификаты в следующих параметрах:

    KEYSTORE="$ORIENTDB_HOME/config/cert/orientdb-console.ks"
    KEYSTORE_PASS=orientdb_CONSOLE_pass
    TRUSTSTORE="$ORIENTDB_HOME/config/cert/orientdb-console.ts"
    TRUSTSTORE_PASS=orientdb_TS_pass
    SSL_OPTS="-Dclient.ssl.enabled=true"
    
  3. Запустите / перезагрузите сервис:

    systemctl daemon-reload
    systemctl restart orientdb.service
    
  4. Для проверки работоспособности можно вызвать консоль и подключиться к базе, указав логин/пароль:

    /opt/orientdb/bin/console.sh
    CONNECT remote:localhost:2434/dg root OrientDBPass
    

В результате появится сообщение об успешном подключении. Введите exit для выхода.

  1. Проверьте доступность web-интерфейса. Пример ссылки:

    curl http://localhost:2480/server/version
    

Установка Tomcat

Для запуска Tomcat требуется Java (описание установки см. выше).

  1. Создайте пользователя для запуска tomcat:

    sudo useradd -r tomcat -s /sbin/nologin
    
  2. Распакуйте дистрибутив из каталога apache-tomcat-9.0.*.tar.gz в каталог /opt/.

  3. Переименуйте каталог /opt/apache-tomcat-9.0.* в /opt/tomcat-9 (версия может отличаться).

  4. Удалите стандартные файлы и каталоги Manager App, которые могут содержаться в дистрибутиве tomcat из каталога /opt/tomcat-9/webapps:

    rm -rf /opt/tomcat-9/webapps/*
    
  5. Выдайте права на директорию tomcat для пользователя tomcat:

    chown -R tomcat:tomcat /opt/tomcat-9
    
  6. Добавьте сервис, создав файл tomcat.service:

    sudo vi /etc/systemd/system/tomcat.service
    

со следующим содержимым, задав параметры потребления RAM в CATALINA_OPTS:

[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat-9/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat-9
Environment=CATALINA_BASE=/opt/tomcat-9
Environment='CATALINA_OPTS=-Xms1024M -Xmx2048M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

WorkingDirectory=/opt/tomcat-9/

ExecStart=/opt/tomcat-9/bin/startup.sh
ExecStop=/opt/tomcat-9/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target
  1. Примените конфигурацию сервисов:

    systemctl daemon-reload
    

Установка приложения Universe

Для запуска приложения требуется Tomcat и Java (описание установки см. выше).

Начало установки

  1. Установка .war файлов: в каталоге Application_Tomcat содержатся 2 архива: frontend или backend. В каждом архиве содержатся .war файлы, которые необходимо скопировать в директорию /opt/tomcat-9/webapps/.

  2. Установка дополнительных параметров и библиотек: в архиве backend содержится каталог Tomcat, содержимое которого необходимо скопировать в каталог /opt/tomcat-9/. Находясь в распакованном каталоге архива backend, перейдите в каталог tomcat и скопируйте файлы в директорию сервиса:

    sudo cp -v bin/setenv.sh /opt/tomcat-9/bin/ && \
    sudo cp -rv conf/universe /opt/tomcat-9/conf/ && \
    sudo cp -v libs/* /opt/tomcat-9/lib/
    
  3. Предоставьте права на файлы для сервиса:

    chown -R tomcat:tomcat /opt/tomcat-9
    chmod +x /opt/tomcat-9/bin/*.sh
    

Настройка приложения

  1. Основные параметры задаются в переменных в файле setenv.sh. Отредактируйте файл:

    vi /opt/tomcat-9/bin/setenv.sh
    
  2. Установите/добавьте следующие переменные, установив значения соответствующие логическому имени переменной:

    # имеющийся параметр JAVA_OPTS НЕ затрагиваются
    
    # укажите параметры подключения к базе
    export POSTGRES_ADDRESS="localhost:5432"
    export POSTGRES_USERNAME="postgres"
    export POSTGRES_PASSWORD="notpostgres_change_me"
    export DATABASE_NAME="universe"
    
    # укажите параметры подключения к Opensearch:
    
    export SEARCH_CLUSTER_NAME="universe-os-cluster"
    export SEARCH_CLUSTER_ADDRESS="localhost:9200"
    # при использовании кластера Opensearch в переменной SEARCH_CLUSTER_ADDRESS перечисляются через запятую все ноды (hostname или ip), пример:
    # SEARCH_CLUSTER_ADDRESS=opensearch-node-1:9200,opensearch-node-2:9200,opensearch-node-3:9200
    

Настройка приложения для подключения к Opensearch через SSL

  1. Создайте каталог для сертификатов:

    sudo mkdir /opt/tomcat-9/ssl
    
  2. Скопируйте созданные на предыдущих шагах .jks файлы в созданный каталог:

    cp -v *\.jks /opt/tomcat-9/ssl
    chown -R tomcat:tomcat /opt/tomcat-9/ssl
    
  3. Основные параметры задаются в переменных в файле setenv.sh. Отредактируйте файл:

    vi /opt/tomcat-9/bin/setenv.sh
    
  4. Установите/добавьте следующие переменные, введя значения, соответствующие логическому имени переменной:

    export SEARCH_CLUSTER_NAME="universe-os-cluster"
    # в качестве адреса требуется использовать dns имя, которые прописано в сертификате в CN
    export SEARCH_CLUSTER_ADDRESS="opensearch-node-1:9200"
    # при использовании кластера Opensearch в переменной SEARCH_CLUSTER_ADDRESS перечисляются через запятую все ноды (hostname или ip), пример:
    # SEARCH_CLUSTER_ADDRESS=opensearch-node-1:9200,opensearch-node-2:9200,opensearch-node-3:9200
    
    export SEARCH_SECURITY_ENABLED=true
    # учетные данные для авторизации в Opensearch
    export SEARCH_ADMIN_LOGIN=admin
    export SEARCH_ADMIN_PASSWORD=admin
    
    # укажите сформированные для Opensearch jks файлы и пароли от них
    export SEARCH_TRUSTSTORE_PATH=/opt/tomcat-9/ssl/app-truststore.jks
    export SEARCH_TRUSTSTORE_PASSWORD=MY-TrustStore-pswd
    
    export SEARCH_KEYSTORE_PATH=/opt/tomcat-9/ssl/app-keystore.jks
    export SEARCH_KEYSTORE_PASSWORD=MY-keyStore-pswd
    

Кластерная настройка приложения

  1. Если планируется использование нескольких серверов Tomcat, то для настройки кластерной конфигурации приложения в файле /opt/tomcat-9/conf/universe/backend.properties на каждом сервере требуется изменить ряд настроек:

    vi /opt/tomcat-9/conf/universe/backend.properties
    
  2. Следующие параметры одинаковые для каждого узла приложения:

    # включите распределенный кэш
    org.unidata.ddg.system.cache.tcp-ip.enabled=true
    # перечислите все ноды tomcat, ip или hostname
    org.unidata.dg.system.cache.tcp-ip.members=server-192-168-106-110,server-192-168-106-111
    
    # стандартный порт, при необходимости можно заменить, должен быть открыт для всех узлов кластера приложения
    org.unidata.dg.system.cache.port=5701
    
  3. Параметр ниже должен быть уникальный для каждого узла в кластере приложения, пример значения параметра:

    org.unidata.dg.system.node.id=node1
    #org.unidata.dg.system.node.id=nodeN # для остальных N серверов
    
  4. Пример сообщения в логе ( logs/catalina.out ), позволяющее определить то, что приложения объединились в кластер:

    INFO com.hazelcast.internal.server.tcp.TcpServerConnection.null [server-192-168-106-111]:5701 [dev] Initialized new cluster connection between /192.168.106.111:44589 and server-192-168-106-110/192.168.106.110:5701
    com.hazelcast.internal.cluster.ClusterService.null [server-192-168-106-111]:5701 [dev]
    
    Members {size:2, ver:2} [
            Member [server-192-168-106-110]:5701 - b15485d2-3121-4398-adf0-aee0147d442e
            Member [server-192-168-106-111]:5701 - c61b4e32-94da-4e6a-8f1d-269ccb7f0f10 this
    ]
    

Запуск приложения

  • Управление осуществляется через сервис, на каждом узле tomcat:

    sudo systemctl start tomcat
    sudo systemctl status tomcat
    # sudo systemctl restart tomcat
    # sudo systemctl stop tomcat
    
  • Логи приложения находятся в каталоге /opt/tomcat-9/logs/.

После окончания установки выполните вход в систему Юниверс.

Устранение возможных проблем

Ошибка orientDB: переполнение памяти.

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

<properties>
<entry name="storage.diskCache.bufferSize" value="5120" />
</properties>

storage.diskCache.bufferSize - размер кеша в мегабайтах, по умолчанию хранит данные в оперативной памяти. Выделенный размер использует постепенно, не связан с ограничениями размера heap.

Минимальные ограничения по оперативной памяти для запуска: -Xms2048M -Xmx2048M -Dstorage.diskCache.bufferSize=2048

Минимальный желаемый размер по выделяемой оперативной памяти 4Гб. Рекомендуется 8-10 Гб.