Skip to content

Revisjon og samsvar

Hver policy-beslutning i Triggerfish logges med full kontekst. Det finnes ingen unntak, ingen «feilsøkingsmodus» som deaktiverer logging, og ingen måte for LLM-en å undertrykke revisjonsregistre. Dette gir en komplett, manipuleringsbevis registrering av hver sikkerhetsbeslutning systemet har tatt.

Hva som registreres

Revisjonslogging er en fast regel — den er alltid aktiv og kan ikke deaktiveres. Hver håndhevelses-hook-kjøring produserer en revisjonspost som inneholder:

FeltBeskrivelse
timestampNår beslutningen ble tatt (ISO 8601, UTC)
hook_typeHvilken håndhevelses-hook som kjørte (PRE_CONTEXT_INJECTION, PRE_TOOL_CALL, POST_TOOL_RESPONSE, PRE_OUTPUT, SECRET_ACCESS, SESSION_RESET, AGENT_INVOCATION, MCP_TOOL_CALL)
session_idSesjonen der handlingen fant sted
decisionALLOW, BLOCK eller REDACT
reasonMenneskelig lesbar forklaring av beslutningen
inputDataene eller handlingen som utløste hooken
rules_evaluatedHvilke policy-regler som ble sjekket for å nå beslutningen
taint_beforeSession taint-nivå før handlingen
taint_afterSession taint-nivå etter handlingen (hvis endret)
metadataYtterligere kontekst spesifikk for hook-typen

Eksempler på revisjonsposter

Tillatt utdata

json
{
  "timestamp": "2025-01-29T10:23:47Z",
  "hook_type": "PRE_OUTPUT",
  "session_id": "sess_456",
  "decision": "ALLOW",
  "reason": "Classification check passed",
  "input": {
    "target_channel": "telegram",
    "recipient": "owner"
  },
  "rules_evaluated": [
    "no_write_down",
    "channel_classification"
  ],
  "taint_before": "INTERNAL",
  "taint_after": "INTERNAL"
}

Blokkert write-down

json
{
  "timestamp": "2025-01-29T10:24:12Z",
  "hook_type": "PRE_OUTPUT",
  "session_id": "sess_456",
  "decision": "BLOCK",
  "reason": "Session taint (CONFIDENTIAL) exceeds effective classification (PUBLIC)",
  "input": {
    "target_channel": "whatsapp",
    "recipient": "external_user_789",
    "effective_classification": "PUBLIC"
  },
  "rules_evaluated": [
    "no_write_down",
    "channel_classification",
    "recipient_classification"
  ],
  "taint_before": "CONFIDENTIAL",
  "taint_after": "CONFIDENTIAL"
}

Verktøykall med taint-eskalering

json
{
  "timestamp": "2025-01-29T10:23:45Z",
  "hook_type": "POST_TOOL_RESPONSE",
  "session_id": "sess_456",
  "decision": "ALLOW",
  "reason": "Tool response classified and taint updated",
  "input": {
    "tool_name": "salesforce.query_opportunities",
    "response_classification": "CONFIDENTIAL"
  },
  "rules_evaluated": [
    "tool_response_classification",
    "taint_escalation"
  ],
  "taint_before": "PUBLIC",
  "taint_after": "CONFIDENTIAL",
  "metadata": {
    "lineage_id": "lin_789xyz",
    "records_returned": 3
  }
}

Agentdelegasjon blokkert

json
{
  "timestamp": "2025-01-29T10:25:00Z",
  "hook_type": "AGENT_INVOCATION",
  "session_id": "sess_456",
  "decision": "BLOCK",
  "reason": "Agent ceiling (INTERNAL) below session taint (CONFIDENTIAL)",
  "input": {
    "caller_agent_id": "agent_abc",
    "callee_agent_id": "agent_def",
    "callee_ceiling": "INTERNAL",
    "task": "Generate public summary"
  },
  "rules_evaluated": [
    "delegation_ceiling_check",
    "delegation_allowlist",
    "delegation_depth"
  ],
  "taint_before": "CONFIDENTIAL",
  "taint_after": "CONFIDENTIAL"
}

Sporingsmuligheter for revisjon

Revisjonssporingsflyt: fremover-sporing, bakover-sporing og klassifiseringsbegrunnelse mater inn i samsvareksport

Revisjonsposter kan spørres på fire måter, hver tilpasset ulike samsvars- og kriminaltekniske behov.

Fremover-sporing

Spørsmål: «Hva skjedde med data fra Salesforce-posten opp_00123ABC

En fremover-sporing følger et dataelement fra dets opprinnelsespunkt gjennom hver transformasjon, sesjon og utdata. Den svarer på: hvor gikk disse dataene, hvem så dem, og ble de noen gang sendt utenfor organisasjonen?

Opprinnelse: salesforce.query_opportunities
  --> lineage_id: lin_789xyz
  --> klassifisering: CONFIDENTIAL
  --> sesjon: sess_456

Transformasjoner:
  --> Uttrukne felter: name, amount, stage
  --> LLM oppsummerte 3 poster til pipeline-oversikt

Utdata:
  --> Sendt til eier via Telegram (TILLATT)
  --> Blokkert fra WhatsApp ekstern kontakt (BLOKKERT)

Bakover-sporing

Spørsmål: «Hvilke kilder bidro til meldingen sendt kl. 10:24 UTC?»

En bakover-sporing starter fra et utdata og går bakover gjennom linjerekken for å identifisere hver datakilde som påvirket utdataet. Dette er viktig for å forstå om klassifiserte data var inkludert i et svar.

Utdata: Melding sendt til Telegram kl. 10:24:00Z
  --> sesjon: sess_456
  --> linjekilder:
      --> lin_789xyz: Salesforce-mulighet (CONFIDENTIAL)
      --> lin_790xyz: Salesforce-mulighet (CONFIDENTIAL)
      --> lin_791xyz: Salesforce-mulighet (CONFIDENTIAL)
      --> lin_792xyz: Vær-API (PUBLIC)

Klassifiseringsbegrunnelse

Spørsmål: «Hvorfor er disse dataene merket CONFIDENTIAL?»

Klassifiseringsbegrunnelse sporer tilbake til regelen eller policyen som tildelte klassifiseringsnivået:

Data: Pipeline-sammendrag (lin_789xyz)
Klassifisering: CONFIDENTIAL
Årsak: source_system_default
  --> Salesforce-integrasjonens standardklassifisering: CONFIDENTIAL
  --> Konfigurert av: admin_001 kl. 2025-01-10T08:00:00Z
  --> Policy-regel: "Alle Salesforce-data klassifisert som CONFIDENTIAL"

Samsvareksport

For juridisk, regulatorisk eller intern gjennomgang kan Triggerfish eksportere den fullstendige forvaringskjeden for ethvert dataelement eller tidsperiode:

Eksportforespørsel:
  --> Tidsperiode: 2025-01-29T00:00:00Z til 2025-01-29T23:59:59Z
  --> Omfang: Alle sesjoner for user_456
  --> Format: JSON

Eksporten inkluderer:
  --> Alle revisjonsposter i tidsperioden
  --> Alle linjeposter referert av revisjonsposter
  --> Alle sesjonstilstandsoverganger
  --> Alle policy-beslutninger (ALLOW, BLOCK, REDACT)
  --> Alle taint-endringer
  --> Alle delegeringskjede-poster

Samsvareksporter er strukturerte JSON-filer som kan tas inn av SIEM-systemer, samsvarsdashbord eller verktøy for juridisk gjennomgang. Eksportformatet er stabilt og versjonert. :::

Datalinje

Revisjonslogging fungerer i samarbeid med Triggerfish sitt datalinjessystem. Hvert dataelement behandlet av Triggerfish bærer provenansmetadata:

json
{
  "lineage_id": "lin_789xyz",
  "content_hash": "sha256:a1b2c3d4...",
  "origin": {
    "source_type": "integration",
    "source_name": "salesforce",
    "record_id": "opp_00123ABC",
    "record_type": "Opportunity",
    "accessed_at": "2025-01-29T10:23:45Z",
    "accessed_by": "user_456",
    "access_method": "plugin_query"
  },
  "classification": {
    "level": "CONFIDENTIAL",
    "reason": "source_system_default",
    "assigned_at": "2025-01-29T10:23:45Z",
    "can_be_downgraded": false
  },
  "transformations": [
    {
      "type": "extraction",
      "description": "Selected fields: name, amount, stage",
      "timestamp": "2025-01-29T10:23:46Z",
      "agent_id": "agent_123"
    },
    {
      "type": "summarization",
      "description": "LLM summarized 3 records into pipeline overview",
      "timestamp": "2025-01-29T10:23:47Z",
      "input_lineage_ids": ["lin_789xyz", "lin_790xyz", "lin_791xyz"],
      "agent_id": "agent_123"
    }
  ],
  "current_location": {
    "session_id": "sess_456",
    "context_position": "assistant_response_3"
  }
}

Linjeposter opprettes ved POST_TOOL_RESPONSE (når data kommer inn i systemet) og oppdateres etter hvert som data transformeres. Aggregerte data arver max(inngangsklassifiseringer) — hvis noen inndata er CONFIDENTIAL, er utdataet minst CONFIDENTIAL.

HendelseLinjehandling
Data lest fra integrasjonOpprett linjepost med opprinnelse
Data transformert av LLMLegg til transformasjon, koble inngangslinjer
Data aggregert fra flere kilderSlå sammen linjer, klassifisering = max(innganger)
Data sendt til kanalRegistrer destinasjon, verifiser klassifisering
SesjonstilbakestillingArkiver linjeposter, tøm fra kontekst

Lagring og oppbevaring

Revisjonslogger lagres gjennom StorageProvider-abstraksjonen under audit:-navnerommet. Linjeposter lagres under lineage:-navnerommet.

DatatypeNavneromStandard oppbevaring
Revisjonsloggeraudit:1 år
Linjeposterlineage:90 dager
Sesjonstilstandsessions:30 dager
Taint-historikktaint:Samsvarer med sesjonsoppbevaring

SIKKERHET Oppbevaringsperioder er konfigurerbare, men revisjonslogger er som standard 1 år for å støtte samsvarsrkrav (SOC 2, GDPR, HIPAA). Å redusere oppbevaringsperioden under organisasjonens regulatoriske krav er administratorens ansvar. :::

Lagringsbackends

NivåBackendDetaljer
PersonligSQLiteWAL-modus database på ~/.triggerfish/data/triggerfish.db. Revisjonsposter lagres som strukturert JSON i samme database som all annen Triggerfish-tilstand.
BedriftPluggbarBedriftsbackends (Postgres, S3 osv.) kan brukes via StorageProvider-grensesnittet. Dette muliggjør integrasjon med eksisterende loggruggregasjonsinfrastruktur.

Uforanderlighet og integritet

Revisjonsposter er tilleggskjørbare. Når de er skrevet, kan de ikke endres eller slettes av noen komponent i systemet — inkludert LLM-en, agenten eller plugins. Sletting skjer kun gjennom utløp av oppbevaringspolicy.

Hver revisjonspost inkluderer en innholdshash som kan brukes til å verifisere integritet. Hvis poster eksporteres for samsvarsgransking, kan hashene valideres mot de lagrede postene for å oppdage manipulering.

Bedrifts samsvarsfunksjoner

Bedriftsdistribusjoner kan utvide revisjonslogging med:

FunksjonBeskrivelse
Juridisk sperringSuspender oppbevaringsbasert sletting for spesifiserte brukere, sesjoner eller tidsperioder
SIEM-integrasjonStrøm revisjonshendelser til Splunk, Datadog eller andre SIEM-systemer i sanntid
SamsvarsdashbordVisuell oversikt over policy-beslutninger, blokkerte handlinger og taint-mønstre
Planlagte eksporterAutomatiske periodiske eksporter for regulatorisk gjennomgang
VarslingsreglerUtløs varsler når spesifikke revisjonsmønstre oppstår (f.eks. gjentatte blokkerte write-downs)

Relaterte sider