Хранилище секретов
Хранилище секретов с шифрованием AES-256-GCM
Обзор
Secrets stores sensitive data (API keys, passwords, tokens) encrypted at rest. Uses AES-256-GCM encryption with rotation support. Requires FLOWLINK_SECRETS_KEY environment variable.
Детали шифрования
- •Algorithm: AES-256-GCM (Galois/Counter Mode)
- •Key derivation: PBKDF2 with 100k iterations
- •Key rotation: Каждые 30 дней (настраивается)
- •Tags: Организуйте секреты по сервисам/командам
Переменная окружения
1# Required for Secrets API2export FLOWLINK_SECRETS_KEY="your-32-byte-base64-key-here"34# Generate a strong key5openssl rand -base64 32
API эндпоинты
1# Create secret2POST /api/v1/secrets3Body: {4 "name": "stripe-api-key",5 "value": "sk_live_...",6 "tags": ["payment", "stripe"]7}89# List secrets (with partial values)10GET /api/v1/secrets1112# Get secret (requires authentication)13GET /api/v1/secrets/{'id'}1415# Update secret16PATCH /api/v1/secrets/{'id'}1718# Rotate secret (generates new encrypted value)19POST /api/v1/secrets/{'id'}/rotate2021# Delete secret22DELETE /api/v1/secrets/{'id'}
Модель секрета
1{2 "id": "sec_abc123",3 "name": "stripe-api-key",4 "value_encrypted": "AEsDBBQABgAIAAAAI...",5 "tags": ["payment", "stripe"],6 "created_at": "2026-04-21T20:00:00Z",7 "last_rotated_at": "2026-04-21T20:00:00Z",8 "rotation_days_remaining": 25,9 "version": 110}
Примеры запросов
1# Create secret2curl -X POST https://flowlink.flow-masters.ru/api/v1/secrets \3 -H "Authorization: Bearer flk_live_..." \4 -H "Content-Type: application/json" \5 -d '{6 "name": "telegram-bot-token",7 "value": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",8 "tags": ["bot", "telegram"]9 }'1011# List secrets (partial values)12curl https://flowlink.flow-masters.ru/api/v1/secrets1314# Get specific secret15curl https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc1231617# Rotate secret (creates new version)18curl -X POST https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc123/rotate1920# Delete secret21curl -X DELETE https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc123
Tags
Используйте теги для организации секретов:
Инъекция секретов (Secret Injection)
Secret Injection автоматически подставляет секреты из хранилища в команды AI-агентов в виде переменных окружения — без раскрытия plaintext-значений LLM. Агент знает только имена переменных, но никогда не видит их содержимое.
Как это работает
1. Вы создаёте Secret Mapping: связываете секрет из хранилища с именем env-переменной и (опционально) метками агента.
2. AI-агент вызывает команду через MCP.
3. Relay перехватывает вызов и запускает inject_for_exec().
4. Relay определяет подходящие маппинги по меткам агента и команды.
5. Совпадающие секреты расшифровываются и внедряются как env-переменные в payload команды.
6. LLM никогда не получает plaintext — только имена env-переменных.
Тарифные ограничения
| Функция | Starter | Team | Business |
|---|---|---|---|
| Env-переменные | ✅ | ✅ | ✅ |
| Монтирование файлов | — | ✅ | ✅ |
| HashiCorp Vault | — | — | ✅ |
API маппингов
1# Create mapping2POST /api/secrets/mappings3Body: {4 "secret_id": "sec_abc123",5 "env_var_name": "STRIPE_API_KEY",6 "agent_labels": ["billing"],7 "mount_path": null,8 "enabled": true9}1011# List mappings12GET /api/secrets/mappings1314# Update mapping15PATCH /api/secrets/mappings/{'id'}1617# Delete mapping18DELETE /api/secrets/mappings/{'id'}
Примеры запросов
1# Create mapping2TOKEN="flk_live_..."34# Link a vault secret to an env var for the "billing" agent5curl -X POST https://flowlink.flow-masters.ru/api/secrets/mappings \6 -H "Authorization: Bearer $TOKEN" \7 -H "Content-Type: application/json" \8 -d '{9 "secret_id": "sec_abc123",10 "env_var_name": "STRIPE_API_KEY",11 "agent_labels": ["billing"],12 "enabled": true13 }'1415# List all mappings16curl https://flowlink.flow-masters.ru/api/secrets/mappings \17 -H "Authorization: Bearer $TOKEN"1819# Update a mapping (e.g. disable it)20curl -X PATCH https://flowlink.flow-masters.ru/api/secrets/mappings/mp_xyz \21 -H "Authorization: Bearer $TOKEN" \22 -H "Content-Type: application/json" \23 -d '{ "enabled": false }'2425# Delete a mapping26curl -X DELETE https://flowlink.flow-masters.ru/api/secrets/mappings/mp_xyz \27 -H "Authorization: Bearer $TOKEN"
Безопасность
- •Аудит без значений: логи содержат имя маппинга и env-переменной, но не plaintext-значение секрета.
- •Изоляция агентов: маппинги фильтруются по меткам — агент получает только свои секреты.
- •Ограничение по организации: маппинги доступны только в рамках организации (org-scoped).
- •LLM никогда не видит plaintext — инъекция происходит на уровне relay, после формирования ответа LLM.
Управлять маппингами можно через Dashboard → Secrets → вкладка «Mappings».
Политика ротации
Автоматическая ротация каждые 30 дней:
- •Ротация обновляет зашифрованное значение, но сохраняет то же имя
- •Новая версия имеет инкрементированный номер версии
- •Старые версии сохраняются для аудита (могут быть удалены)
Zero-Trust Architecture
Секреты защищены даже при полной компрометации relay-сервера. Relay не имеет ключей расшифровки и не может прочитать секреты ни при каких обстоятельствах.
| Угроза | Защита |
|---|---|
| Root на relay-сервере | Нет ключей расшифровки — relay видит только ciphertext |
| Доступ к Vault | Response wrapping + limited AppRole с минимальным TTL |
| Перехват agent ↔ relay | E2EE: per-org X25519 ключи, relay не знает private key |
| Перехват relay ↔ Vault | mTLS + response wrapping (одноразовый token) |
| Скомпрометирован агент | Agent-scoped keys + audit trail + approval workflow |
| Insider (relay admin) | Zero knowledge — relay никогда не видит plaintext |
Per-org ключи шифрования
1. Каждая организация генерирует свой X25519 keypair.
2. Публичный ключ загружается в relay (OrgSecretConfig).
3. Приватный ключ НИКОГДА не покидает машину админа/агента.
4. Все секреты шифруются публичным ключом org.
5. Расшифровка возможна только с приватным ключом (у агента).
Подключение внешнего Vault организации
Организация может подключить свой собственный HashiCorp Vault. FlowLink не хранит и не видит секреты — только перенаправляет зашифрованные запросы.
✅ Поддерживаемые методы аутентификации
- • AppRole — рекомендуется для M2M
- • JWT/OIDC — агент аутентифицируется через IdP
- • Kubernetes — для агентов в K8s (service account)
- • TLS Certificates — взаимная аутентификация
🛡️ Дополнительная защита
- • mTLS — клиентский сертификат зашифрован org key
- • Response Wrapping — одноразовый token, TTL 5 мин
- • Scoped AppRole — минимальные права, auto-rotate TTL
- • CA Pinning — верификация сертификата Vault
Flow подключения внешнего Vault
1. Админ генерирует org keypair: flowlink-relay keygen --org
→ org_public_key (загружается в relay)
→ org_private_key (остаётся у админа, НИКОГДА не на relay)
2. Админ настраивает Vault с auth, mTLS, response wrapping
3. Agent получает org_private_key через:
• Secure channel (админ вручную)
• KMS (AWS KMS, GCP KMS)
• Sealed Secrets (Kubernetes)
4. Готово — relay видит только ciphertext
🔒 Гарантия Zero-Trust
Даже если злоумышленник получит root-доступ к relay-серверу и доступ к базе данных — он не сможет расшифровать секреты организаций. Приватные ключи находятся только у агентов/админов, а AppRole токены зашифрованы org-ключом.
API: настройка
1# Generate org keypair (on admin machine)2flowlink-relay keygen --org3# → org_public_key (base64, upload to relay)4# → org_private_key (KEEP LOCALLY, NEVER upload)56# Upload public key to relay7curl -X POST https://flowlink.flow-masters.ru/api/orgs/$ORG_ID/secrets/config/key-setup \8 -H "Authorization: Bearer $TOKEN" \9 -H "Content-Type: application/json" \10 -d '{"org_public_key": "BASE64_PUB_KEY"}'1112# Configure external Vault13curl -X POST https://flowlink.flow-masters.ru/api/orgs/$ORG_ID/secrets/config/vault-setup \14 -H "Authorization: Bearer $TOKEN" \15 -d '{16 "address": "https://vault.company.com:8200",17 "auth": {"method": "approle", "role_id": "xxx", "encrypted_secret_id": {...}, "secret_id_ttl": "24h"},18 "mount_path": "flowlink",19 "ca_cert_pem": "-----BEGIN CERTIFICATE-----...",20 "mtls": {"encrypted_client_cert": {...}, "encrypted_client_key": {...}, "server_name": "vault.company.com"},21 "response_wrapping": true22 }'2324# Check zero-trust configuration25curl https://flowlink.flow-masters.ru/api/orgs/$ORG_ID/secrets/config \26 -H "Authorization: Bearer $TOKEN"27# → {"zero_trust_verification": {"relay_can_decrypt": false, ...}}
Secret Discovery (Auto)
NEWАвтоматическое обнаружение секретов на серверах — БД, мониторинг, Docker, Kubernetes. Агент сканирует конфиги и env-переменные, шифрует результаты (E2EE) и отправляет на relay. Администратор проверяет и одобряет — секреты автоматически попадают в Vault.
Pipeline
🔍
Scan
Сервисы, конфиги, .env
🔐
Encrypt
E2EE X25519+AES256
👁️
Review
Dashboard без значений
🏦
Store
Vault / encrypted DB
Что обнаруживается
🐘 PostgreSQL
pg_hba.conf, .pgpass, DATABASE_URL
🐬 MySQL/MariaDB
my.cnf, ~/.mylogin.cnf
🔴 Redis
redis.conf, requirepass
🍃 MongoDB
mongod.conf, MONGO_URI
🌴 Cassandra
cassandra.yaml
🪳 CockroachDB
cockroach.conf
⏱️ InfluxDB
influxdb.conf
🔶 ClickHouse
config.xml
🔮 Neo4j
neo4j.conf
🛋️ CouchDB
local.ini
⏰ TimescaleDB
postgresql.conf
🏗️ MSSQL
mssql.conf
🔮 Oracle
tnsnames.ora
🐦 Firebird
firebird.conf
🔍 QuestDB
conf/server.conf
🐰 RabbitMQ
rabbitmq.conf
📊 Kafka
server.properties
🦅 NATS
nats-server.conf
🐝 ActiveMQ
activemq.xml
💫 Pulsar
broker.conf
📡 EMQX
emqx.conf
🦟 Mosquitto
mosquitto.conf
📈 Prometheus
prometheus.yml
📉 Grafana
grafana.ini
🔔 Zabbix
zabbix.conf
👁️ Nagios
nagios.cfg
🐕 Datadog
datadog.yaml
🪵 Loki
loki.yml
⏲️ Tempo
tempo.yml
🔫 Jaeger
jaeger.yml
🦅 Sentry
sentry.conf.py
⚡ Telegraf
telegraf.conf
🚨 Alertmanager
alertmanager.yml
🏆 VictoriaMetrics
vmagent.yml
🔎 Elasticsearch
elasticsearch.yml
📊 Kibana
kibana.yml
🪵 Logstash
logstash.yml
💧 Fluentd
fluent.conf
📄 Filebeat
filebeat.yml
🟢 Nginx
nginx.conf
🔺 Apache
httpd.conf
🟢 Caddy
Caddyfile
🔄 Traefik
traefik.yml
⚡ HAProxy
haproxy.cfg
🛡️ Envoy
envoy.yaml
🐳 Docker
config.json, .env, compose
☸️ Kubernetes
kubeconfig, secrets
📦 Portainer
portainer.json
🏗️ Nomad
nomad.hcl
🌐 Consul
consul.json
🔑 etcd
etcd.conf.yml
🏦 HashiCorp Vault
vault.hcl
🔧 Jenkins
credentials.xml
🦊 GitLab
gitlab.rb, .gitlab-ci.yml
🍵 Gitea
app.ini
💾 MinIO
config.json
🐙 Ceph
ceph.conf
🔍 Solr
solrconfig.xml
⚡ Meilisearch
config.toml
🎯 Typesense
typesense.ini
🔑 Keycloak
keycloak.json
🛡️ Authelia
config.yml
🔐 LDAP
slapd.conf
💾 Memcached
memcached.conf
📊 Metabase
metabase.db
📈 Superset
superset_config.py
✉️ Postal
postal.yml
📮 Postfix
main.cf
🔒 WireGuard
wg0.conf
🌐 Tailscale
tailscaled
🔗 ZeroTier
local.conf
☁️ AWS
credentials, config
☁️ GCP
application_default_credentials.json
☁️ Azure
azureProfile.json
🌐 CoreDNS
Corefile
🌐 Pi-hole
setupVars.conf
🐘 pgAdmin
config.py
🗃️ Adminer
adminer.php
🦍 Kong
kong.yml
⚡ KrakenD
krakend.json
API
1# Start discovery scan on an agent (org owner/admin only)2curl -X POST https://flowlink.flow-masters.ru/api/orgs/{'org_id'}/discovery/start \3 -H "Authorization: Bearer $TOKEN" \4 -H "Content-Type: application/json" \5 -d '{6 "agent_id": "agent-abc123",7 "scope": {8 "directories": ["/etc", "/opt", "/home"],9 "file_types": ["env", "conf", "yml", "json"],10 "service_types": ["postgres", "redis", "docker"],11 "exclude_paths": ["/proc", "/sys"]12 }13 }'1415# List discovery results16curl https://flowlink.flow-masters.ru/api/orgs/{'org_id'}/discovery/results \17 -H "Authorization: Bearer $TOKEN"1819# Approve secrets for vault storage20curl -X POST https://flowlink.flow-masters.ru/api/orgs/{'org_id'}/discovery/{'scan_id'}/approve \21 -H "Authorization: Bearer $TOKEN" \22 -H "Content-Type: application/json" \23 -d '{ "secret_ids": ["sec_1", "sec_2"] }'2425# Check Vault connectivity26curl https://flowlink.flow-masters.ru/api/orgs/{'org_id'}/vault/health \27 -H "Authorization: Bearer $TOKEN"
Безопасность
- ✓<strong className="text-white">Только для владельца/администратора</strong> — только владелец или администратор организации может запускать сканирование и одобрять секреты.
- ✓<strong className="text-white">Явный opt-in</strong> — агент никогда не сканирует автоматически. Администратор задаёт scope: какие директории и сервисы.
- ✓<strong className="text-white">E2EE шифрование</strong> — результаты шифруются на агенте (X25519 + AES-256-GCM). Relay видит только ciphertext + метаданные.
- ✓<strong className="text-white">Approval workflow</strong> — найденные секреты показываются без значений (только key_name + value_hash). Админ выбирает что записать в Vault.
- ✓<strong className="text-white">Полный audit trail</strong> — каждый запуск, одобрение и запись в Vault логируется с integrity hash chain.
- ✓<strong className="text-white">AI-агент НЕ может запустить discovery</strong> — это привилегированная операция для DevSecOps/администратора.
Иерархия в Vault
1secret/data/2 └── {org_id}/3 └── {host}/4 ├── postgres/ → DB_PASSWORD, DATABASE_URL, PG_HOST5 ├── redis/ → REDIS_URL, REDIS_PASSWORD6 ├── docker/ → API_KEY, REGISTRY_TOKEN7 ├── prometheus/ → PROMETHEUS_URL, ALERTMANAGER_KEY8 └── monitoring/ → GRAFANA_API_KEY, ZABBIX_TOKEN
💡 Ручное + автоматическое
Secret Discovery дополняет ручное управление секретами. Секреты, добавленные вручную через Dashboard, и секреты, обнаруженные автоматически через Discovery, хранятся в одном Vault и инжектятся агентам одинаково.