Granskningslogg
Granskningsloggen fångar varje administrativ åtgärd mot din tenant: vem som gjorde vad, när, från vilken IP-adress och mot vilken resurs. Lagringen sker i två nivåer: en sökbar het nivå med hela händelsens innehåll (aktör, åtgärd, fields_json) i 90 / 180 / 365 / 730 dagar — som standard 90 (standardplanen) eller 365 (enterprise-planer), och inställbart per tenant under Autentiseringspolicy → Lagringstid för granskningslogg; och ett kryptografiskt kedjearkiv i 3 år i T Cloud Public OBS WORM som behåller förankringsobjekten för hashkedjan efter att innehållet i den heta nivån har maskerats. Exporter för efterlevnad täcker det sökbara fönstret.
För den kryptografiska spårbarhetskedjan (förankringskedja, merkle-åtaganden lagrade i OBS), se Granskningskedjans integritet.
Vad som registreras
| Händelseklass | Exempel |
|---|---|
| Identitet | Inloggning, step-up via SSO, återställning av MFA, SCIM-provisionering, rolländring |
| Repo | Repo skapat, överfört, arkiverat, borttaget; branch-skydd ändrat |
| Hemligheter | Hemlighet skapad, roterad, borttagen (bara namnet, aldrig värdet) |
| Webhooks | Mottagare tillagd, roterad, borttagen; leverans spelad upp igen |
| Policy | Regel för Push-skydd tillagd eller undantag tillämpat; undantag från skanning efter skadlig kod; avfärdande av SAST-fynd |
| Fakturering | Planändring, uppdaterad betalningsmetod, ändrat tak |
| Dataexport | Export köad, nedladdad, utgången |
Det som uttryckligen saknas: vanliga läsningar (klon, visning, öppnad fil). Granskningsloggen är en logg över administrativa åtgärder, inte en åtkomstlogg. Undantaget är granskare med läsbehörighet, vars läsningar av dina inställningar registreras (se Granskares aktivitet). Åtkomst till paket- och container-registryt (varje nedladdning, uppladdning och borttagning, med aktör och klientens IP-adress) finns i den separata åtkomstloggen för registry, som du kan läsa via API:t, vidarebefordra till ditt SIEM och få med i dataexporten. Git-kloner och fetch loggas inte per begäran än.
Händelser för paket och releaser
Publicering, taggning, borttagning och nekande av interna artefakter finns i granskningsloggen, hashkedjade som alla andra händelser och i din SIEM-ström. Två vyer skriver dem:
- Versionsvyn, från själva registryt: en version dök upp eller försvann.
- Begäransvyn, från uppladdningsproxyn framför varje skrivning till registryt: en händelse per accepterad eller nekad skrivning, med jobbet bakom en jobbtoken och, för taggar, vad taggen pekade på tidigare.
| Åtgärd | När |
|---|---|
package.published | En paketversion dök upp (dess första fil kom in). |
package.deleted | En paketversion och dess filer är borta. |
package.upload.accepted | En skrivning till registryt lyckades: en fil, en npm-publicering, ytterligare en fil i en befintlig version, ett container-manifest som pushats via digest. |
package.upload.refused | fremforge nekade en skrivning: skadlig kod, skannern otillgänglig, för stor för att skanna, en spärr för container-lager. |
package.delete.accepted | En borttagning lyckades (en fil, en version, ett container-manifest via digest). |
package.delete.refused | En borttagning nekades (utom en registry-robots, nedan). |
package.tag.created | En container-tagg eller npm dist-tag som inte fanns pekar nu på en digest. |
package.tag.moved | En container-tagg pekar nu på en annan digest. previous_digest är den som den pekade på tidigare. |
package.tag.set | En tagg skrevs och fremforge kunde inte avgöra vad den pekade på tidigare, eller så pekade den på samma digest (unchanged: true). npm dist-tags är alltid set. |
package.tag.deleted | En tagg togs bort; digest är vad den pekade på. |
package.immutable.refused | En överskrivning av en publicerad version nekades (oföränderliga releaser); båda sha256-värdena. |
registry_robot.delete_refused | En registry-robot försökte ta bort något; robotar publicerar men tar aldrig bort. |
package.files.recorded, package.files.removed | Filerna i en version med deras sha256 (organisationer med paketpolicyer). |
forgejo.release.*, forgejo.ref.create, forgejo.ref.delete | En release publicerad, redigerad eller borttagen (med dess id, mål, flaggor för utkast och förhandsversion samt tillgångar); en git-tagg eller branch skapad (med sin commit) eller borttagen. |
Varje pakethändelse innehåller:
| Fält | Betydelse |
|---|---|
org, package_type, package_name, package_version, file | Vad som skrevs. En begäran anger det som dess sökväg anger; versionsvyn anger versionen. |
digest | sha256:<hex>: ett container-manifests digest, eller sha256 för en rå uppladdningskropp (filens egen sha256 för alla typer utom npm och Cargo, vars uppladdningskroppar omsluter filen). |
actor_kind | human, robot (en registry-robot), job (en jobbtoken för Forgejo Actions), bot (en systembot i fremforge), system eller anonymous. |
actor_login, actor_id | Vem registryt autentiserade. |
job_repo, job_run_id, job_run_number, job_id | För en jobbtoken: repot och körningen (/<owner>/<repo>/actions/runs/<job_run_number>). |
decision, reason | Vid ett nekande, eller en skrivning som en spärr i observationsläge släppte igenom. |
access_event_id | Motsvarande rad i åtkomstloggen för registry, som också innehåller klientens IP-adress. |
Händelser från begäransvyn finns från 2026-10-08. Befordran mellan repon är inget registry-begrepp i fremforge, så det finns ingen händelse för befordran.
Åtkomst till paket
Åtkomst per paket och skyddade namn skriver:
| Åtgärd | När |
|---|---|
package_access.settings.updated | Organisationens standard ändrades (default_mode från och till). |
package_access.package.updated | Ett pakets åtkomstinställning skapades eller ändrades (mode, inherit_repo, changed). |
package_access.package.removed | Ett pakets inställning och behörigheter togs bort (grants_removed). |
package_access.grant.set | En behörighet för ett team eller för Actions lades till eller ändrades (grantee_kind, grantee_name, permission, previous_permission). |
package_access.grant.removed | En behörighet togs bort. |
package_protection.rule.created, .updated, .deleted | En regel för skyddade namn ändrades (package_type, name_pattern, push, delete). |
package_access.denied | En begäran nekades av åtkomst per paket eller ett skyddat namn (access, needed, permission, reason och aktörsfälten ovan). Högst en gång i timmen för samma aktör, paket och åtkomst. |
package_access.would_deny | Samma sak, medan fremforge körde kontrollen i observationsläge och levererade svaret. |
Skanning av modeller
Skanning av modeller skriver:
| Åtgärd | När |
|---|---|
security_policy.model_scan.updated | Organisationens modellpolicy ändrades (changed, och diff med varje inställnings from och to). |
security_policy.model_scan.dismissed | Ett fynd avfärdades för en fil, eller så förnyades dess avfärdande (sha256, verdict, reason, expires_at, replaced). |
security_policy.model_scan.dismissal_revoked | Ett avfärdande återkallades (sha256). |
En pull som modellpolicyn nekar är en händelse registry.pull.blocked med gate: model, nedan.
Spärrar för container-pulls
Registryts image-spärrar skriver sina beslut till granskningsloggen, så att de når ditt SIEM som alla andra händelser:
| Åtgärd | När |
|---|---|
registry.pull.blocked | En container-pull nekades |
registry.pull.would_block | En pull levererades som en spärr skulle ha nekat: din blockeringsåtgärd för image-skanning är warn, eller så körs spärren i observationsläge |
Aktören är system:registry-pull-gate. fields är:
| Fält | Betydelse |
|---|---|
gate | image_scan (sårbarhetsfynd på eller över din blockeringströskel), image_malware (skadliga paket), registry_scan (ett lager i imagen som ClamAV fann infekterat eller inte kunde skanna), registry_blob (samma sak, för ett lager som hämtats direkt via digest), signature (image-signaturer: reason är unsigned, untrusted eller invalid) eller model (skanning av modeller: reason är model-malicious, model-suspicious eller model-unscannable) |
image, ref, digest | Imagen, den tagg eller digest som efterfrågades och den digest som levererades |
reason | Vad spärren hittade, till exempel layer-infected eller image-malware |
mode | enforce, warn (din blockeringsåtgärd) eller shadow (observationsläge) |
block_severity, finding_count | Bara image_scan: tröskeln och antalet öppna fynd på eller över den |
window_start | Den timme som händelsen avser |
previous_window_start, previous_window_count | Den senaste tidigare timmen med en händelse för samma nyckel, och hur många beslut den hade totalt; null för den första |
En händelse per timme. Ett CI-jobb som hämtar en blockerad image i en loop skulle annars fylla loggen. Därför finns det en händelse per image-digest, spärr och beslut per UTC-timme, skriven vid timmens första beslut. Ytterligare beslut under den timmen räknas, och antalet rapporteras i nästa händelse för samma nyckel som previous_window_count. En timmes antal når därför ditt SIEM med nästa händelse för den digesten, inte vid timmens slut; antalet för den sista timmen med pulls skickas inte. En blocked och en would_block för samma digest, eller två spärrar, är separata nycklar.
En händelse registry.pull.blocked utlöser också din aviseringswebhook security.pull.blocked, om du har prenumererat med en. Varje pull, tillåten eller inte, finns i åtkomstloggen för registry.
Granskares aktivitet
Medlemmar i din organisations team Auditors kan läsa organisationens inställningar utan att ändra dem. Deras läsningar registreras, så att du kan se vad en granskare har tittat på:
| Åtgärd | När |
|---|---|
tenant.auditor.read | En granskare öppnade en administrationssida eller anropade en läsendpoint i API:t. Högst en händelse per granskare och route var 10:e minut |
tenant.auditor.write_refused | En granskare skickade en begäran som skulle ändra något, och den nekades. Varje försök |
tenant.auditor.read_refused | En granskare bad om en sida eller endpoint som är stängd för granskare, som dataexporten, och den nekades. Varje försök |
compliance.evidence.fetched | Någon, granskare eller inte, hämtade det signerade paketet med bevis för efterlevnad via API:t. Varje hämtning |
I de tre händelserna tenant.auditor.* är aktören granskarens användarnamn, och fields innehåller route (route-mönstret, som /:slug/_admin/members, aldrig frågesträngen), method, status i tenant.auditor.read, via (portal, oauth eller token) och, för en API-token, dess token_id.
Läsa loggen
Tenantadministration → Rapporter → Granskningslogg. Filtrera på aktör (<username>, eller en agent som mcp-client:<client id>; filtret matchar också den person som en agent agerade för), åtgärd (secret.created, role.changed, …), tidsintervall eller berörd resurs. Standardvyn är de senaste 7 dagarna.
Klicka på en rad för att visa JSON-innehållet. Känsliga fält (hemliga värden, OIDC-tokens, bilagor med personuppgifter) maskeras redan när de skrivs, så en expanderad rad visar aldrig ett värde som du inte vill att en kunds granskare ska läsa.
CSV-export
Klicka på Exportera CSV i en filtrerad vy för att få en ögonblicksbild. CSV-filen innehåller de rader som för tillfället är filtrerade, högst 50 000 rader per export. För större fönster köar du en fullständig Dataexport under Rapporter → Dataexport.
Via REST API
Granskningsloggen finns i det publika API:t. Använd det när du strömmar händelser till din egen analyspipeline, bygger en instrumentpanel för efterlevnad eller kör granskningsfrågor från ett skript.
- Fråga loggen
GET /_app/api/v1/orgs/:slug/audit(filtrera med?actor_kind=och?since=) - Verifiera kedjans integritet
GET /_app/api/v1/orgs/:slug/audit/integrity - Ändra lagringsfönstret
PATCH /_app/api/v1/orgs/:slug/auth-policymed kroppen:{ "audit_full_payload_retention_days": 365 }
Kräver en personlig åtkomsttoken (PAT) med behörigheten audit:read (eller policy:write för att ändra lagringsfönstret):
curl -H "Authorization: Bearer ${FREMFORGE_PAT}" \
"https://frem.sh/_app/api/v1/orgs/acme/audit?actor_kind=human&since=2026-01-01T00:00:00Z"Se referensen för det publika REST API:t för hela OpenAPI-specifikationen.
Vidarebefordran till SIEM
Varje granskningshändelse skickas också till en HTTPS-mottagare per tenant om du konfigurerar vidarebefordran till SIEM. Mottagaren tar emot händelser i realtid (inom sekunder efter åtgärden) i en kompakt JSON-form; formatet är stabilt och versionerat.
Lagringstid
Granskningsposter sparas i två nivåer:
- Sökbar innehållsnivå — aktörsnamnet och innehållet i
fields_jsonför varje händelse går att söka i via administrationsgränssnittet / CSV-exporten / SIEM-strömmen under lagringsfönstret nedan. - Manipuleringssäker kedjenivå — varje händelses kryptografiska hash + kedjelänk sparas i 3 år (WORM-förankrad med Object Lock i OBS). Det är det som gör att kedjan bevisligen är omanipulerad inför en granskning; den finns kvar intakt även efter att maskeringen i innehållsnivån har stämplat en rad.
Lagringstid för sökbart innehåll
| Plan | Standard | Förval som kunden kan välja |
|---|---|---|
| fremforge / starter | 90 dagar | 90 / 180 / 365 / 730 |
| enterprise / enterprise_trial | 365 dagar | 90 / 180 / 365 / 730 |
Taket på 730 dagar (≈2 år) håller den levande tabellen audit_events begränsad. Allt utöver det är WORM-nivåns uppgift; om du behöver sökbar historik längre än 730 dagar, köa en Dataexport varje kvartal och arkivera den i ditt SIEM.
Gränsen gäller kolumnerna för aktör + fields_json: rader som är äldre än fönstret behåller sin hash, tidsstämpel och sitt åtgärdsnamn (så att rapportering för SOC 2 / DORA fortfarande fungerar), men aktören pseudonymiseras till redacted och innehållet ersätts med {}. Den kryptografiska kedjan bryts inte av detta; maskeringen är en pseudonymisering på plats, ingen borttagning.
Det sökbara fönstret är klassen audit_payload i lagring av bevis, där de andra bevisklasserna också ställs in. Ett legal hold skjuter upp maskeringen.
Ändra det sökbara fönstret
Tenantadministration → Säkerhet → Autentiseringspolicy → kortet Lagringstid för granskningslogg. Välj 90 / 180 / 365 / 730 dagar. Att tänka på:
- Förlänga fönstret (t.ex. 90 → 365): nyskrivna rader förblir sökbara längre. Rader som redan har maskerats under det tidigare fönstret förblir maskerade — fremforge återställer inte maskerade rader.
- Förkorta fönstret (t.ex. 365 → 90): nästa dagliga maskeringskörning maskerar varje rad som är äldre än det nya fönstret. Maskering kan inte ångras när den väl har tillämpats; WORM-kedjan påverkas inte.
Den åtgärd i granskningsloggen som registreras för den här inställningen: tenant.auth_policy.audit_retention.updated (med antalet dagar som previous och next).
Åtaganden för efterlevnad
DPA bilaga A.7 åtar sig baslinjen på 90 dagar + 3 år WORM. Enterprise-SLA:n åtar sig 365 dagar sökbart + 3 år WORM. Att gå under planens standard är tillåtet i gränssnittet men skulle bryta mot DPA:n — fremforge upprätthåller inte golvet i kolumnen, det gör avtalet. Ett fel i själva den dagliga maskeringskörningen (skilt från att en kund ändrar lagringstiden) övervakas och larmas kontinuerligt.