Registrets adgangslog
Revisionsloggen registrerer administrative handlinger.
Registrets adgangslog registrerer noget andet: hver forespørgsel, en klient
sender til din organisations pakke- og container-register. Det dækker hver
download, hver læsning af metadata (et npm-packument, et PyPI simple index, en
Maven maven-metadata.xml), hver upload og hver sletning, og det omfatter
forespørgsler, som en politik blokerede. Intet udvælges stikprøvevis, med to
undtagelser for rutinemæssig CI-trafik gennem
afhængighedsproxyen. Begge gælder kun en
forespørgsel, som et Forgejo Actions-job har sendt, og som proxyen tillod og
besvarede uden fejl:
- CI-læsninger af metadata registreres ikke (siden 12. oktober 2026). Et
pakkeindeks eller en versionsliste (et npm-packument, et PyPI simple index,
en Maven
maven-metadata.xml), som et job læser, gemmes ikke. Én pakkeinstallation giver hundredvis af den slags læsninger, og de fortæller intet, som downloaden bagefter ikke gør. - CI-downloads leveret fra proxyens cache tælles i stedet for at blive logget enkeltvis (siden 13. oktober 2026). Når et job henter en pakkefil, som proxyen allerede har, lægges downloaden til pull-optællingen i stedet for at blive gemt som en hændelse: én optælling pr. UTC-døgn, pakkeversion og repository med id’erne på de Actions-kørsler, der hentede den. Du kan altså stadig se, hvilken version af hvilken pakke der kom ind i hvilket build, pr. kørsel, ud fra optællingen.
Alt andet er stadig én hændelse, også CI:
- hver download, som proxyen hentede fra upstream-registret (et cache-miss), og hver download fra dit eget register
- hver forespørgsel, som en politik afviste, blokerede eller ville have blokeret
- hver forespørgsel, der fejlede (en status på 400 eller derover)
- hver forespørgsel fra en person, en bot, en registry-robot eller anonymt, inklusive læsninger af metadata og cache-hits
En CI-download, der tælles i optællingen, bevarer pakken, versionen, dagen,
repositoryet og kørslen samt antallet af hentninger. Den bevarer ikke det
øvrige, en hændelse indeholder: filnavnet, størrelsen, det præcise tidspunkt for
hver hentning (optællingen har dagens første og sidste), klientadressen,
user agent og request-id. Den leveres ikke til et SIEM-endpoint og er ikke i
access-log.ndjson; den findes i optællingens API og i
metadata/pulled-versions.ndjson i dataeksporten. Hændelser, der blev gemt før
disse datoer, bevares i deres normale opbevaringsperiode.
Hvad en hændelse indeholder
| Felt | Betydning |
|---|---|
occurred_at | Hvornår fremforge besvarede forespørgslen (UTC). |
origin | Hvilken komponent der så forespørgslen: registry for pakkeregistret. Afhængighedsproxyen skriver proxy. |
surface | api (/api/packages/…), oci (/v2/…, container-registret) eller web (en fil hentet fra webbrugerfladen). |
org, package.type, package.name, package.version, package.file | Hvad der blev bedt om. |
repo | For en forespørgsel sendt med et Forgejo Actions-jobtoken: jobbets repository, <owner>/<repo>. Ellers tom. |
actions | For en forespørgsel sendt med et Forgejo Actions-jobtoken: den kørsel, den kom fra, {repo_id, run_id, run_number, job_id}. run_number er kørslens side, /<owner>/<repo>/actions/runs/<run_number>; run_id er GITHUB_RUN_ID. null for alle andre forespørgsler og for forespørgsler registreret før 8. oktober 2026. |
package.digest | sha256:<hex> for den fil eller det manifest, der blev leveret eller gemt, når registret navngav det. |
action | download, metadata, upload, delete eller other. |
actor | Hvem registret godkendte: {type: "user" | "bot" | "anonymous", id, login}. Et token eller en session føres tilbage til den bruger, det tilhører, og Forgejo Actions-jobs vises som en bot. |
client_ip | Klientens adresse, som fremforges edge så den. Den er tom, når fremforge ikke kunne verificere adressen, for eksempel ved en forespørgsel, der ikke kom gennem edge. |
user_agent | Klientens User-Agent, afkortet ved 256 tegn. |
http.method, http.status, http.bytes | Forespørgslens metode, svaret og størrelsen, hvor den kendes. Størrelsen er ukendt for en download, der omdirigeres til objektlager. En HEAD-forespørgsel vises som GET, fordi CDN’et videresender HEAD-forespørgsler til registret som GET. |
decision, decision_reason | allowed; blocked; would_block (en politik i skyggetilstand eller din blokeringshandling warn for image-scanning ville have afvist den, og forespørgslen gik igennem); eller pending_refused (din pakkepolitik afviser filer, hvis scanning ikke er færdig endnu, og denne fils var ikke; klienten fik 503 med Retry-After, og et nyt forsøg lykkes, når scanningen er færdig). decision_reason navngiver den regel, der afgjorde det, for eksempel malware, image_malware, image_cve, registry_scan:<reason> eller immutable_retired (se uforanderlige pakkeversioner). |
Registreres aldrig: et adgangstoken, en Authorization-header, en cookie
eller en query string. En forhåndssigneret lager-URL, for eksempel, optræder
aldrig i en hændelse.
Sådan læser du den
Med et token, der har audit:read:
curl -sS -H "Authorization: Bearer $FFP_TOKEN" \
"https://frem.sh/_app/api/v1/orgs/acme/access-log?action=download&type=npm&since=2026-10-01"Resultaterne kommer med de nyeste først. Send en sides next-værdi som cursor
for at få næste side, og stop, når next er null. Cursoren er et keyset, så
hændelser, der ankommer, mens du bladrer, aldrig forskyder eller gentager en
række. Filtre: since, until, origin, action, decision, type, name,
version, actor (et login eller anonymous) og ip. En side indeholder op
til 500 hændelser. Se API-referencen for den fulde form.
Hvilke sårbare versioner der hentes
Pull-optællingen tæller de vellykkede downloads i
denne log pr. pakkeversion og forbruger, sammen med de CI-cache-hits, der tælles
dér i stedet for at blive logget, og kobler dem til de advisories, din
pakkepolitik bruger. Den besvarer “hvilke sårbare versioner blev hentet inden
for de seneste 30 dage, og af hvem” uden at bladre gennem de rå hændelser, og
run_id besvarer “hvilke versioner hentede dette build”.
Videresend den til dit SIEM
Adgangshændelser kan leveres til et SIEM-endpoint i
samme signerede envelope som revisionshændelser. Handlingen er
registry.access.<action> (for eksempel registry.access.download), og
hash_chain er null, fordi adgangshændelser ikke indgår i revisionsloggens
hashkæde. Levering er slået fra som standard, fordi download-trafik er langt
større end revisionstrafik. Slå den til pr. endpoint med include_access_log:
curl -sS -X PATCH -H "Authorization: Bearer $FFP_TOKEN" -H 'Content-Type: application/json' \
-d '{"include_access_log": true}' \
https://frem.sh/_app/api/v1/orgs/acme/siem/endpoints/$ENDPOINT_IDEt endpoints handlingspræfikser gælder også for adgangshændelser. For
eksempel videresender registry.access.upload kun uploads. Den CI-trafik, der
ikke gemmes som hændelser (se ovenfor), leveres heller ikke.
I dataeksporten
En dataeksport indeholder access-log.ndjson med alle
de adgangshændelser, fremforge stadig har for organisationen, ét JSON-objekt pr.
linje i samme form, som API’et returnerer, og metadata/pulled-versions.ndjson
med pull-optællingen, hvor CI-cache-hits tælles. Begge filer er dækket af
eksportens signerede manifest.
Hvor længe den opbevares
Adgangshændelser opbevares i din organisations access_log-periode for
opbevaring af beviser: 30 til 730 dage. Er
den ikke sat, følger den opbevaringen af revisionsloggen (90, 180, 365 eller
730 dage, sat under Godkendelsespolitik → Opbevaring af revisionslog; standard
90). Ældre hændelser slettes én gang i døgnet. Så længe der er et legal hold,
slettes intet.
Hvem der kan se adresserne
Adgangsloggen indeholder personoplysninger: dine brugeres logins og IP-adresser. API’et, SIEM-leveringen og eksporten viser begge, som de er registreret, fordi det er din organisations egen registrering. fremforges interne værktøjer for medarbejdere ser kun begge som nøglebaserede pseudonymer. De loglinjer, platformen skriver til sin egen drift, indeholder ingen af dem.
Begrænsninger
- Git clone og fetch samt læsninger via REST API’et (
/api/v1) er ikke forespørgsler til registret og er endnu ikke med i denne log. - Sletning af en pakkeversion via REST API’et
(
DELETE /api/v1/packages/...) eller webbrugerfladen registreres ikke her. De sletninger, en registerklient foretager under/api/packages, registreres. - En forespørgsel, som platformen afviste, før registret svarede, for eksempel
en upload afvist af malware-scanneren, har ingen godkendt aktør og vises som
anonymous. - Levering fra registret til loggen sker i batches hvert 2. sekund eller for hver 500 hændelser. Hvis platformen genstartes midt i en batch, kan hændelserne fra de sidste par sekunder gå tabt. Bevidste frasorteringer logges, og vi får en alarm om dem.