Управление секретами
Безопасное хранение и управление учётными данными, API ключами и конфиденциальными параметрами конфигурации в соответствии с требованиями ЦБ РФ и 152-ФЗ.
Шифрование
AES-256-GCM
RBAC
Гранулярный доступ
HSM
Аппаратная защита
Ротация
Автоматическая
Архитектура
Сервис секретов использует многоуровневую защиту для обеспечения безопасности конфиденциальных данных в on-premise окружении банка.
┌─────────────────────────────────────────────────┐
│ Applications │
│ (Сервисы банка, ML модели, Агенты) │
└─────────────────────┬───────────────────────────┘
│ REST API / gRPC
┌─────────────────────▼───────────────────────────┐
│ Secrets Service │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────┐ │
│ │ Auth & RBAC │ │ Encryption │ │ Audit │ │
│ │ Layer │ │ Layer │ │ Logger │ │
│ └─────────────┘ └─────────────┘ └──────────┘ │
└─────────────────────┬───────────────────────────┘
│
┌─────────────────────▼───────────────────────────┐
│ Encrypted Storage Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────┐ │
│ │ PostgreSQL │ │ HSM │ │ Redis │ │
│ │ (metadata) │ │ (master key)│ │ (cache) │ │
│ └─────────────┘ └─────────────┘ └──────────┘ │
└─────────────────────────────────────────────────┘Создание секретов
Храните конфиденциальные данные: API ключи провайдеров моделей, учётные данные баз данных, сертификаты и ключи шифрования.
REST API
curl -X POST https://api.internal:8080/v1/secrets \-H "Authorization: Bearer $API_KEY" \-H "Content-Type: application/json" \-d '{"name": "model-provider-key","value": "sk-...","description": "API ключ для inference провайдера","type": "api_key","tags": ["llm", "production", "critical"],"metadata": {"provider": "vllm","environment": "production","owner": "ml-team"},"rotation": {"enabled": true,"interval_days": 90}}'
Python SDK
from coren import CorenClientclient = CorenClient(base_url="https://api.internal:8080")# Создание секрета для подключения к БДsecret = client.secrets.create(name="postgres-analytics-password",value="super-secret-password-here",description="Пароль PostgreSQL для аналитической БД",type="database_credential",tags=["database", "production", "analytics"],metadata={"database": "analytics_db","host": "postgres-analytics.internal","port": 5432,"username": "ml_service"},rotation={"enabled": True,"interval_days": 30,"notify_before_days": 7})print(f"Секрет создан: {secret.id}")print(f"Версия: {secret.version}")
Типы секретов
| Тип | Описание | Пример |
|---|---|---|
| api_key | API ключи сервисов | Ключи провайдеров моделей |
| database_credential | Учётные данные БД | PostgreSQL, Redis пароли |
| certificate | TLS сертификаты | mTLS, клиентские сертификаты |
| encryption_key | Ключи шифрования | AES ключи для данных |
| ssh_key | SSH ключи | Ключи для Git, серверов |
| generic | Произвольный секрет | Любые конфиденциальные данные |
Получение секретов
Безопасный доступ к секретам в приложениях. Значения никогда не логируются и не передаются в открытом виде.
# Получение секрета по имениsecret = client.secrets.get("model-provider-key")api_key = secret.value# Использование в приложенииllm_client = VLLMClient(api_key=api_key)# Получение конкретной версии секретаsecret_v2 = client.secrets.get("model-provider-key", version=2)# Получение метаданных без значения (быстрый запрос)metadata = client.secrets.get_metadata("model-provider-key")print(f"Последняя ротация: {metadata.last_rotated_at}")print(f"Следующая ротация: {metadata.next_rotation_at}")
Важно для безопасности
Значения секретов возвращаются только при явном запросе и не включаются в операции списка. Все обращения к секретам логируются в audit trail.
Ротация секретов
Автоматическая ротация секретов в соответствии с политиками безопасности банка и требованиями регуляторов.
# Настройка автоматической ротацииclient.secrets.update(name="postgres-analytics-password",rotation={"enabled": True,"interval_days": 30,"notify_before_days": 7,"notification_channels": ["email", "slack"],"notification_recipients": ["dba-team@bank.internal"]})# Принудительная ротацияnew_version = client.secrets.rotate(name="postgres-analytics-password",reason="Плановая ротация по требованию ИБ")print(f"Новая версия: {new_version.version}")# Получение истории ротацийhistory = client.secrets.get_rotation_history(name="postgres-analytics-password",limit=10)for entry in history:print(f"{entry.rotated_at}: v{entry.from_version} -> v{entry.to_version}")
Рекомендуемые интервалы ротации
| Тип секрета | Интервал | Требование |
|---|---|---|
| API ключи | 90 дней | Политика ИБ |
| Пароли БД | 30 дней | PCI DSS 8.2.4 |
| Ключи шифрования | 365 дней | ГОСТ Р 34.10 |
| TLS сертификаты | 365 дней | ЦБ РФ |
Интеграция с Kubernetes
Автоматическая синхронизация секретов с Kubernetes для использования в подах.
# ExternalSecret для синхронизации с Coren SecretsapiVersion: external-secrets.io/v1beta1kind: ExternalSecretmetadata:name: ml-service-secretsnamespace: ml-platformspec:refreshInterval: 1hsecretStoreRef:name: coren-secrets-storekind: ClusterSecretStoretarget:name: ml-service-secretscreationPolicy: Ownerdata:- secretKey: MODEL_API_KEYremoteRef:key: model-provider-key- secretKey: DATABASE_PASSWORDremoteRef:key: postgres-analytics-password---# Deployment с использованием секретовapiVersion: apps/v1kind: Deploymentmetadata:name: ml-inference-servicespec:template:spec:containers:- name: inferenceimage: ml-inference:latestenv:- name: MODEL_API_KEYvalueFrom:secretKeyRef:name: ml-service-secretskey: MODEL_API_KEY- name: DATABASE_PASSWORDvalueFrom:secretKeyRef:name: ml-service-secretskey: DATABASE_PASSWORD
Контроль доступа
Гранулярный контроль доступа к секретам на основе ролей и политик.
# Создание политики доступа к секретамclient.secrets.policies.create(name="ml-team-secrets-policy",description="Доступ команды ML к секретам моделей",rules=[{"effect": "allow","actions": ["secrets:read", "secrets:list"],"resources": ["secrets/model-*", "secrets/llm-*"],"conditions": {"ip_range": ["10.0.0.0/8"],"time_of_day": {"start": "08:00", "end": "20:00"}}},{"effect": "deny","actions": ["secrets:delete", "secrets:update"],"resources": ["secrets/*"],"conditions": {"environment": ["production"]}}],principals=["group:ml-team", "role:ml-engineer"])# Проверка доступаaccess = client.secrets.check_access(principal="user:ivan.petrov",action="secrets:read",resource="secrets/model-provider-key")print(f"Доступ разрешён: {access.allowed}")
API эндпоинты
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /v1/secrets | Список секретов (только метаданные) |
| POST | /v1/secrets | Создание секрета |
| GET | /v1/secrets/:name | Получение значения секрета |
| PUT | /v1/secrets/:name | Обновление секрета |
| DELETE | /v1/secrets/:name | Удаление секрета |
| POST | /v1/secrets/:name/rotate | Ротация секрета |
| GET | /v1/secrets/:name/versions | История версий секрета |