Skip to content

[v14] fix!: respect deny rules for access requests#34600

Merged
nklaassen merged 2 commits intobranch/v14from
bot/backport-34438-branch/v14
Nov 15, 2023
Merged

[v14] fix!: respect deny rules for access requests#34600
nklaassen merged 2 commits intobranch/v14from
bot/backport-34438-branch/v14

Conversation

@nklaassen
Copy link
Copy Markdown
Contributor

Backport #34438 to branch/v14

Access Request follow their own set of RBAC rules.
Usually, none of the typical create/read/list/delete verbs are required
in any user's roles.
Access is handled via custom rules based on the allow.request, deny.request,
allow.review_requests, and deny.review_requests role fields.

The create/read/list/delete verbs commonly used for other resources are
usually all or nothing (barring `where` expressions), but a more nuanced
set of rules apply to access requests. E.g. users should always be
allowed to see access requests that they created or are allowed to
review, without being allowed to see other access requests in the
cluster.

This seemed mostly logical once you thought about it long enough, but
one detail that has been lacking so far is that explicit deny rules in
the user's roles have no effect at all, even though explicit allow rules
grant god-mode access to create or view any access requests in the
cluster.

Even with the following role, you could still create and view
access requests:

```yaml
kind: role
version: v6
metadata:
  name: example
spec:
  allow:
    request:
      roles: ["*"]
    review_requests:
      roles: ["*"]
  deny:
    rules:
      - resources: ["access_request"]
        verbs: ["create", "read", "list"]
```

This commit makes any explicit deny rules actually take effect.

Fixes gravitational/customer-sensitive-requests#103

changelog: Respect explicit deny rules for Access Requests.
Comment thread lib/services/role.go
// an AccessExplicitlyDenied error.
func IsAccessExplicitlyDenied(err error) bool {
var target *accessExplicitlyDenied
return errors.As(err, &target)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we only need a book and don't care about the actual target error, can we use errors.Is instead?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that would get the semantics wrong. I want to match any AccessExplicitlyDenied error regardless of the underlying/inner error, but errors.Is tests for equality with a specific value. Of course, I could make it work by implementing an Is method, but I think having to do that kind of shows that you're doing something non-standard.

@nklaassen nklaassen enabled auto-merge November 15, 2023 18:36
@nklaassen nklaassen added this pull request to the merge queue Nov 15, 2023
Merged via the queue into branch/v14 with commit c8f7932 Nov 15, 2023
@nklaassen nklaassen deleted the bot/backport-34438-branch/v14 branch November 15, 2023 18:55
This was referenced Nov 15, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants