Шифрование паролей и параметров¶
Примечание
Функция актуальна только для версий 2.7.1 и более новых.
Эта статья описывает включение и настройку шифрования стартовых параметров системы, runtime-параметров и настроек подключений краулеров (LDAP).
Шифрование реализуется вспомогательной утилитой crypt-utils.jar
(входит в дистрибутив системы). Когда система установлена, утилита сразу готова к работе.
Данные, обрабатываемые утилитой, хранятся в системе в зашифрованном виде.
Настройка состоит из этапов:
Создание keystore.
Задание параметров backend.properties.
Указанные этапы позволяют шифровать конфигурационные параметры системы и параметры подключения краулеров. Для шифрования остальных данных требуется дополнительная настройка.
Создание keystore¶
Создайте keystore с секретным ключом, имеющим название application_secret:
Используйте команду утилиты шифрования для создания пароля keystore:
java -jar crypt-utils.jar kpwd 'ключ-строка'
'ключ-строка' - строка, на основе который вычисляется пароль для keystore
При помощи утилиты keytool создайте keystore c паролем, полученным из утилиты:
keytool -genseckey -alias application_secret -keyalg AES -keysize 256 -keystore /application_ks.p12 -storepass Yi4MTYMjYTjBwYBi_wiY -storetype PKCS12
Задание параметров backend.properties¶
Если система устанавливалась вручную из дистрибутива, то измените параметры в файле <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=
Если система устанавливалась через 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:
export POSTGRES_ADDRESS="localhost:5432"
export DATABASE_NAME="dg"
export POSTGRES_USERNAME="postgres"
export POSTGRES_PASSWORD="@ENC(qR14awFmuwgyTNvmG+km5w==)"
com.unidata.mdm.ee.guest.role=guest
com.unidata.mdm.ee.guest.username=guest
com.unidata.mdm.ee.guest.password=@ENC(qR14awFmuwgyTNvmG+km5w==)
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()