Hoppa till huvudinnehållet

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ändelseklassExempel
IdentitetInloggning, step-up via SSO, återställning av MFA, SCIM-provisionering, rolländring
RepoRepo skapat, överfört, arkiverat, borttaget; branch-skydd ändrat
HemligheterHemlighet skapad, roterad, borttagen (bara namnet, aldrig värdet)
WebhooksMottagare tillagd, roterad, borttagen; leverans spelad upp igen
PolicyRegel för Push-skydd tillagd eller undantag tillämpat; undantag från skanning efter skadlig kod; avfärdande av SAST-fynd
FaktureringPlanändring, uppdaterad betalningsmetod, ändrat tak
DataexportExport 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ärdNär
package.publishedEn paketversion dök upp (dess första fil kom in).
package.deletedEn paketversion och dess filer är borta.
package.upload.acceptedEn 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.refusedfremforge nekade en skrivning: skadlig kod, skannern otillgänglig, för stor för att skanna, en spärr för container-lager.
package.delete.acceptedEn borttagning lyckades (en fil, en version, ett container-manifest via digest).
package.delete.refusedEn borttagning nekades (utom en registry-robots, nedan).
package.tag.createdEn container-tagg eller npm dist-tag som inte fanns pekar nu på en digest.
package.tag.movedEn container-tagg pekar nu på en annan digest. previous_digest är den som den pekade på tidigare.
package.tag.setEn 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.deletedEn tagg togs bort; digest är vad den pekade på.
package.immutable.refusedEn överskrivning av en publicerad version nekades (oföränderliga releaser); båda sha256-värdena.
registry_robot.delete_refusedEn registry-robot försökte ta bort något; robotar publicerar men tar aldrig bort.
package.files.recorded, package.files.removedFilerna i en version med deras sha256 (organisationer med paketpolicyer).
forgejo.release.*, forgejo.ref.create, forgejo.ref.deleteEn 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ältBetydelse
org, package_type, package_name, package_version, fileVad som skrevs. En begäran anger det som dess sökväg anger; versionsvyn anger versionen.
digestsha256:<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_kindhuman, robot (en registry-robot), job (en jobbtoken för Forgejo Actions), bot (en systembot i fremforge), system eller anonymous.
actor_login, actor_idVem registryt autentiserade.
job_repo, job_run_id, job_run_number, job_idFör en jobbtoken: repot och körningen (/<owner>/<repo>/actions/runs/<job_run_number>).
decision, reasonVid ett nekande, eller en skrivning som en spärr i observationsläge släppte igenom.
access_event_idMotsvarande 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ärdNär
package_access.settings.updatedOrganisationens standard ändrades (default_mode från och till).
package_access.package.updatedEtt pakets åtkomstinställning skapades eller ändrades (mode, inherit_repo, changed).
package_access.package.removedEtt pakets inställning och behörigheter togs bort (grants_removed).
package_access.grant.setEn behörighet för ett team eller för Actions lades till eller ändrades (grantee_kind, grantee_name, permission, previous_permission).
package_access.grant.removedEn behörighet togs bort.
package_protection.rule.created, .updated, .deletedEn regel för skyddade namn ändrades (package_type, name_pattern, push, delete).
package_access.deniedEn 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_denySamma sak, medan fremforge körde kontrollen i observationsläge och levererade svaret.

Skanning av modeller

Skanning av modeller skriver:

ÅtgärdNär
security_policy.model_scan.updatedOrganisationens modellpolicy ändrades (changed, och diff med varje inställnings from och to).
security_policy.model_scan.dismissedEtt 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_revokedEtt 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ärdNär
registry.pull.blockedEn container-pull nekades
registry.pull.would_blockEn 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ältBetydelse
gateimage_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, digestImagen, den tagg eller digest som efterfrågades och den digest som levererades
reasonVad spärren hittade, till exempel layer-infected eller image-malware
modeenforce, warn (din blockeringsåtgärd) eller shadow (observationsläge)
block_severity, finding_countBara image_scan: tröskeln och antalet öppna fynd på eller över den
window_startDen timme som händelsen avser
previous_window_start, previous_window_countDen 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ärdNär
tenant.auditor.readEn 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_refusedEn granskare skickade en begäran som skulle ändra något, och den nekades. Varje försök
tenant.auditor.read_refusedEn 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.fetchedNå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-policy med 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:

  1. Sökbar innehållsnivå — aktörsnamnet och innehållet i fields_json för varje händelse går att söka i via administrationsgränssnittet / CSV-exporten / SIEM-strömmen under lagringsfönstret nedan.
  2. 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

PlanStandardFörval som kunden kan välja
fremforge / starter90 dagar90 / 180 / 365 / 730
enterprise / enterprise_trial365 dagar90 / 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.