Hoppa till huvudinnehållet

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:

VemFår
OrganisationsägareFull åtkomst (läsa, publicera, ta bort).
En person eller en registerrobotDen 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 ActionsPublicera 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 andraInget 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-etiketten org.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), Composers search.json och list.json, Cargo search, Chefs search och universe, Condas repodata.json, RubyGems versions, CRANs PACKAGES, Conan search och Swifts uppslag identifiers.

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, RPM repodata, Alpines APKINDEX, Arch-databasen och ALT:s basfiler, vars signatur en omskrivning skulle bryta), komprimerade varianter (PACKAGES.gz, repodata.json.bz2, RubyGems-familjen specs.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.