Pakkeadgang
Som standard når alle med pakkeadgang i din organisation alle dens pakker: et medlem af et team med skriveadgang til pakker kan udgive til og slette enhver pakke i organisationen, uanset hvilket repository den hører til. Adgang pr. pakke indsnævrer det, sådan som GitHub Packages og GitLab gør det.
Intet ændrer sig, før en ejer af organisationen slår det til, for én pakke eller for hele organisationen.
Hvad adgang pr. pakke gør
For en pakke med adgang pr. pakke gælder:
| Hvem | Får |
|---|---|
| Organisationens ejere | Fuld adgang (læse, udgive, slette). |
| En person eller en registry-robot | Den højeste af: deres rettighed på pakkens tilknyttede repository (læse, skrive eller administrator) og rettigheden fra hver teamtildeling på pakken for et team, de er med i. |
| Et jobtoken fra Forgejo Actions | Udgive, hvis pakken er knyttet til jobbets eget repository; ellers det, en Actions-tildeling til jobbets repository giver (læse eller skrive). En kørsel for en pull request fra en fork læser altid kun. |
| Alle andre | Intet ud over det, organisationens synlighed giver (se nedenfor). |
- Læse henter pakken. Skrive udgiver, tilføjer en fil og flytter et tag. Administrator sletter desuden versioner og knytter repositoriet til eller fra. En registry-robot sletter aldrig, uanset dens tildelinger.
- Synligheden er uændret. I en offentlig organisation kan alle stadig læse alle pakker, og i en begrænset organisation kan enhver bruger, der er logget ind. Adgang pr. pakke begrænser så, hvem der må udgive og slette. I en privat organisation begrænser den også læsning.
- Den kan kun indsnævre. Adgang pr. pakke giver aldrig nogen mere end organisationens egne pakkeindstillinger. Skal et team kunne udgive én pakke, skal dets medlemmer have skriveadgang til pakker i organisationen (teamet Members har det), og adgang pr. pakke holder dem så til den pakke. Den eneste undtagelse er Actions-tildelingen med skriveadgang, som lader et andet repositorys jobs udgive en pakke, der er knyttet et andet sted.
- Tilknyttet repository. En pakke er knyttet til et repository, når den udgives af et
Actions-job i det repository, ud fra dens metadata (npm
repository, container-labelenorg.opencontainers.image.source) eller i pakkens indstillinger. Slå Arv fra det tilknyttede repository fra for kun at bruge tildelinger.
Adgang pr. pakke findes for alle pakketyper, registret udleverer: Alpine, ALT, Arch, Cargo, Chef, Composer, Conan, Conda, container, CRAN, Debian, generic, Go, Helm, Maven, npm, NuGet, Pub, PyPI, RPM, RubyGems, Swift og Vagrant.
Slå det til
I konsollen: Sikkerhed › Adgang › Pakkeadgang.
- Organisationens standard: Hele organisationen (standard) eller Pr. pakke for alle pakker af en understøttet type, der ikke har deres egen indstilling.
- Konfigurer en pakke: pr. pakke Pr. pakke, Hele organisationen eller Følg organisationen, og om den arver fra sit tilknyttede repository. Pakken behøver ikke at findes endnu: en indstilling fra før første udgivelse gælder for den.
- Tilføj en tildeling på en konfigureret pakke: et team (læse, skrive eller administrator) eller et repositorys Actions-jobs (læse eller skrive).
Eller med API’et med et API-token med scopet policy:write (policy:read for
at læse). En / i et pakkenavn sendes som %2F:
API=https://frem.sh/_app/api/v1/orgs/acme
curl -X PUT -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"mode":"granular","inherit_repo":true}' "$API/packages/container/team%2Fapp/access"
curl -X PUT -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"permission":"write"}' "$API/packages/container/team%2Fapp/access/teams/release-managers"
curl -X PUT -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"permission":"write"}' "$API/packages/container/team%2Fapp/access/actions/release-pipeline"Beskyttede navne
En beskyttelsesregel angiver pakker ud fra type (eller alle understøttede typer) og et navnemønster og lister, hvem der må udgive til dem, og hvem der må slette dem: organisationens ejere, registry-robotter, medlemmer af navngivne teams og Actions-jobs fra navngivne repositories. Alle andre afvises, uanset pakkens adgangsindstilling. Når flere regler matcher en pakke, skal de alle tillade det.
I mønstret matcher * alle tegn, også /, og ? ét tegn; store og små bogstaver er ligegyldige.
For eksempel holder release/* med Må udgive: registry-robotter, Actions-jobs fra
release-pipeline release-images forbeholdt CI.
curl -X POST -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"type":"container","name_pattern":"release/*","push":{"owners":false,"robots":true,"actions":["release-pipeline"]},"delete":{"owners":true}}' \
"$API/packages/protection-rules"Pakkelister og indekser
I en organisation, der bruger adgang pr. pakke, udelader lister og indekser de pakker, kalderen ikke kan læse, både navnet og alle versioner:
- API’ets pakkeliste,
/api/v1/packages/<org>; - npm-søgning, Helms
index.yaml, NuGet-søgningen (query), Composerssearch.jsonoglist.json, Cargo-søgning, Chefssearchoguniverse, Condasrepodata.json, RubyGems'versions, CRANsPACKAGES, Conan-søgning og Swiftsidentifiers-opslag.
Registret tjekker listen på vej ud, hvilket typisk lægger under en tiendedel af et sekund til disse
forespørgsler. Kan det ikke tjekke en liste, svarer det 503 med Retry-After i stedet for at vise
den ufiltreret. Organisationer, der ikke bruger adgang pr. pakke, får registrets lister uændret.
Sådan ser en afvisning ud
En afvist forespørgsel svarer 403 med årsagen (DENIED i container-registrets fejlformat), før
noget bliver skrevet. Hver afvisning står i organisationens
revisionslog som package_access.denied, og en afvist
udgivelse eller sletning også som package.upload.refused eller package.delete.refused med
årsagen package_access:<reason>.
Som kode
Modulet til konfiguration som kode styrer det hele:
module "org" {
source = "./modules/fremforge-org"
org = "acme"
package_access_default = "legacy"
packages = {
"container/team/app" = {
mode = "granular"
teams = { release-managers = "admin" }
actions = { release-pipeline = "write" }
}
}
package_protection_rules = {
releases = { type = "container", name_pattern = "release/*", push = { owners = false, robots = true } }
}
}Begrænsninger
- En ændring af en indstilling, en tildeling, en regel eller et teams medlemmer gælder inden for et minut: registret cacher sine afgørelser kortvarigt.
- Disse lister filtreres ikke: pakkelisten i webbrugerfladen, signerede repository-indekser
(Debians
Release/Packages, RPMrepodata, AlpineAPKINDEX, Arch-databasen og ALT-basefilerne, hvis signatur en omskrivning ville bryde), komprimerede varianter (PACKAGES.gz,repodata.json.bz2, RubyGems’specs.4.8.gz-familie), NuGets v2-XML-feeds og container-tag-listen. De viser pakkenavne og versioner for alle, der kan læse organisationens pakker, men ikke pakkernes indhold. - En upload, der kun nævner sin pakke inde i den uploadede fil, tjekkes mod det navn. Hvor
registret ikke kan læse navnet (en Conda-
.tar.bz2, et xz-komprimeret Debian-kontrolarkiv eller en Arch-pakke), afvises uploaden i en organisation, der bruger adgang pr. pakke for den type. Brug.condaeller gzip- eller zstd-komprimering. - En RubyGems-yank skal nævne gem’en i query-strengen, for eksempel
curl -X DELETE ".../rubygems/api/v1/gems/yank?gem_name=mygem&version=1.0.0". En yank, der kun nævner den i en formular-body, afvises i en organisation, der bruger adgang pr. pakke for RubyGems.