Закрытый контур на Ubuntu

Внимание

Дисклеймер.

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

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

Примечание

Ниже приведен пример установки системы на сервер Ubuntu 22.04 minimal installation.

Примечание

Ограничьте права доступа на файл backend properties. Сервер приложений должен иметь права только на чтение файла. Администратор должен иметь права на чтение и редактирование. Также рекомендуется ограничить доступ ко всей директории с конфигурацией, оставив доступ на чтение и редактирование только серверу приложений и администратору.

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

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

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

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

Установка с помощью bash скрипта

В корне директории MDM_6.X_Ubuntu_22.04_offline_install находится скрипт install.sh, который устанавливает систему автоматически со стандартными настройками.

Скрипт содержит 2 переменные:

  • POSTGRES_PASSWORD - берет значение из файла setenv.sh

  • TOMCAT_HOME - указана стандартная директория для установки Universe.

Также скрипт состоит из функций, последовательность которых описана в конце файла:

  • checkdirs - проверяет все ли директории, необходимые для установки на месте,

  • check_files - проверяет наличие необходимых конфигурационных файлов в папке conf_files,

  • install_mc - устанавливает Midnight Commander,

  • install_vim - устанавливает Vim,

  • install_Opensearch - устанавливает и конфигурирует Opensearch,

  • install_postgres - устанавливает и конфигурирует postgresql,

  • install_java - устанавливает и конфигурирует OpenJDK,

  • install_universe - производит все необходимые действия для запуска Universe.

Перед запуском скрипта

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

  1. Файл setenv.sh содержит основные настройки Universe:

    • export POSTGRES_ADDRESS="localhost:5432" - адрес сервера Postgres,

    • export POSTGRES_USERNAME="postgres" - пользователь БД postgres,

    • export POSTGRES_PASSWORD="notpostgres" - пароль пользователя Postgres,

    • export DATABASE_NAME="universe" - имя базы данных,

    • export SEARCH_CLUSTER_NAME="universe-os-cluster" - имя кластера Opensearch, которое должно соответствовать значению параметра cluster.name в opencsearch.yml,

    • export SEARCH_CLUSTER_ADDRESS="localhost:9200" - адрес кластера Opensearch.

  2. Файл postgresql.conf содержит основные настойки PostgreSQL Из перечня настроек необходимо изменить следующие:

    • max_prepared_transactions = 300

    • max_connections = 1000

    • port = 5432

    • listen_addresses = '*'

  3. Файл pg_hba.conf содержит настройки безопасности PostgreSQL. Можно изменить данную секцию в соответствии с требуемыми настройками безопасности:

    # Database administrative login by Unix domain socket
    local all postgres peer
    # TYPE DATABASE USER ADDRESS METHOD
    # "local" is for Unix domain socket connections only
    local all all md5
    # IPv4 local connections:
    host all all 127.0.0.1/32 trust
    # IPv6 local connections:
    host all all ::1/128 trust
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    local replication all peer
    host replication all 127.0.0.1/32 scram-sha-256
    host replication all ::1/128 scram-sha-256
    
  4. Файл opensearch.yml содержит конфигурации Opensearch. Вы можете изменить: cluster.name: universe-os-cluster, path.data: /var/lib/opensearch, path.logs: /var/log/opensearch и другие параметры в соответствии с требованиями к настройкам системы.

  5. Файл tomcat.service необходим в создании tomcat daemon. Не нуждается в редактировании, будет автоматически скопирован скриптом.

Запуск скрипта

  1. Предоставьте скрипту права на исполнение:

    sudo chmod +x ./install.sh
    
  2. Запустите скрипт от имени супер-пользователя:

    sudo ./install.sh
    
  3. По окончании исполнения скрипта Universe будет доступна по адресу: http://ваш_IP:8080/universe-frontend (логин и пароль: admin/admin)

После введения логина и пароля система запросит файл лицензии и смену пароля.

Ручная установка

Установка Midnight Commander (опционально)

  • Все пакеты и зависимости для Midnight Commander располагаются по пути: ./<OFFLINE_REP>/mc

  • Для установки Midnight Commander перейдите в указанную директорию и выполните команду:

    sudo dpkg -i *.deb
    

Установка Vim (опционально)

  • Все пакеты и зависимости для vim располагаются по пути: ./<OFFLINE_REP>/vim

  • Для установки vim перейдите в указанную директорию и выполните команду:

    sudo dpkg -i *.deb
    

Установка Opensearch

Используйте один из вариантов установки с помощью команд:

wget https://artifacts.opensearch.org/releases/bundle/opensearch/2.14.0/opensearch-2.14.0-linux-x64.deb
sudo dpkg -i opensearch-2.14.0-linux-x64.deb

Или:

curl -o- https://artifacts.opensearch.org/publickeys/opensearch.pgp | sudo gpg --dearmor --batch --yes -o /usr/share/keyrings/opensearch-keyring
echo "deb [signed-by=/usr/share/keyrings/opensearch-keyring] https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/apt stable main" | sudo tee /etc/apt/sources.list.d/opensearch-2.x.list
sudo apt-get update
sudo apt-get install opensearch=2.14.0

Запуск Opensearch:

sudo systemctl enable opensearch
sudo systemctl start opensearch

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

В дистрибутиве opensearch по умолчанию включена демо-конфигурация безопасности, ее необходимо отключить:

export DISABLE_SECURITY_PLUGIN=true
sudo systemctl restart opensearch

Или добавьте plugins.security.disabled: true в /usr/share/opensearch/config/opensearch.yml

Установка плагина Analysis-ICU (обязательно)

  • Плагин Analysis-ICU для Opensearch располагается по пути: ./<OFFLINE_REP>/Opensearch/analysis-icu-2.14.0.zip

  • Для установки плагина используйте команду (сработает, если каталог <OFFLINE_REP> распакована в домашнюю директорию):

    sudo /usr/share/opensearch/bin/opensearch-plugin install analysis-icu
    

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

  1. Словари hunspell располагаются по пути: ./<OFFLINE_REP>/Opensearch/hunspell

  2. Для установки скопируйте директорию /<OFFLINE_REP>/Opensearch/hunspell в /etc/opensearch/:

    sudo cp -rv /path/to/hunspell /etc/opensearch
    
  3. Выдайте права для новой директории:

    sudo chown -R root:opensearch /etc/opensearch/hunspell/
    
  4. В случае если готовая директория со словарями отсутствует - составьте ее:

    cd /etc/opensearch/
    sudo mkdir hunspell
    cd hunspell/
    sudo mkdir ru_RU
    sudo mkdir en_US
    cd /etc/opensearch/hunspell/ru_RU
    sudo wget https://cgit.freedesktop.org/libreoffice/dictionaries/plain/ru_RU/ru_RU.dic
    sudo wget https://cgit.freedesktop.org/libreoffice/dictionaries/plain/ru_RU/ru_RU.aff
    cd /etc/opensearch/hunspell/en_US
    sudo wget https://cgit.freedesktop.org/libreoffice/dictionaries/plain/en/en_US.dic
    sudo wget https://cgit.freedesktop.org/libreoffice/dictionaries/plain/en/en_US.aff
    sudo chown -R root:opensearch /etc/opensearch/hunspell/
    

См. также инструкцию по настройке библиотеки Hunspell.

Конфигурация cluster.name:

  1. Откройте файл конфигурации (также доступно в mc):

    sudo vi /etc/opensearch/opensearch.yml
    
  2. Замените параметр cluster.name, например, на universe-os-cluster

  3. После внесенных изменений перезапустите Opensearch:

    sudo systemctl restart opensearch
    

Проверка запуска доступна с помощью команды:

curl -X GET '127.0.0.1:9200'

Установка PostgreSQL и TimescaleDB

  1. Установите обязательные пакеты:

    sudo apt install gnupg postgresql-common apt-transport-https lsb-release wget
    
  2. Запустите скрипт установки пакета PostgreSQL:

    sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
    
  3. Добавьте пакет TimescaleDB:

    echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
    
  4. Установите ключ TimescaleDB GPG:

    wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/timescaledb.gpg
    
  5. Обновите список локальных репозиториев:

    sudo apt update
    
  6. Установите TimescaleDB версии 2.15.2:

    sudo apt-get install timescaledb-2-postgresql-16='2.15.2' timescaledb-2-loader-postgresql-16='2.15.2'
    
  7. Настройте свой экземпляр PostgreSQL для TimescaleDB:

    sudo timescaledb-tune
    

    Этот скрипт включен в timescaledb-tools пакет при установке TimescaleDB. Для получения дополнительной информации см. официальную документацию по конфигурации.

  8. Основные конфигурационные файлы postgresql находятся по пути: /etc/postgresql/16/main/postgresql.conf и /etc/postgresql/16/main/pg_hba.conf

  9. В файле /etc/postgresql/16/main/postgresql.conf раскомментируйте и измените следующие параметры: #listen_addresses = 'localhost', max_connections = 100, #max_prepared_transactions = 0 замените на listen_addresses = '*', max_connections = 1000, max_prepared_transactions = 300, а port=5433 замените на port=5432.

  10. Секции файла /etc/postgresql/16/main/pg_hba.conf должны приобрести следующий вид (допускается изменение параметров под индивидуальные потребности):

    # Database administrative login by Unix domain socket
    local   all             postgres                                peer
    
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    
    # "local" is for Unix domain socket connections only
    local   all             all                                     md5
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    local   replication     all                                     peer
    host    replication     all             127.0.0.1/32            scram-sha-256
    host    replication     all             ::1/128                 scram-sha-256
    
  11. После установки и настройки измените пароль пользователю postgres ('notpostgres' - пароль пользователя postgres):

    sudo su
    su postgres
    psql
    alter user postgres with password 'notpostgres';
    
  12. Создайте базу данных universe с помощью команды:

    CREATE DATABASE universe;
    
  13. Добавьте расширение TimescaleDB в вашу базу данных. Подключитесь к базе данных на вашем экземпляре PostgreSQL:

    psql -d "postgres://<username>:<password>@<host>:<port>/<universe>"
    
  14. Добавьте TimescaleDB в базу данных:

    CREATE EXTENSION IF NOT EXISTS timescaledb;
    
  15. Проверьте, установлен ли TimescaleDB:

    \dx
    
  16. Нажмите q, чтобы выйти из списка расширений.

Установка openJDK

  • Все пакеты необходимые для корректной установки openJDK располагаются по пути: ./<OFFLINE_REP>/java

  • Для установки openjdk необходимо перейти в эту директорию и выполнить команду:

    sudo dpkg -i *.deb
    

Установка Tomcat

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

    sudo useradd -m -U -d /opt/tomcat-9 -s /bin/false tomcat
    
  2. Каталог с tomcat находится в /<OFFLINE_REP>/tomcat-9.

  3. После выполнения команды будет создан пользователь tomcat с домашним каталогом /opt/tomcat-9. Скопируйте этот каталог в /opt/:

    sudo cp -rv /<OFFLINE_REP>/tomcat-9/* /opt/tomcat-9
    
  4. Для создания демона скопируйте файл ./<OFFLINE_REP>/conf_files/tomcat.service в /etc/systemd/system/:

    cp -v MDM_6.X_Ubuntu_22.04_offline_install/conf_files/tomcat.service /etc/systemd/system/
    
  5. Перезагрузите демоны:

    systemctl daemon-reload
    

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

  1. Дистрибутив Universe находится по пути /<OFFLINE_REP>/universe-6.х (6.х - номер версии системы Universe).

  2. Для установки нужно перейти в данную директорию:

    cd /<OFFLINE_REP>/universe-6.x/Tomcat/
    
  3. Скопируйте конфигурации:

    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/ &&\
    sudo cp -v webapps/* /opt/tomcat-9/webapps/
    
  4. Предоставьте права директории tomcat-9:

    chown -R tomcat:tomcat /opt/tomcat-9
    
  5. Предоставьте права на запуск исполняемым файлам:

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

Настройка системы:

Для корректного запуска системы необходимо измените следующие файлы:

  • /opt/tomcat-9/bin/setenv.sh - приведите к следующему виду (значение настроек описано в секции "Перед запуском скрипта:

    export JAVA_OPTS="${JAVA_OPTS} -Dunidata.conf=${CATALINA_HOME}/conf/universe -Dlogback.configurationFile=${CATALINA_HOME}/conf/universe/logback.xml"
    #export JRE_HOME=/usr/lib/jvm/java-8-oracle
    #export JAVA_HOME=/usr/lib/jvm/java-8-oracle
    export POSTGRES_ADDRESS="localhost:5432"
    export POSTGRES_USERNAME="postgres"
    export POSTGRES_PASSWORD="notpostgres"
    export DATABASE_NAME="universe"
    export SEARCH_CLUSTER_NAME="universe-os-cluster"
    export SEARCH_CLUSTER_ADDRESS="localhost:9200"
    
  • /opt/tomcat-9/conf/universe/backend.properties - добавьте настройки пути хранения лога:

    org.unidata.mdm.system.bitronix.tm.journal.disk.logPart1Filename=${CATALINA_HOME}/logs/btm1.tlog
    org.unidata.mdm.system.bitronix.tm.journal.disk.logPart2Filename=${CATALINA_HOME}/logs/btm2.tlog
    

Запуск системы:

  1. Перезагрузите tomcat:

    sudo systemctl restart tomcat
    
  2. После окончания установки перейдите по адресу: http://ВАШ-IP:8080/universe-frontend (логин и пароль: admin/admin)

  3. Далее выполните вход в систему Юниверс.

Конфигурация безопасности

Конфигурация безопасности необходима для:

  • Генерации сертификатов или их получения из авторитетного источника;

  • Размещения сертификатов в Opensearch и Юниверс MDM.

  • Настройки credentials MDM клиента.

Примечание

Ниже представлен пример генерации самоподписанных сертификатов

Генерация сертификатов

# Root CA
openssl genrsa -out root-ca-key.pem 2048
openssl req -new -x509 -sha256 -key root-ca-key.pem -subj "/C=RU/ST=SAINT-PETERSBURG/L=SAINT-PETERSBURG/O=UNIVERSE/OU=MDM/CN=root.dns.a-record" -out root-ca.pem -days 730
# 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=RU/ST=SAINT-PETERSBURG/L=SAINT-PETERSBURG/O=UNIVERSE/OU=MDM/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 730
# Node cert
openssl genrsa -out node-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in node-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node-key.pem
openssl req -new -key node-key.pem -subj "/C=RU/ST=SAINT-PETERSBURG/L=SAINT-PETERSBURG/O=UNIVERSE/OU=MDM/CN=universe-os-cluster" -out node.csr
echo 'subjectAltName=DNS:universe-os-cluster' > node.ext
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem -days 730 -extfile node.ext
# Cleanup
rm admin-key-temp.pem
rm admin.csr
rm node-key-temp.pem
rm node.csr
rm node.ext

Флаг -subj задает атрибуты x509 сертификата в скрипте (CN: CommonName, OU: OrganizationalUnit, O: Organization, L: Locality, S: StateOrProvinceName, C: CountryName). Если его пропустить, задание пройдет интерактивно.

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

CN и DNS сертификатов узлов должны совпадать со значением SEARCH_CLUSTER_NAME

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

Конфигурация Opensearch может находиться по пути: /usr/share/opensearch/config/opensearch.yml либо etc/opensearch/opensearch.yml.

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

Пример конфигурации файла /usr/share/opensearch/config/opensearch.yml:

cluster.name: universe-os-cluster
network.host: 0.0.0.0
discovery.type: single-node
plugins.security.ssl.transport.pemcert_filepath: node.pem
plugins.security.ssl.transport.pemkey_filepath: node-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: node.pem
plugins.security.ssl.http.pemkey_filepath: node-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: root-ca.pem
plugins.security.allow_default_init_securityindex: true
plugins.security.authcz.admin_dn:
  - 'emailAddress=my@email.com,CN=A,OU=MDM,O=UNIVERSE,L=SAINT-PETERSBURG,ST=SAINT-PETERSBURG,C=RU'
plugins.security.nodes_dn:
  - 'CN=universe-os-cluster,OU=MDM,O=UNIVERSE,L=SAINT-PETERSBURG,ST=SAINT-PETERSBURG,C=RU'
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

Отформатированную nodes_dn (admin_dn — аналогично) можно получить с помощью команды:

openssl x509 -subject -nameopt RFC2253 -noout -in node.pem

Конфигурация Юниверс MDM

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

    keytool -import -file node.pem -keystore my-truststore.jks
    
  2. Создайте keystore, а также скомбинируйте сертификаты открытого и закрытого ключа клиента, положив туда получившийся .p12 сертификат:

    openssl pkcs12 -export -in admin.pem -inkey admin-key.pem -out volumes/admin.p12 -CAfile root-ca.srl -caname root
    keytool -importkeystore -deststorepass my-keystore-pass -destkeypass my-keystore-pass -destkeystore my-keystore.jks -srckeystore admin.p12 -srcstoretype PKCS12 -srcstorepass my-p12-pass
    
  3. Настройте файл backend.properties:

    # If any security measures are enabled (credentials, encryption)
    org.unidata.mdm.search.security.enabled=true
    
    # Credentials used by MDM to access search cluster
    org.unidata.mdm.search.admin.login=admin
    org.unidata.mdm.search.admin.password=admin
    
    # Truststore of type JKS, stores public certificates of search nodes for MDM to verify
    org.unidata.mdm.search.truststore.path=/path/to/my-truststore.jks
    org.unidata.mdm.search.truststore.password=my-truststore-pass
    
    # Keystore of type JKS, stores public+private .p12 certificate of MDM for it to establish an encrypted connection
    org.unidata.mdm.search.keystore.path=/path/to/my-keystore.jks
    org.unidata.mdm.search.keystore.password=my-keystore-pass
    
  4. Последний шаг также можно выполнить через соответствующие переменные окружения:

    SEARCH_SECURITY_ENABLED=true
    
    SEARCH_ADMIN_LOGIN=admin
    SEARCH_ADMIN_PASSWORD=admin
    
    SEARCH_TRUSTSTORE_PATH=/path/to/my-truststore.jks
    SEARCH_TRUSTSTORE_PASSWORD=my-truststore-pass
    
    SEARCH_KEYSTORE_PATH=/path/to/my-keystore.jks
    SEARCH_KEYSTORE_PASSWORD=my-keystore-pass