Paketåtkomst
Som standard når alla med paketåtkomst i din organisation varje paket i den: en medlem i ett team med skrivbehörighet till paket kan publicera till, och ta bort, vilket paket som helst i organisationen, oavsett vilket repository det hör till. Åtkomst per paket snävar in det, på samma sätt som GitHub Packages och GitLab gör.
Ingenting ändras förrän en organisationsägare slår på det, för ett paket eller för hela organisationen.
Vad åtkomst per paket gör
För ett paket med åtkomst per paket gäller:
| Vem | Får |
|---|---|
| Organisationsägare | Full åtkomst (läsa, publicera, ta bort). |
| En person eller en registerrobot | Den högsta av: personens behörighet till paketets länkade repository (läs, skriv eller admin), och behörigheten från varje teambehörighet på paketet för ett team som personen ingår i. |
| En jobbtoken i Forgejo Actions | Publicera om paketet är länkat till jobbets eget repository; annars det som en Actions-behörighet för jobbets repository ger (läs eller skriv). En körning för en pull request från en fork får bara läsa. |
| Alla andra | Inget utöver det som organisationens synlighet ger (se nedan). |
- Läs laddar ned paketet. Skriv publicerar, lägger till en fil och flyttar en tagg. Admin tar dessutom bort versioner och länkar eller avlänkar repositoryt. En registerrobot tar aldrig bort något, oavsett vilka behörigheter den har.
- Synligheten är oförändrad. I en publik organisation kan fortfarande vem som helst läsa varje paket, och i en begränsad organisation kan alla inloggade användare det. Åtkomst per paket begränsar då vem som får publicera och ta bort. I en privat organisation begränsar den även läsning.
- Den kan bara snäva in. Åtkomst per paket ger aldrig någon mer än organisationens egna paketinställningar gör. För att ett team ska kunna publicera ett paket behöver dess medlemmar skrivbehörighet till paket i organisationen (teamet Members har det), och åtkomst per paket begränsar dem sedan till det paketet. Det enda undantaget är Actions-behörigheten med skrivrätt, som låter jobben i ett annat repository publicera ett paket som är länkat någon annanstans.
- Länkat repository. Ett paket länkas till ett repository när det publiceras av ett Actions-jobb
i det repositoryt, utifrån dess metadata (npm
repository, container-etikettenorg.opencontainers.image.source) eller i paketets inställningar. Stäng av Ärv från det länkade repot för att bara förlita dig på behörigheter.
Åtkomst per paket finns för alla pakettyper som registret levererar: Alpine, ALT, Arch, Cargo, Chef, Composer, Conan, Conda, container, CRAN, Debian, generic, Go, Helm, Maven, npm, NuGet, Pub, PyPI, RPM, RubyGems, Swift och Vagrant.
Slå på det
I konsolen: Säkerhet › Åtkomst › Paketåtkomst.
- Organisationens standard: Hela organisationen (standard) eller Per paket, för varje paket av en typ som stöds och som inte har någon egen inställning.
- Konfigurera ett paket: per paket, Per paket, Hela organisationen eller Följ organisationen, och om paketet ärver från sitt länkade repository. Paketet behöver inte finnas än: en inställning som görs före den första publiceringen gäller för det.
- Lägg till en behörighet på ett konfigurerat paket: ett team (läs, skriv eller admin) eller ett repositorys Actions-jobb (läs eller skriv).
Eller med API:t, med en API-token med scopet policy:write (policy:read
för att läsa). Ett / i ett paketnamn skickas 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"Skyddade namn
En skyddsregel anger paket efter typ (eller alla typer som stöds) och ett namnmönster, och listar vem som får publicera till dem och vem som får ta bort dem: organisationsägare, registerrobotar, medlemmar i namngivna team och Actions-jobben i namngivna repositoryn. Alla andra nekas, oavsett paketets åtkomstinställning. När flera regler matchar ett paket måste alla tillåta.
I mönstret matchar * vilka tecken som helst, även /, och ? ett tecken; skiftläget spelar ingen
roll. Till exempel håller release/* med Får publicera: registerrobotar, Actions-jobb i
release-pipeline release-images förbehållna 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"Paketlistor och index
I en organisation som använder åtkomst per paket utelämnar listor och index de paket som anroparen inte kan läsa, både namnet och varje version:
- API:ts paketlista,
/api/v1/packages/<org>; - npm search, Helms
index.yaml, NuGet-sökningen (query), Composerssearch.jsonochlist.json, Cargo search, Chefssearchochuniverse, Condasrepodata.json, RubyGemsversions, CRANsPACKAGES, Conan search och Swifts uppslagidentifiers.
Registret kontrollerar listan på vägen ut, vilket normalt lägger till mindre än en tiondels sekund till de här
anropen. Om det inte kan kontrollera en lista svarar det 503 med Retry-After hellre än att visa den
ofiltrerad. Organisationer som inte använder åtkomst per paket får registrets listor oförändrade.
Hur ett nekande ser ut
Ett nekat anrop besvaras med 403 och orsaken (DENIED i container-registrets felformat),
innan något skrivs. Varje nekande finns i organisationens
granskningslogg som package_access.denied, och en nekad
publicering eller borttagning även som package.upload.refused eller package.delete.refused med orsaken
package_access:<reason>.
Som kod
Modulen för konfiguration som kod hanterar allt detta:
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änsningar
- En ändring av en inställning, en behörighet, en regel eller ett teams medlemmar slår igenom inom en minut: registret cachar sina beslut en kort stund.
- De här listorna filtreras inte: paketlistan i webbgränssnittet, signerade repository-index (Debians
Release/Packages, RPMrepodata, AlpinesAPKINDEX, Arch-databasen och ALT:s basfiler, vars signatur en omskrivning skulle bryta), komprimerade varianter (PACKAGES.gz,repodata.json.bz2, RubyGems-familjenspecs.4.8.gz), NuGets XML-flöden för v2 och containerns tagglista. De visar paketnamn och versioner för alla som kan läsa organisationens paket, men inte paketens innehåll. - En uppladdning som bara anger sitt paketnamn inuti den uppladdade filen kontrolleras mot det namnet.
Där registret inte kan läsa namnet (en Conda
.tar.bz2, ett xz-komprimerat Debian-kontrollarkiv eller ett Arch-paket) nekas uppladdningen i en organisation som använder åtkomst per paket för den typen. Använd.conda, eller komprimering med gzip eller zstd. - En yank i RubyGems måste ange gem-namnet i frågesträngen, till exempel
curl -X DELETE ".../rubygems/api/v1/gems/yank?gem_name=mygem&version=1.0.0". En yank som bara anger det i ett formulärs body nekas i en organisation som använder åtkomst per paket för RubyGems.