Decision Gate Docs

Avaluació de portes determinista, reproduïble amb decisions auditable.

Asset Core docs

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):

  1. Mínim de confiança (min_lane)
  2. Validació de l’ancoratge (si està configurat)
  3. Verificació de la signatura (si és necessari)
  4. 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 + stdio
  • bearer_token: HTTP Authorization: Bearer <token> requerit
  • mtls: utilitza l’encapçalament x-decision-gate-client-subject d’un proxy TLS de confiança

Nota del registre:

  • schema_registry.acl.allow_local_only = true eludeix 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:

  1. --allow-non-loopback o DECISION_GATE_ALLOW_NON_LOOPBACK=1
  2. [server.tls] configurat o server.tls_termination = "upstream"
  3. Autenticació no local (bearer_token o mtls)

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_lane efectiu es converteix en asserted per a la majoria de proveïdors.
  • Els proveïdors enumerats en dev.permissive_exempt_providers romanen 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_id ha de coincidir amb la cadena de ruta de clau configurada.
  • La signatura es verifica sobre JSON canònic del HashDigest.
  • Si evidence_hash està 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_type ha de coincidir.
  • anchor_value ha 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 value i content_type però 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, -wal i -shm junts.

Trampes comunes (corregides)

  • “Els errors de signatura retornen signature_invalid.” -> No. Les fallades de signatura apareixen com a provider_error durant 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.

Referència Creuada