Guia de Seguretat
A Simple Vista
Què: Controls de seguretat per a la confiança, signatures, divulgació i accés Per què: Prevenir la manipulació d’evidències i limitar l’exposició de dades Qui: Enginyers de seguretat, equips de compliment, operadors de producció Prerequisits: evidence_flow_and_execution_model.md
Postures predefinides
Decision Gate envia quatre preconfiguracions (vegeu preset_configs.md):
- Quickstart-Dev: autenticació només local, bypass del registre només local, permís de desenvolupament habilitat.
- Per defecte-recomanat: autenticació només local amb mapes de principals explícits; omissió del registre desactivada.
- Endurit: autenticació de portador, espai de noms per defecte desactivat, signatura d’esquema requerida.
- Container-Prod: autenticació bearer, terminació TLS ascendent, valors per defecte sense estat.
Aquests presets són intencionadament explícits. Si canvies la postura (mode d’autenticació, valors per defecte de l’espai de noms, ACL del registre, carrils de confiança), actualitza el preset i torna a executar les proves del sistema.
Arquitectura Fail-Closed
Decision Gate fallida tancada: l’evidència manca o és invàlida, produint unknown, que manté les portes.
Controls de seguretat aplicats (en ordre):
- Mínim de confiança (
min_lane) - Validació de l’ancoratge (si està configurat)
- Verificació de la signatura (si és necessari)
- Avaluació del comparador (tri-estat)
Control d’Accés
Accés a l’Eina (API MCP)
L’accés a l’eina està controlat per [server.auth].
[server.auth]
mode = "bearer_token"
bearer_tokens = ["token-1", "token-2"]
allowed_tools = ["scenario_define", "scenario_start", "scenario_next"]
Modes:
local_only(per defecte): només loopback + stdiobearer_token: HTTPAuthorization: Bearer <token>requeritmtls: utilitza l’encapçalamentx-decision-gate-client-subjectd’un proxy TLS de confiança
Nota del registre:
schema_registry.acl.allow_local_only = trueeludeix el mapeig de principals per a cridades només locals. Utilitzeu-lo només per a la incorporació en desenvolupament/local.
Vincle No Loopback
Lligar HTTP/SSE a no-loopback requereix tots els següents:
--allow-non-loopbackoDECISION_GATE_ALLOW_NON_LOOPBACK=1[server.tls]configurat oserver.tls_termination = "upstream"- Autenticació no local (
bearer_tokenomtls)
Per a mtls dins del contenidor, cal establir server.tls.client_ca_path i require_client_cert = true. Per a la terminació TLS ascendent, aplica mTLS al proxy i reenvia x-decision-gate-client-subject.
Trust Lanes
L’evidència es classifica en carrils:
- Verificat: evidència obtinguda del proveïdor
- Afirmat: precomprovar càrregues
La pista mínima s’aplica mitjançant:
[trust]
min_lane = "verified" # or "asserted"
Si la pista d’evidència és per sota del mínim, la condició esdevé unknown i s’hi registra un error trust_lane en el runpack.
Mode Dev-Permissiu
[dev]
permissive = true
Efectes:
- El
min_laneefectiu es converteix enassertedper a la majoria de proveïdors. - Els proveïdors enumerats en
dev.permissive_exempt_providersromanen estrictes (per defecte:assetcore,assetcore_read). - No permès quan
namespace.authority.mode = "assetcore_http".
Verificació de la signatura
Configurat amb trust.default_policy:
[trust]
# Require Ed25519 signatures from these public key files.
default_policy = { require_signature = { keys = ["/etc/decision-gate/keys/provider.pub"] } }
Notes:
- Cada entrada de
keysés un camí de fitxer. El fitxer de clau pot contenir bytes de clau pública en brut de 32 bytes o text en base64. EvidenceResult.signature.key_idha de coincidir amb la cadena de ruta de clau configurada.- La signatura es verifica sobre JSON canònic del HashDigest.
- Si
evidence_hashestà present, ha de coincidir amb el hash canònic del valor de l’evidència.
Si una comprovació de signatura falla, la crida al proveïdor falla i la condició esdevé unknown amb provider_error registrat.
Validació d’Ancoratge
Els ancoratges es configuren a través de la configuració del servidor, no del escenari:
[anchors]
[[anchors.providers]]
provider_id = "assetcore_read"
anchor_type = "assetcore.anchor_set"
required_fields = ["assetcore.namespace_id", "assetcore.commit_id", "assetcore.world_seq"]
Regles d’ancoratge (exactes):
EvidenceResult.evidence_anchor.anchor_typeha de coincidir.anchor_valueha de ser una cadena que contingui JSON canònic.- Aquest JSON ha de ser analitzat com un objecte.
- Els camps requerits han d’existir i ser cadena o número escalar (sense booleans, arrays, objectes o nulls).
Les violacions produeixen anchor_invalid i la condició esdevé unknown.
Divulgació de proves
evidence_query pot retornar valors en brut, però la divulgació està controlada per polítiques:
[evidence]
allow_raw_values = false
require_provider_opt_in = true
[[providers]]
name = "json"
type = "builtin"
config = { root = "/var/lib/decision-gate/evidence", root_id = "evidence-root", max_bytes = 1048576, allow_yaml = false }
allow_raw = true
Comportament:
- Si la divulgació en brut està bloquejada, Decision Gate redacta
valueicontent_typeperò encara retorna hashes i ancores. - Això no és un error JSON-RPC.
- Els noms dels proveïdors són únics; els identificadors integrats (
time,env,json,http) estan reservats.
Gestió de la càrrega útil de presentació/activació
scenario_submit.payload i scenario_trigger.payload són canals de registre d’auditoria. Decision Gate persisteix aquests payloads en l’estat d’execució i en els artefactes de runpack per disseny. Les integracions han d’evitar enviar secrets en brut a través d’aquests camps.
Patró recomanat:
- Enviar referències/manetes opaques en les càrregues.
- Resoldre secrets d’un gestor de secrets dedicat fora de DG.
Configuració de Producció Segura
[server]
transport = "http"
bind = "0.0.0.0:4000"
mode = "strict"
[server.auth]
mode = "bearer_token"
bearer_tokens = ["token-1"]
[server.tls]
cert_path = "/etc/decision-gate/tls/cert.pem"
key_path = "/etc/decision-gate/tls/key.pem"
[trust]
min_lane = "verified"
default_policy = { require_signature = { keys = ["/etc/decision-gate/keys/provider.pub"] } }
[evidence]
allow_raw_values = false
require_provider_opt_in = true
[anchors]
[[anchors.providers]]
provider_id = "json"
anchor_type = "file_path_rooted"
required_fields = ["root_id", "path"]
[namespace]
allow_default = false
[policy]
engine = "static"
[policy.static]
default = "deny"
[run_state_store]
type = "sqlite"
path = "/var/lib/decision-gate/decision-gate.db"
journal_mode = "wal"
sync_mode = "full"
Important: Per a les vinculacions que no són de retroalimentació, afegiu --allow-non-loopback o establiu DECISION_GATE_ALLOW_NON_LOOPBACK=1.
Integritat de SQLite
L’emmagatzematge de l’estat d’execució de SQLite guarda instantànies JSON canòniques i verifica els hash en carregar. La corrupció o les discrepàncies de hash fallen tancades.
Millors pràctiques:
- Utilitzeu un volum durable (eviteu
/tmp). - Fes una còpia de seguretat dels fitxers
.db,-wali-shmjunts.
Trampes comunes (corregides)
- “Els errors de signatura retornen signature_invalid.” -> No. Les fallades de signatura apareixen com a
provider_errordurant les crides al proveïdor. - “La política d’ancoratge està en l’escenari.” -> No. Està configurada sota
[anchors]. - “el motor de polítiques controla l’accés a les eines.” -> No.
[policy]controla l’enviament de paquets només. L’accés a les eines és[server.auth]. - “evidence_query retorna un error quan els valors en brut estan bloquejats.” -> No. Els valors són redactats, no rebutjats.