Хранилище секретов
Хранилище секретов с шифрованием 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: Организуйте секреты по сервисам/командам
Переменная окружения
# Required for Secrets API export FLOWLINK_SECRETS_KEY="your-32-byte-base64-key-here" # Generate a strong key openssl rand -base64 32
API эндпоинты
# Create secret
POST /api/v1/secrets
Body: {
"name": "stripe-api-key",
"value": "sk_live_...",
"tags": ["payment", "stripe"]
}
# List secrets (with partial values)
GET /api/v1/secrets
# Get secret (requires authentication)
GET /api/v1/secrets/{id}
# Update secret
PATCH /api/v1/secrets/{id}
# Rotate secret (generates new encrypted value)
POST /api/v1/secrets/{id}/rotate
# Delete secret
DELETE /api/v1/secrets/{id}Модель секрета
{
"id": "sec_abc123",
"name": "stripe-api-key",
"value_encrypted": "AEsDBBQABgAIAAAAI...",
"tags": ["payment", "stripe"],
"created_at": "2026-04-21T20:00:00Z",
"last_rotated_at": "2026-04-21T20:00:00Z",
"rotation_days_remaining": 25,
"version": 1
}Примеры запросов
# Create secret
curl -X POST https://flowlink.flow-masters.ru/api/v1/secrets \
-H "Authorization: Bearer flk_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "telegram-bot-token",
"value": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
"tags": ["bot", "telegram"]
}'
# List secrets (partial values)
curl https://flowlink.flow-masters.ru/api/v1/secrets
# Get specific secret
curl https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc123
# Rotate secret (creates new version)
curl -X POST https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc123/rotate
# Delete secret
curl -X DELETE https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc123Tags
Используйте теги для организации секретов:
Инъекция секретов (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 | Pro | Business |
|---|---|---|---|
| Env-переменные | ✅ | ✅ | ✅ |
| Монтирование файлов | — | ✅ | ✅ |
| HashiCorp Vault | — | — | ✅ |
API маппингов
# Create mapping
POST /api/secrets/mappings
Body: {
"secret_id": "sec_abc123",
"env_var_name": "STRIPE_API_KEY",
"agent_labels": ["billing"],
"mount_path": null,
"enabled": true
}
# List mappings
GET /api/secrets/mappings
# Update mapping
PATCH /api/secrets/mappings/{id}
# Delete mapping
DELETE /api/secrets/mappings/{id}Примеры запросов
# Create mapping
TOKEN="flk_live_..."
# Link a vault secret to an env var for the "billing" agent
curl -X POST https://flowlink.flow-masters.ru/api/secrets/mappings \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"secret_id": "sec_abc123",
"env_var_name": "STRIPE_API_KEY",
"agent_labels": ["billing"],
"enabled": true
}'
# List all mappings
curl https://flowlink.flow-masters.ru/api/secrets/mappings \
-H "Authorization: Bearer $TOKEN"
# Update a mapping (e.g. disable it)
curl -X PATCH https://flowlink.flow-masters.ru/api/secrets/mappings/mp_xyz \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "enabled": false }'
# Delete a mapping
curl -X DELETE https://flowlink.flow-masters.ru/api/secrets/mappings/mp_xyz \
-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 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: настройка
# Generate org keypair (on admin machine)
flowlink keygen --org
# → org_public_key (base64, upload to relay)
# → org_private_key (KEEP LOCALLY, NEVER upload)
# Upload public key to relay
curl -X POST https://flowlink.flow-masters.ru/api/orgs/$ORG_ID/secrets/config/key-setup \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"org_public_key": "BASE64_PUB_KEY"}'
# Configure external Vault
curl -X POST https://flowlink.flow-masters.ru/api/orgs/$ORG_ID/secrets/config/vault-setup \
-H "Authorization: Bearer $TOKEN" \
-d '{
"address": "https://vault.company.com:8200",
"auth": {"method": "approle", "role_id": "xxx", "encrypted_secret_id": {...}, "secret_id_ttl": "24h"},
"mount_path": "flowlink",
"ca_cert_pem": "-----BEGIN CERTIFICATE-----...",
"mtls": {"encrypted_client_cert": {...}, "encrypted_client_key": {...}, "server_name": "vault.company.com"},
"response_wrapping": true
}'
# Check zero-trust configuration
curl https://flowlink.flow-masters.ru/api/orgs/$ORG_ID/secrets/config \
-H "Authorization: Bearer $TOKEN"
# → {"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
# Start discovery scan on an agent (org owner/admin only)
curl -X POST https://flowlink.flow-masters.ru/api/orgs/{org_id}/discovery/start \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "agent-abc123",
"scope": {
"directories": ["/etc", "/opt", "/home"],
"file_types": ["env", "conf", "yml", "json"],
"service_types": ["postgres", "redis", "docker"],
"exclude_paths": ["/proc", "/sys"]
}
}'
# List discovery results
curl https://flowlink.flow-masters.ru/api/orgs/{org_id}/discovery/results \
-H "Authorization: Bearer $TOKEN"
# Approve secrets for vault storage
curl -X POST https://flowlink.flow-masters.ru/api/orgs/{org_id}/discovery/{scan_id}/approve \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "secret_ids": ["sec_1", "sec_2"] }'
# Check Vault connectivity
curl https://flowlink.flow-masters.ru/api/orgs/{org_id}/vault/health \
-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
secret/data/
└── {org_id}/
└── {host}/
├── postgres/ → DB_PASSWORD, DATABASE_URL, PG_HOST
├── redis/ → REDIS_URL, REDIS_PASSWORD
├── docker/ → API_KEY, REGISTRY_TOKEN
├── prometheus/ → PROMETHEUS_URL, ALERTMANAGER_KEY
└── monitoring/ → GRAFANA_API_KEY, ZABBIX_TOKEN💡 Ручное + автоматическое
Secret Discovery дополняет ручное управление секретами. Секреты, добавленные вручную через Dashboard, и секреты, обнаруженные автоматически через Discovery, хранятся в одном Vault и инжектятся агентам одинаково.