Skip to content
ВозможностиДокументацияЦеныПартнёрыPlaygroundFAQ

Хранилище секретов

Хранилище секретов с шифрованием 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: Организуйте секреты по сервисам/командам

Переменная окружения

bash
1# Required for Secrets API
2export FLOWLINK_SECRETS_KEY="your-32-byte-base64-key-here"
3
4# Generate a strong key
5openssl rand -base64 32

API эндпоинты

bash
1# Create secret
2POST /api/v1/secrets
3Body: {
4 "name": "stripe-api-key",
5 "value": "sk_live_...",
6 "tags": ["payment", "stripe"]
7}
8
9# List secrets (with partial values)
10GET /api/v1/secrets
11
12# Get secret (requires authentication)
13GET /api/v1/secrets/{'id'}
14
15# Update secret
16PATCH /api/v1/secrets/{'id'}
17
18# Rotate secret (generates new encrypted value)
19POST /api/v1/secrets/{'id'}/rotate
20
21# Delete secret
22DELETE /api/v1/secrets/{'id'}

Модель секрета

bash
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": 1
10}

Примеры запросов

bash
1# Create secret
2curl -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 }'
10
11# List secrets (partial values)
12curl https://flowlink.flow-masters.ru/api/v1/secrets
13
14# Get specific secret
15curl https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc123
16
17# Rotate secret (creates new version)
18curl -X POST https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc123/rotate
19
20# Delete secret
21curl -X DELETE https://flowlink.flow-masters.ru/api/v1/secrets/sec_abc123

Tags

Используйте теги для организации секретов:

paymentdatabaseapibotthird-partyinternal

Инъекция секретов (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-переменных.

Тарифные ограничения

ФункцияStarterTeamBusiness
Env-переменные
Монтирование файлов
HashiCorp Vault

API маппингов

bash
1# Create mapping
2POST /api/secrets/mappings
3Body: {
4 "secret_id": "sec_abc123",
5 "env_var_name": "STRIPE_API_KEY",
6 "agent_labels": ["billing"],
7 "mount_path": null,
8 "enabled": true
9}
10
11# List mappings
12GET /api/secrets/mappings
13
14# Update mapping
15PATCH /api/secrets/mappings/{'id'}
16
17# Delete mapping
18DELETE /api/secrets/mappings/{'id'}

Примеры запросов

bash
1# Create mapping
2TOKEN="flk_live_..."
3
4# Link a vault secret to an env var for the "billing" agent
5curl -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": true
13 }'
14
15# List all mappings
16curl https://flowlink.flow-masters.ru/api/secrets/mappings \
17 -H "Authorization: Bearer $TOKEN"
18
19# 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 }'
24
25# Delete a mapping
26curl -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
Доступ к VaultResponse wrapping + limited AppRole с минимальным TTL
Перехват agent ↔ relayE2EE: per-org X25519 ключи, relay не знает private key
Перехват relay ↔ VaultmTLS + 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: настройка

bash
1# Generate org keypair (on admin machine)
2flowlink-relay keygen --org
3# → org_public_key (base64, upload to relay)
4# → org_private_key (KEEP LOCALLY, NEVER upload)
5
6# Upload public key to relay
7curl -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"}'
11
12# Configure external Vault
13curl -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": true
22 }'
23
24# Check zero-trust configuration
25curl 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

bash
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 }'
14
15# List discovery results
16curl https://flowlink.flow-masters.ru/api/orgs/{'org_id'}/discovery/results \
17 -H "Authorization: Bearer $TOKEN"
18
19# Approve secrets for vault storage
20curl -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"] }'
24
25# Check Vault connectivity
26curl 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

text
1secret/data/
2 └── {org_id}/
3 └── {host}/
4 ├── postgres/ → DB_PASSWORD, DATABASE_URL, PG_HOST
5 ├── redis/ → REDIS_URL, REDIS_PASSWORD
6 ├── docker/ → API_KEY, REGISTRY_TOKEN
7 ├── prometheus/ → PROMETHEUS_URL, ALERTMANAGER_KEY
8 └── monitoring/ → GRAFANA_API_KEY, ZABBIX_TOKEN

💡 Ручное + автоматическое

Secret Discovery дополняет ручное управление секретами. Секреты, добавленные вручную через Dashboard, и секреты, обнаруженные автоматически через Discovery, хранятся в одном Vault и инжектятся агентам одинаково.

Edit this page