ECOS Секреты
ECOS Секрет - объект, содержащий конфиденциальные данные, такие как пароль, токен или ключ.
Расположение артефактов с данным типом: model/secret
Модель конфигурации:
id: String # идентификатор секрета
type: Enum {BASIC|...} # тип секрета
data: ObjectData # данные секрета. Полностью зависят от типа
Типы секретов:
Тип |
Содержимое поля data |
---|---|
BASIC |
username: String
password: String
|
Пример конфигурации:
---
id: content-storage-s3-credentials
name:
ru: Ключи доступа к API S3 хранилища
en: S3 storage API Keys
type: BASIC
data:
username: sMJjtYPxFGjPEKeFp1lC
password: KenKpEhD6Lag3acImDAq2ZeLtlSij1vyaYZt8lyH
Информация о секретах по умолчанию хранится и загружается из БД микросервиса ecos-model, но так же есть возможнось указать настройки через переменные среды. Для этого следует взять идентификатор секрета и сконвертировать его по следующим правилам:
Разбиваем camelCase на части через символ „_“. Например: camelCase → camel_Case
Заменяем все символы ‘-“ и „.“ на „_’
Заменяем все символы, которые не входят в перечень
[a-zA-Z0-9_]
на_X{код_символа}_
Переводим получившуюся строку в верхний регистр и добавляем префикс “ECOS_SECRET_“
Таким образом для примера выше мы можем задать следующие переменные среды:
ECOS_SECRET_CONTENT_STORAGE_S3_CREDENTIALS_TYPE=BASIC
ECOS_SECRET_CONTENT_STORAGE_S3_CREDENTIALS_USERNAME=sMJjtYPxFGjPEKeFp1lC
ECOS_SECRET_CONTENT_STORAGE_S3_CREDENTIALS_PASSWORD=KenKpEhD6Lag3acImDAq2ZeLtlSij1vyaYZt8lyH
Переменные среды приоритетнее хранилища секретов в БД микросервиса ecos-model и они могут быть заданы как непосредственно в микросервисе который будет использовать эти секреты так и в ecos-model.
Использование секретов в коде
Получение:
BasicSecretData basicData = EcosSecrets.getBasicData("content-storage-s3-credentials");
String username = basicData.getUsername();
String password = basicData.getPassword();
Подписка на изменения:
EcosSecrets.listenChanges((secretId) -> {
// здесь можем пересоздать подключения, которые зависят от secretId
return Unit.INSTANCE;
});
В интерфейсе
Настройки доступны в разделе «Модель - Секреты».

Журнал доступен по адресу: v2/admin?journalId=ecos-secrets&type=JOURNAL
Форма создания:
Шифрование секретов
Секреты хранятся в базе данных в зашифрованном виде.
Ключ шифрования задается через переменные окружения (ENV) микросервиса ecos-model.
Предусмотрена возможность интеграции с внешним хранилищем секретов (vault) в будущем.
Настройки шифрования
Поддержка в Helm
Начиная с версии ecos-helm 1.3.57, добавлена поддержка настройки шифрования секретов в микросервисе ecos-model.
Переменные окружения
ECOS_SECRET_ENCRYPTION_CURRENT_KEY
Описание: текущий AES-ключ для шифрования данных.
Важно: ключ по умолчанию, заданный в микросервисе ecos-model, обязательно должен быть изменен на продакшн-серверах. Если ключ не изменен, система будет работать, но в логах появятся предупреждения.
Пример генерации ключа:
fun main() { val keyGen = KeyGenerator.getInstance("AES") keyGen.init(128) // AES key size 128 val secretKey = keyGen.generateKey() val base64Key = Base64.getEncoder().encodeToString(secretKey.encoded) println("Base64 Key: $base64Key") }
ECOS_SECRET_ENCRYPTION_CURRENT_ALGORITHM
Алгоритм шифрования.
Значение по умолчанию: AES/GCM/NoPadding.
ECOS_SECRET_ENCRYPTION_CURRENT_IV_SIZE
Размер вектора инициализации (IV).
Значение по умолчанию: 12.
ECOS_SECRET_ENCRYPTION_CURRENT_TAG_SIZE
Размер тега аутентификации (TAG).
Значение по умолчанию: 128.
ECOS_SECRET_ENCRYPTION_PREVIOUS_KEY
Предыдущий AES-ключ для расшифровки данных.
Используется в процессе ротации ключей, чтобы обеспечить доступ к ранее зашифрованным данным.
Ротация ключей шифрования
Для ротации ключа шифрования выполните следующие действия:
Сгенерируйте новый AES-ключ.
Установите новый ключ в переменную окружения ECOS_SECRET_ENCRYPTION_CURRENT_KEY.
Старый ключ укажите в переменной ECOS_SECRET_ENCRYPTION_PREVIOUS_KEY.
При запуске системы секреты будут расшифрованы с использованием предыдущего ключа и повторно зашифрованы новым ключом.
Инструкция для администраторов
При развертывании нового сервера необходимо каждый раз генерировать уникальный ключ шифрования.
Используйте приведенный выше код для генерации AES-ключа.
Убедитесь, что ключ по умолчанию заменен на новый. Если этого не сделать, система выдаст предупреждение в логах.