Руководство по настройке хранения секретов служб в отдельной БД
Документ описывает настройку хранения конфиденциальных данных (логинов, паролей, ключей доступа) служб Оркестратора в выделенной базе данных ltoolssecrets вместо открытого хранения в конфигурационных файлах.
Поддерживаемые службы
| Служба | Назначение |
|---|---|
| Analytic | Аналитическая подсистема |
| Licenses | Управление лицензиями |
| LogEventsWebhook | Отправка событий журнала во внешние системы |
| Notifications | Система уведомлений |
| Queues | Управление очередями |
| RobotLogs | Журналирование работы роботов |
| States | Управление состояниями |
| WebApi | Основной API Оркестратора |
Принцип работы
При включении режима External службы Оркестратора считывают секреты из защищённой БД ltoolssecrets вместо значений, указанных в конфигурационных файлах appsettings.ProdWin.json или appsettings.ProdLinux.json. Это позволяет:
- исключить хранение открытых паролей в файловой системе;
- централизованно управлять доступами;
- применять дополнительное шифрование чувствительных данных.
Требования
Для работы по такой схеме требуется::
1. Добавить секции в конфигурационный файл
В конфигурационный файл служб (appsettings.ProdWin.json или appsettings.ProdLinux.json) добавить (если отсутствует) секции DBVendor, PostgresWithSslOptions (если в качестве БД используется PostgreSQL и применяется шифрованное соединение с использованием SSL/TLS сертификата), Secrets:
{
"DBVendor": "Postgres" /* Возможные значения: Postgres, MSSQL */,
"PostgresWithSslOptions": {
"UseSsl": false /* true — добавить SSLMode=Require;TrustServerCertificate=true; в строку подключения */,
"ClientCertPath": "C:\\Primo\\postgresql\\client_postgres.crt",
"ClientCertKeyPath": "C:\\Primo\\postgresql\\client_postgres.key"
},
"Secrets": {
"External": true /* Хранение секретов в БД */,
"PasswordEncrypted": true /* Пароли в БД секретов зашифрованы */,
"ConnectionPasswordEncrypted": true /* Пароль в строке подключения к БД секретов зашифрован */
}
}2. Добавить строку подключения к БД секретов (если не используется переменная окружения)
Если для хранения строки подключения к БД с секретами не используется переменная окружения, то требуется добавить в секцию конфигов Secrets строку подключения к БД с секретами:
Пример для PostgreSQL:
"ConnectionString": "PORT=5432;TIMEOUT=15;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=20;COMMANDTIMEOUT=20;DATABASE=ltoolssecrets;HOST=192.168.0.136;USER ID=postgres;SearchPath=public;PASSWORD=49EqQ30zfcQTWxEGYE/mSw=="Пример для MS SQL Server:
"ConnectionString": "Server=192.168.0.136;Connection Timeout=30;DATABASE=ltoolssecrets;Encrypt=Optional;USER ID=sa;PASSWORD=49EqQ30zfcQTWxEGYE/mSw=="3. Использование переменной окружения
Если используется вариант с работой через переменную окружения, то необходимо создать переменную окружения SecretsConnection со строкой подключения к БД с секретами (по умолчанию наименование БД: ltoolssecrets). При этом учитываем, что пароль в строке подключения должен быть зашифрован, если в секции Secrets конфигов выставлен параметр "ConnectionPasswordEncripted": true. При этом необходимо удалить из конфигов строку подключения к БД с секретами.
Пример для переменной окружения при использовании PostgreSQL:
PORT=5432;TIMEOUT=15;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=20;COMMANDTIMEOUT=20;DATABASE=ltoolssecrets;HOST=192.168.0.136;USER ID=postgres;SearchPath=public;PASSWORD=49EqQ30zfcQTWxEGYE/mSw==Пример для переменной окружения при использовании MS SQL Server:
Server=192.168.0.136;Connection Timeout=30;DATABASE=ltoolssecrets;Encrypt=Optional;USER ID=sa;PASSWORD=49EqQ30zfcQTWxEGYE/mSw==4. Автоматическое создание БД секретов
Если БД с секретами ещё не существует, то она создастся автоматически при первом запуске службы WebApi оркестратора с выставленным в секции Secrets параметром "External": true. Все логины/пароли в этой БД при этом будут иметь дефолтные значения в незашифрованном виде. Логины/пароли нужно будет заменить своими, и если в секции Secrets выставлен параметр "PasswordEncripted": true, то пароли требуется зашифровать в соответствии с приведённой в п.5 таблицей хранения секретов.
5. Таблицы хранения секретов
Секреты (логины/пароли) хранятся в таких таблицах БД с секретами:
| № п/п | Служба | Таблица | Примечание |
|---|---|---|---|
| 1 | Analytic | Analytic | В виде пар ключ-значение. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для ключей: "ConnectionStrings:AnalyticConnection:Password", "RabbitMQ:Password", "RabbitMQ:SslCertPassphrase" |
| 2 | Licenses | Licenses | В виде пар ключ-значение. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для ключей: "ConnectionStrings:LicensesConnection:Password", "RabbitMQ:Password", "RabbitMQ:SslCertPassphrase" |
| 3 | LogEventsWebhook | LogEventsWebhook | В виде пар ключ-значение. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для ключей: "HttpEndPoint:Password", "RabbitMQ:Password", "RabbitMQ:SslCertPassphrase" |
| 4 | Notifications | Notifications | В виде пар ключ-значение. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для ключей: "Email:FromPassword", "RabbitMQ:Password", "RabbitMQ:SslCertPassphrase" |
| 5 | Queues | Queues | В виде пар ключ-значение. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для ключей: "RabbitMQ:Password", "RabbitMQ:SslCertPassphrase" |
| 6 | RobotLogs | RobotLogs | В виде пар ключ-значение. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для ключей: "ScreenFileUpload:Minio:SecretKey", "ConnectionStrings:LogsConnection:Password", "RabbitMQ:Password", "RabbitMQ:SslCertPassphrase" |
| 7 | States | States | В виде пар ключ-значение. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для ключей: "RabbitMQ:Password", "RabbitMQ:SslCertPassphrase" |
| 8 | WebApi | WebApi | В виде пар ключ-значение. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для ключей: "ConnectionStrings:DefaultConnection:Password", "ConnectionStrings:IdentityConnection:Password", "ConnectionStrings:LicenseConnection:Password", "ConnectionStrings:ProcessRepositoryConnection:Password", "RobotDeployment:SslCertPassword", "RobotDeployment:OrchPassword", "RabbitMQ:Password", "RabbitMQ:SslCertPassphrase", "Tenants:IncomingEmail:Password", "NuGet:ApiKey", "CyberArk:Password", "FileStore:Minio:SecretKey", "OpenId:KeyCloak:orch:ClientSecret" |
| 9 | WebApi | WebApiAD | Секреты из секции ActiveDirectory:MultyForest для каждого леса AD. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для данных в столбце "AdminPassword" |
| 10 | WebApi | WebApiTenantIncomingEmail | Секреты из секции Tenants:Items для IncomingEmail каждого недефолтного тенанта. При выставленном параметре конфига "PasswordEncripted": true необходимо зашифровать значения для данных в столбце "Password" |
6. Замена конфиденциальных данных в конфигурационных файлах
После настройки работы через БД секретов замените в конфигурационных файлах служб реальные пароли на заглушки.
