Шифрование паролей и параметров

Примечание

Функция актуальна только для версий 2.7.1 и более новых.

Эта статья описывает включение и настройку шифрования стартовых параметров системы, runtime-параметров и настроек подключений краулеров (LDAP).

Шифрование реализуется вспомогательной утилитой crypt-utils.jar (входит в дистрибутив системы). Когда система установлена, утилита сразу готова к работе.

Данные, обрабатываемые утилитой, хранятся в системе в зашифрованном виде.

Настройка состоит из этапов:

  • Создание keystore.

  • Задание параметров backend.properties.

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

Создание keystore

Создайте keystore с секретным ключом, имеющим название application_secret:

  1. Используйте команду утилиты шифрования для создания пароля keystore:

java -jar crypt-utils.jar kpwd 'ключ-строка'
'ключ-строка' - строка, на основе который вычисляется пароль для keystore
  1. При помощи утилиты keytool создайте keystore c паролем, полученным из утилиты:

Пример
keytool -genseckey -alias application_secret -keyalg AES -keysize 256 -keystore /application_ks.p12 -storepass Yi4MTYMjYTjBwYBi_wiY -storetype PKCS12

Задание параметров backend.properties

  1. Если система устанавливалась вручную из дистрибутива, то измените параметры в файле <UNIVERSE_CONF_DIR>/backend.properties.

Пример
# Шифрование включено/выключено (true/false)
org.unidata.mdm.system.encryption.enabled=true

# Ключ инсталяции. Любая строка, на основе которой вычисляется пароль для keystore
org.unidata.mdm.system.installation.id=70ac88aa-b90e-11ee-96b7-55a02820ba60

# Путь до keystore
org.unidata.mdm.system.encryption.keystore.path=/application_ks.p12

# Название алгоритма шифрования. Если не задано, то значение AES. Поддерживаются все алгоритмы Java, алгоритм должен совпадать с алгоритмом, указанным при создании keystore
org.unidata.mdm.system.encryption.algorithm=
  1. Если система устанавливалась через Docker, то оптимальный способ конфигурирования: через файл .env.

Пример
dg:
  environment:
    # Включение в системе механизма шифрования
    ENCRYPTION_ENABLED: true

    # Ключ-строка для вычисления пароля к keystore
    INSTALLATION_ID: 70ac88aa-b90e-11ee-96b7-55a02820ba60

    # Название алгоритма шифрования. Стандартное значение, если переменная не указана, AES
    ENCRYPTION_ALGORITHM: AES

    # Путь до файла keystore в контейнере
    ENCRYPTION_KEYSTORE_PATH: /opt/ks/application_ks.p12

Шифрование стартовых параметров

Если система только установлена, и PostgreSQL, Opensearch, Orientdb еще не запускались, то зашифровать данные подключения этих сервисов стандартными способами невозможно. для этого необходимо использовать утилиту шифрования.

java -jar crypt-utils.jar enc 'путь к keystore' 'ключ-строка' 'пароль' '[алгоритм]'
'[алгоритм]' - опциональный параметр с названием алгоритма шифрования. Стандартное значение AES
'ключ-строка' - строка, которая использовалась для генерации пароля к keystore
Пример
java -jar crypt-utils.jar enc /application_ks.p12 70ac88aa-b90e-11ee-96b7-55a02820ba60 postgres
Результат: @ENC(qR14awFmuwgyTNvmG+km5w==)

Зашифрованные значения необходимо указать в файле backend.properties, setenv.sh или .env:

setenv.sh
export POSTGRES_ADDRESS="localhost:5432"
export DATABASE_NAME="dg"
export POSTGRES_USERNAME="postgres"
export POSTGRES_PASSWORD="@ENC(qR14awFmuwgyTNvmG+km5w==)"
backend.properties
com.unidata.mdm.ee.guest.role=guest
com.unidata.mdm.ee.guest.username=guest
com.unidata.mdm.ee.guest.password=@ENC(qR14awFmuwgyTNvmG+km5w==)
.env
DG_POSTGRES_USER=postgres
DG_POSTGRES_PASSWORD=@ENC(qR14awFmuwgyTNvmG+km5w==)
DG_POSTGRES_DB_NAME=postgres
POSTGRES_OUTER_PORT=15432

Шифрование runtime-параметров

Дополнительная настройка позволит шифровать строковые параметры, которые помечены как secret.

Пример регистрации шифруемого параметра:

ConfigurationProperty<String> EMAIL_PASSWORD = ConfigurationProperty.string()
            .key(CoreConfigurationConstants.PROPERTY_EMAIL_PASSWORD)
            .groupKey(CoreConfigurationConstants.PROPERTY_EMAIL_GROUP)
            .groupId(PROPERTY_EMAIL_GROUP_ID)
            .moduleId(CoreModule.MODULE_ID)
            .required(false)
            .readOnly(true)
            .secret(true)
            .build();

Шифрование параметров краулеров

Для шифрования параметра краулера необходимо объявить его тип как SECRET.

CrawlerParameterDescriptor.string()
            .name(PROPERTY_PASSWORD)
            .required(true)
            .type(CrawlerParameterType.SECRET)
            .displayName(() -> TextUtils.getText(CoreModule.MODULE_ID + ".crawler.base.jdbc.param.password"))
            .build()