Bearer token in request classification #18
Labels
No labels
P0
P1
P2
P3
good first issue
triage
Infrastructure
blocked
bug
config
discussion
documentation
duplicate
enhancement
go
help wanted
internal
invalid
kludge
observability
perfomance
question
refactoring
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: TrueCloudLab/frostfs-api#18
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Description
FrostFS service applications are middleware between users and native FrostFS protocol. All FrostFS requests are signed with the key. Service applications do not have access to user's keys, so they use configured keys (middleware keys) to sign requests.
In general, public key is used to identify request sender (owner) to apply access control rules. FrostFS supports token mechanism to allow access to the requests signed by middleware keys: bearer tokens and session tokens.
In the request handler, storage node fetches public key and compares it with container owner, alphabet or container nodes. Here is the simplified scheme of fetch function from v0.32.0 release: RequestOwner().
There are two cases where token scheme is not applicable.
1. Service application requires access to a private container on behalf of the user
WebUI + REST gateway should provide UX similar to CLI. To access private container, REST Gateway's request should be considered as user's request. The only way to impersonate user is to use session token signed by user's key.
However, session token can't be reused for different requests: object context requires verb and object address.
Session token is a nice solution for peer-to-peer communication, when application uses private key to resign session token for every request. It is not applicable for service application, because token usually is signed once in a while:
2. User grants access to the container, which is accessed through gateway
S3 gateway user wants to provide object access for specific user. To do that, container's extended ACL is modified to grant access for user's public key.
When S3 gateway sends request on behalf of granted user, access control record can't be matched, because S3 signed request with middleware key.
Session token is a nice solution for peer-to-peer communication, when client uses private key to resign session token for evert request.
It is not applicable for service application, because token usually is signed once for a while:
- signing every FrostFS request might be very bad UX (e.g. with Wallet Connect),
- session token is not transitive, so the client has to create session with unknown FrostFS Node, instead of the known gateway.
Service applications usually work with bearer tokens, while session is established between gateway and the node.
Private container denies bearer tokens. So service application have to create public containers with restricted extended ACL to imitate private container.
Proposal
To solve this issue, modify bearer token processing behaviour. Provide impersonate flag in the token body.
On false (default), behaviour is the same.
On true:
When token allows impersonating, there is no meaning in replacing container extended ACL table with token extended ACL table. Node should behave as the request was originally signed by token owner. Then S3 Gateway users will be able to provide object access to specific users.
Tree service
Changes above are applied for object service. However, tree service is also affected by this change.
On false (default), behaviour is the same.
On true:
(3) looks very important here. Now S3 Gateway accesses user bucket by attaching bearer token. To access other user buckets it does not attach bearer token, because token issuer is always going to be different from container owner.
To grant access to the container, S3 gateway will specify public key of the user in container extended ACL. To match this rule, S3 gateway has to attach bearer token with impersonate flag. So token issuer check should gone in this case. It makes sense, because impersonate flag can be treated as if "there is no bearer tokens at all, request is signed on behalf of token issuer".
🟢 It is backward compatible
🔴 Classification becomes less clear
It's more like v2.16, in my opinion. v2.15 should be closed because there is neofs-api-go v2.15 which is related to some commit from master branch already.
/cc @fyrchik @realloc
dkirillov referenced this issue2023-04-13 07:38:31 +00:00