Repository navigation
docs(partner-integrations): fix access control and add permission recipes - #563
Open
adilansari wants to merge 3 commits into
Open
adilansari wants to merge 3 commits into
adilansari wants to merge 3 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…ipes Audit the partner Access Control page against the gateway code and fix the claims that were wrong: the create-key path, what user_role gates, and the claim that IAM policies can restrict a bucket role. Document that the provisioned key owns its bucket, the order Tigris uses to evaluate a request, and recipes for common partner permission setups. Also fix the provision response example and add common partner questions to the architecture page, and correct the soft delete page: soft-deleted buckets are not purged when retention ends, and retention changes apply to objects that are already soft-deleted.
… recipe user_role limits bucket roles and key ownership, not IAM policies. A Member call can create a policy for any bucket and attach it to any key in the org, so the Member row no longer says that it can update only its own keys. Add a recipe to move users off the provisioned key. Rotating the key is not enough, because keys that the user created with it keep working. Also: - Provision creates a new owner key on each call. Say that the backend can delete it and keep managing the bucket with the Partner API. - Soft delete does not stop owner, Editor, or admin keys. They can turn it off or purge a soft-deleted bucket over S3. - Role and scope changes can take up to 15 minutes, like rotate and delete. - Turning off soft delete does not remove objects in the next cleanup. Say that Tigris can remove them later.
adilansari
force-pushed
the
docs/partner-access-control
branch
from
October 9, 2026 21:24
f205d0e to
2d6bb94
Compare
adilansari
marked this pull request as ready for review
October 9, 2026 22:38
Contributor
|
The soft delete page still said in three places that a deleted bucket is removed after the retention window. Split the lifecycle diagram into object and bucket flows, say that retention applies only to objects, and remove the retention claim from the delete dialog description. Put the "turn off soft delete" risk and the org admin key warning in warning callouts, and remove the Member note that repeats the recipe intro.
Contributor
Author
|
@greptile review |
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Railway lost production buckets last week. Their users deleted them over S3 with the key that
/provisionreturns. When they asked how to stop that, our Access Control page pointed the wrong way. It said IAM policies "further restrict what a role allows", so aDeny s3:DeleteBucketlooked like the fix. It isn't. The provisioned key is the bucket owner, and owner and role allows return before policies are read.RunPod asked for the same model in August (users get read/write on one bucket, no bucket admin). The
ReadWriterole shipped right after (tigris-os#5097), but the docs never showed partners how to use it.So I audited the page claim by claim against tigris-os
origin/main, fixed what was wrong, and added recipes for the setups partners keep asking about.What was wrong
POST .../access-keysPOST .../key(api/extensions/v1/api.yaml)user_role: Adminupdates org settings, invites usersuser_roleis the caller identity for one call, not stored on the key. It gates other users' keys and which bucket roles the call can grant. UpdateOrganization isn't gated, and there is no invite API (gateway/extensions/controller.go,iamapi_management_handlers.go:1641)Membercall can only grant roles on buckets thatuser_idprovisioned, otherwise 403 (iamapi_management_handlers.go:1666-1740)*/Admin and role allows return first. A Deny only beats a policy Allow or default-allow (auth_credentials.go:987-1104vs:2204)*grants all bucketscontroller.go:177-188,auth_credentials.go:999)bucket,org_id(architecture page)bucket_name,access_key_id,secret_access_key(gateway/handlers/extensions.go:506)scanAllBucketsskips them (server/services/v1/worker.go:606)tombstone_cleanup_task.go:722)The diagram labels are fixed to match.
What's new
user_idto use,org_idscope, global bucket names, and billing units.Left out on purpose
auth_credentials.go:1432), so one allowed prefix list can unlock a full-bucket list for 15 minutes. That needs a fix before we document it.aws:SourceIpsees internal LB addresses in some regions (audit logs show10.xpeers in FRA and NRT), so the recipe would lock users out.Note
Low Risk
Documentation-only changes; no runtime behavior. Incorrect prior guidance could have led partners to unsafe key handling, so accuracy matters for integrators.
Overview
Partner integrations docs are corrected to match actual auth behavior and add practical setup guidance.
user_roleis documented as per Partner API call (not stored on keys); the create-key path isPOST .../key; the provisioned key is the bucket owner (roles/policies cannot limit it); and S3 authorization order is spelled out so IAMDenycannot override owner,*Admin, or bucket-role allows.New content includes permission recipes (ReadWrite without bucket admin, rotating off the provisioned key, upload-only via policy, soft delete, backend-managed bucket settings) and architecture Common Questions (
user_id, global bucket names, billing units). The access-control diagram labels are updated to match.Soft delete docs are fixed: the retention window applies only to objects, not soft-deleted buckets (they remain until restore or explicit purge). Object vs bucket lifecycles are split in the diagram; notes now say changing retention affects existing tombstones and turning soft delete off can purge recoverable objects.
Reviewed by Cursor Bugbot for commit 40600cb. Bugbot is set up for automated code reviews on this repo. Configure here.