Закрытый контур на 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/.
После окончания установки выполните вход в систему Юниверс.