Закрытый контур на Astra Linux без SSL
Внимание
Дисклеймер.
Инструкция содержит примерный порядок действий по установке. Инструкция призвана описать логику действий по установке на простом, абстрактном примере. В зависимости от инфраструктуры сервера (кластера) и его конфигурации, вам могут понадобиться дополнительные или иные шаги.
Эта инструкция не должна восприниматься буквально, а использоваться в качестве основы действий.
Подготовка к установке
Важно
Архив с дистрибутивом продукта Юниверс предоставляется клиенту при приобретении продукта через менеджера компании "Юниверс Дата".
На процесс установки продукта может повлиять то, какие политики и настройки были указаны при установке ОС Astra Linux.
При использовании ОС Astra Linux существует сложность с цепочками зависимостей пакетов. ОС негативно реагирует на понижения версий отдельных пакетов, что может спровоцировать нестандартные ошибки непредсказуемого формата.
Ниже приведен пример установки системы в закрытом контуре (без интернета) на Astra Linux 1.8.X "Смоленск".
Предварительные действия:
Так как установка в закрытом контуре накладывает свою специфику, заранее убедитесь, что скачаны все необходимые пакеты дистрибутива для каждого компонента.
На момент начала установки сервер должен быть чистым, без стороннего ПО.
Распакуйте архив дистрибутива с продуктом Юниверс в любой каталог. Дистрибутив содержит необходимые файлы и скрипты для установки.
Каталог с содержимым дистрибутива далее будет именоваться как <OFFLINE_REP>.
Скопируйте содержимое <OFFLINE_REP> на целевой сервер.
Дистрибутив Юниверс DG также содержит файл конфигурации
backend.properties. Ограничьте права доступа на этот файл. Сервер приложений должен иметь права только на чтение файла. Администратор должен иметь права на чтение и редактирование. Также рекомендуется ограничить доступ ко всей директории с конфигурацией, оставив доступ на чтение и редактирование только серверу приложений и администратору.
Для запуска и работы Юниверс DG на сервере должно быть установлено:
ОС Astra Linux.
PostgreSQL 16.
TimescaleDB 2.20.
Java 11.
Opensearch 2.14.0.
Apache Tomcat 9.0.71.
Юниверс DG 2.13.
Оффлайн-репозиторий содержит следующие директории:
213: Содержит дистрибутив Юниверс DG и конфигурационные файлы.jre_11: Пакеты Java Runtime Environment (JRE) 11.opensearch: Пакет OpenSearch 2.14.0.opensearch_plugins: Плагины для OpenSearch (включая Hunspell).pgs16_tdb: Пакеты для Postgres 16 и TimescaleDB.apache-tomcat-9.x.xx.tar.gz: Архив с сервером приложений Tomcat 9.
Установка пакетов из дистрибутива
- Порядок установки. Рекомендуется соблюдать последовательность:
Java (
jre_11). Java требуется установить на всех серверах, где планируется запускать Opensearch и Tomcat.PostgreSQL + TimescaleDB (
pgs16_tdb)OpenSearch (
opensearch)Плагины OpenSearch (
opensearch_plugins)Apache Tomcat (
apache-tomcat-9.x.xx.tar.gz)Юниверс DG (
213)
Перейдите в целевую директорию репозитория:
cd /путь/к/репозиторию/<имя_директории>
Где <имя_директории> соответствует устанавливаемому компоненту (например: pgs16_tdb, jre_11, opensearch). Apache Tomcat и Юниверс DG устанавливаются иначе. См. инструкции ниже.
Установите все .deb пакеты в текущей директории:
sudo dpkg -i *.deb
Установите зависимости (если требуется):
sudo apt install -f
Примечания:
Права доступа: Для установки (dpkg -i) требуются права sudo.
Зависимости: Команда apt install -f (шаг 4) критична для разрешения возможных отсутствующих зависимостей после установки из .deb файлов.
Настройка PostgreSQL
Проверка версии
Переключитесь на пользователя Postgres и откройте psql:
sudo su postgres psql
Проверьте версию Postgres:
SELECT version();
Ожидаемый ответ: PostgreSQL 16.x on x86_64-pc-linux-gnu, compiled by gcc (AstraLinuxSE 8.3.0-6) 8.3.0, 64-bit
Основные конфигурационные файлы postgresql находятся по пути /var/lib/pgsql/data/postgresql.conf и /var/lib/pgsql/data/pg_hba.conf.
В файле /var/lib/pgsql/data/postgresql.conf Необходимо раскомментировать и изменить следующие параметры:
listen_addresses = 'localhost'
max_connections = 100
max_prepared_transactions = 0
port=5433
на:
listen_addresses = '*'
max_connections = 1000
max_prepared_transactions = 300
port=5432
Настройка TimescaleDB
Отредактируйте файл
/var/lib/pgsql/data/postgresql.conf, добавив:shared_preload_libraries = 'timescaledb' timescaledb.telemetry_level = off
Перезапустите сервис:
sudo systemctl restart postgresql
Создайте тестовую базу данных и активируйте расширение TimescaleDB:
sudo su postgres psql CREATE DATABASE tmp_example_tdb; \c tmp_example_tdb CREATE EXTENSION IF NOT EXISTS timescaledb;
Проверьте установку, выполнив тестовый запрос:
INSERT INTO org_unidata_dg_timelog_core.dg_quality_check( score, row_exception, check_etalon_id, execution_date, author, created_at, check_type_name, row_count, ts) VALUES (100, 100, 'test', NULL, 'test', NULL, 'test', 10, NOW());
Установка пароля для Postgres
Для повышения безопасности задайте пароль пользователю Postgres:
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'введите_ваш_пароль';"
Устранение неполадок
При проблемах с зависимостями выполните:
sudo apt-get install -f
Проверьте статус сервиса Postgres:
systemctl status postgresql
Настройка Opensearch
После установки Opensearch и связанные плагины требуется настроить.
Установка словарей
Скопируйте директорию ./<OFFLINE_REP>/Opensearch/hunspell в /etc/opensearch/:
sudo cp -rv ./<OFFLINE_REP>/Opensearch/hunspell /etc/opensearch
Выдайте права доступа для новой директории:
sudo chown -R root:opensearch /etc/opensearch/hunspell/
См. также инструкцию по настройке библиотеки Hunspell.
Установка плагина
Выполните команду с указанием полного пути до архива analysis-icu-2.14.0.zip:
sudo /usr/share/opensearch/bin/opensearch-plugin install /<OFFLINE_REP>/Opensearch/analysis-icu-2.14.0.zip # если вы в директории с файлом analysis-icu-*.zip # sudo /usr/share/opensearch/bin/opensearch-plugin install file://`pwd`/analysis-icu-2.14.0.zip
Результат выполнения команды будет иметь вид:
Installed analysis-icu with folder name analysis-icu
Конфигурация Opensearch
Очистите файл конфигурации и откройте следующий файл с помощью любого редактора:
sudo cp -i /etc/opensearch/opensearch.yml /etc/opensearch/opensearch.yml_before_ssl && > /etc/opensearch/opensearch.yml # Очистка файла sudo vi /etc/opensearch/opensearch.yml
Укажите параметр
cluster.name, например:cluster.name: dg-os-cluster
Имя кластера будет использоваться в настройках приложения для подключения. Каждый параметр в файле указываем с новой строки.
По умолчанию Opensearch прослушивает только localhost, если приложение Tomcat устанавливается на другой сервер, и/или Opensearch будет использоваться в кластере, то необходимо разрешить подключения с других интерфейсов, указав параметр:
network.host: 0.0.0.0
Также необходимо открыть порт 9200 для нод/приложений, которые будут подключаться к Opensearch.
Если планируется использование только одной ноды Opensearch - укажите параметр:
discovery.type: single-node
Укажите каталог для логов и данных:
path.data: /var/lib/opensearch path.logs: /var/log/opensearch
Если не требуется 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 на каждом сервере измените ряд настроек:
Задайте уникальный node.name для каждой ноды кластера Opensearch:
# для первого сервера: node.name: node01 # для N сервера # node.name: nodeN
Перечислите все 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"]
Закомментируйте или уберите следующий параметр, т.к. он противоречит кластерной настройке:
#discovery.type: single-node
Серверы кластера Opensearch взаимодействуют между собой, используя порт 9300, который должен быть открыт между ними.
Настройки потребления RAM Opensearch
Необходимо настроить объем выделяемого ОЗУ в файле /etc/opensearch/jvm.options. Действие выполняется на каждом узле кластера.
Значения выделяемой ОЗУ не должно быть более 50% от общего объема RAM (при условии, что на сервере не устанавливаются другие ресурсоемкие приложения) и не более 32 Гб. Xms должен быть равен Xmx. В примере, указанном ниже, значение равно 16 Гб:
-Xms16g
-Xmx16g
Запуск Opensearch
Обновите службы:
sudo systemctl daemon-reload
Добавьте Opensearch в автозагрузку:
sudo systemctl enable opensearch.service
Запустите Opensearch:
sudo systemctl start opensearch.service
Проверьте статус:
sudo systemctl status opensearch.service
Проверка запуска Opensearch
Проверьте ноды Opensearch:
curl 'https://localhost:9200' -k -u 'admin:admin'
Проверьте статус кластера:
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"
Чтобы получить хэш пароля, который необходимо использовать, нужно выполнить команду, ввести свой пароль, и получить хэш, который можно вставить в данный конфиг:
bash /usr/share/opensearch/plugins/opensearch-security/tools/hash.sh
Для применения настроек файла выполните скрипт:
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
Результат успешного выполнения команды:
Done with success
Скрипт записывает данные в индекс для всего кластера, чтобы избежать несогласованности и возможного применения команды с другого узла, следует перенести изменения данного файла на все ноды кластера.
В файле internal_users.yml также можно переименовать пользователя admin, всех остальных удалить и применить конфигурацию.
Установка Tomcat
Для запуска Tomcat требуется Java (описание установки см. выше).
Распакуйте архив с Apache Tomcat в требуемую директорию:
tar -xzf apache-tomcat-9.x.xx.tar.gz -C /путь/к/директории
Создайте пользователя для запуска tomcat:
sudo useradd -r tomcat -s /sbin/nologin
Распакуйте дистрибутив из каталога apache-tomcat-9.0.*.tar.gz в каталог /opt/.
Переименуйте каталог /opt/apache-tomcat-9.0.* в /opt/tomcat-9 (версия может отличаться).
Удалите стандартные файлы и каталоги Manager App, которые могут содержаться в дистрибутиве tomcat из каталога /opt/tomcat-9/webapps:
rm -rf /opt/tomcat-9/webapps/*
Выдайте права на директорию tomcat для пользователя tomcat:
chown -R tomcat:tomcat /opt/tomcat-9
Добавьте сервис, создав файл 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
Примените конфигурацию сервисов:
systemctl daemon-reload
Подготовка хранилища ключей сертификатов
Примечание
В настоящее время Tomcat работает только с хранилищами ключей формата JKS, PKCS11 или PKCS12. Каждая запись в хранилище ключей идентифицируется строкой псевдонима. Например, спецификация PKCS11 требует, чтобы псевдонимы были чувствительны к регистру. Чтобы избежать проблем, связанных с чувствительностью псевдонимов к регистру, не рекомендуется использовать псевдонимы, отличающиеся только регистром.
Совет
Чтобы импортировать существующий сертификат в хранилище ключей JKS, ознакомьтесь с официальной документацией (в пакете документации JDK) о keytool. Обратите внимание, что OpenSSL часто добавляет читаемые комментарии перед ключом, но keytool этого не поддерживает. Если в вашем сертификате есть комментарии перед ключевыми данными, удалите их перед импортом сертификата с помощью keytool.
Чтобы импортировать сертификат, подписанный вашим собственным CA, в хранилище ключей PKCS12 с помощью OpenSSL - выполните команду:
openssl pkcs12 -export -in mycert.crt -inkey mykey.key -out mycert.p12 -name tomcat -CAfile myCA.crt -caname root -chain
Для более сложных случаев см. официальную документацию OpenSSL.
Чтобы создать новое хранилище ключей JKS с нуля, содержащее один самоподписной сертификат, выполните следующие действия в командной строке терминала:
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
В качестве безопасного алгоритма следует предпочесть алгоритм RSA, который также обеспечивает общую совместимость с другими серверами и компонентами.
Используемая команда создаст новый файл с именем ".keystore" в домашнем каталоге пользователя, в котором она запущена. Чтобы указать другое местоположение или имя файла, добавьте к команде keytool, указанной выше, параметр
-keystore, за которым следует полное имя пути к вашему файлу keystore. Также необходимо отразить это новое местоположение в файле конфигурации server.xml, как описано далее. Например:$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore /path/to/my/keystore
После выполнения команды введите пароль хранилища ключей ("changeit" по умолчанию). При желании вы можете указать собственный пароль. Также необходимо указать пароль в конфигурационном файле server.xml, как описано далее.
При необходимости добавьте информацию (компания, имя контактного лица и т.д.) для отображения пользователям, которые попытаются получить доступ к защищенной странице в приложении.
Введите пароль ключа, который является паролем именно для этого сертификата (в отличие от любых других сертификатов, хранящихся в том же файле keystore). Подсказка keytool сообщит вам, что при нажатии клавиши ENTER автоматически используется тот же пароль для ключа, что и для хранилища ключей. Вы можете использовать тот же пароль или выбрать собственный. Если вы выберете пароль, отличный от пароля хранилища ключей, вам также нужно будет указать пользовательский пароль в файле конфигурации server.xml.
В результате действий будет сконфигурирован файл хранилища ключей с сертификатом, который может быть использован сервером.
Более подробно см. в официальной документации Tomcat.
Настройка файла конфигурации
Откройте файл server.xml в текстовом редакторе (файл находится в папке conf).
В файле найдите секцию:
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 This connector uses the NIO implementation with the JSSE engine. When using the JSSE engine, the JSSE configuration attributes must be used. -->
Ниже найденного блока пропишите конфигурацию коннектора: укажите порт 8443 (параметр
port), правильное название файла хранилища ключей (параметрkeystoreFile) и пароль (параметрkeystorePass).Пример конфигурации:
<Connector URIEncoding="UTF-8" port="8080" acceptCount="100" enableLookups="false" maxThreads="150" redirectPort="8443" /> <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="/usr/share/tomcat/key/server.keystore" keystorePass="uWePKrfemC"/>
Запретите CORS-запросы - в файле web.xml найдите секцию:
<filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <init-param> <param-name>cors.allowed.origins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> </init-param> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> <init-param> <param-name>cors.exposed.headers</param-name> <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> </init-param> <init-param> <param-name>cors.support.credentials</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>cors.preflight.maxage</param-name> <param-value>10</param-value> </init-param> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Проверьте, что в поле filter-mapping указан URL для backend:
<filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/universe-backend/*</url-pattern> </filter-mapping>
В поле init-param должны быть указаны разрешенные IP-адреса. Если строка пустая, то доступ будет запрещен всем:
<init-param> <param-name>cors.allowed.origins</param-name> <param-value>127.0.0.1</param-value> </init-param>
Сохраните изменения в файле и перезапустите Tomcat.
Установка приложения Юниверс DG
Для запуска приложения требуется Tomcat и Java (описание установки см. выше).
Начало установки
Установка .war файлов: в каталоге Application_Tomcat содержатся 2 архива: frontend или backend. В каждом архиве содержится .war файлы, которые необходимо скопировать в директорию
/opt/tomcat-9/webapps/.Установка дополнительных параметров и библиотек: в архиве 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/
Предоставьте права на файлы для сервиса:
chown -R tomcat:tomcat /opt/tomcat-9 chmod +x /opt/tomcat-9/bin/*.sh
Настройка приложения
Основные параметры задаются в переменных в файле setenv.sh. Отредактируйте файл:
vi /opt/tomcat-9/bin/setenv.sh
Установите/добавьте следующие переменные, установив значения соответствующие логическому имени переменной:
# имеющийся параметр 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
Создайте каталог для сертификатов:
sudo mkdir /opt/tomcat-9/ssl
Скопируйте созданные на предыдущих шагах .jks файлы в созданный каталог:
cp -v *\.jks /opt/tomcat-9/ssl chown -R tomcat:tomcat /opt/tomcat-9/ssl
Основные параметры задаются в переменных в файле setenv.sh. Отредактируйте файл:
vi /opt/tomcat-9/bin/setenv.sh
Установите/добавьте следующие переменные, введя значения, соответствующие логическому имени переменной:
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
Кластерная настройка приложения
Если планируется использование нескольких серверов Tomcat, то для настройки кластерной конфигурации приложения в файле /opt/tomcat-9/conf/universe/backend.properties на каждом сервере требуется изменить ряд настроек:
vi /opt/tomcat-9/conf/universe/backend.properties
Следующие параметры одинаковые для каждого узла приложения:
# включите распределенный кэш org.unidata.dg.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
Параметр ниже должен быть уникальный для каждого узла в кластере приложения, пример значения параметра:
org.unidata.dg.system.node.id=node1 #org.unidata.dg.system.node.id=nodeN # для остальных N серверов
Пример сообщения в логе (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/.
После окончания установки выполните вход в систему Юниверс.