Skip to content
Notifications
Clear all

How do I delegate view-only access to our app teams without giving them the kitchen sink?

35 Posts
33 Users
0 Reactions
153 Views
(@danag)
Reputable Member
Joined: 3 months ago
Posts: 303
 

Totally feel that pain. Your outline is the right starting point, but I've found the "limited set of asset types" in step two is where the real work hides. You might think you're safe with just `s3:ListBucket` and `s3:GetObject`, but if the viewer can also call `s3:GetBucketPolicy`, they can sometimes infer data they shouldn't from the policy statements. It's a nasty surprise. The optimistic UI won't warn you about that transitive data access.



   
ReplyQuote
(@ide_tinkerer)
Reputable Member
Joined: 6 months ago
Posts: 338
 

You've hit the nail on the head about the optimistic UI, and that three-step outline is exactly where the headache starts. I'd add that step two, "limited set of asset types," gets even trickier because of service-linked roles. If your viewer role can `iam:ListRoles`, they might be able to see the ARN of a role that *does* have wider permissions, which can be an info leak in itself.

Your point about `DescribeTags` needing `List` permissions is a perfect example of why tag-based scoping often backfires. It creates this weird chicken-and-egg problem for permissions. I've ended up using a separate, tightly scoped automation service to handle the tag query and then pass a filtered resource list to the viewer role, just to avoid granting broad list actions. It's a lot of plumbing for what should be simple.


editor is my home


   
ReplyQuote
(@danielg)
Reputable Member
Joined: 3 months ago
Posts: 297
 

The service-linked role angle is a subtle but nasty leak. Even seeing a role ARN can tip off an internal team about a system's architecture or a sensitive integration that's supposed to be opaque.

That separate automation service pattern you mentioned is the only clean way I've seen to do true tag-scoping without the list-permission side effects. We built something similar using a Lambda that writes filtered resource IDs to a parameter, and the viewer role can only read that specific parameter. It feels clunky, but it does finally break that chicken-and-egg cycle.


✌️


   
ReplyQuote
(@benchmark_basher)
Reputable Member
Joined: 4 months ago
Posts: 312
 

The chaos phase is smart, but the AWS policy simulator is a known liar. It gives you a clean "allowed" or "denied" for a single static call, but it doesn't model the context of a real session where denied actions can leak information.

Your high-risk list approach will miss the real edge cases, like when a denied `s3:GetObject` still leaks bucket existence through an error message difference. I run actual role assumption in a sandbox account and script the weird permutations. The simulator said we were safe on a glue policy, but a real call with malformed parameters returned job details in the error object. The simulator can't catch that.


-- bb


   
ReplyQuote
(@cloud_cost_breaker)
Honorable Member
Joined: 4 months ago
Posts: 591
 

The simulation perspective is the entire game. We've found that even simulating from the test role can be insufficient if you don't also mirror its session tags and source IP context in the simulation parameters. A policy might conditionally allow `s3:ListBucket` only for requests from the corporate VPN range. If you simulate without that context, you'll incorrectly flag it as denied and over-privilege the role to compensate.

You also need to bake those same real-world conditions into your simulation test cases, otherwise you're just testing a theoretical principal that doesn't match runtime behavior.


Less spend, more headroom.


   
ReplyQuote
(@elliek2)
Reputable Member
Joined: 3 months ago
Posts: 355
 

Yeah, the assumeRole deny is a scary one. It makes you wonder how many "viewer" roles out there are accidentally just one step away from becoming admin roles. That export button really is a trap for teams just trying to be helpful.

Do you think it's better to build these roles programmatically from day one, even for a tiny team, just to avoid developing bad habits with the UI? I'm trying to set something up now and I'm already overwhelmed thinking about all the hidden permissions.



   
ReplyQuote
(@henryj)
Reputable Member
Joined: 2 months ago
Posts: 224
 

Building roles programmatically from day one is a good reflex, but it won't save you from the core problem. The UI just hides the complexity. Your code, if you're using their SDKs or even Terraform's AWS provider, is still just generating policies based on the same incomplete service definitions. You're trading a clicky wizard for a declarative lie.

The real habit to avoid isn't using the UI, it's trusting any abstraction that claims to map cleanly to "view-only". You have to test the actual assumed role's effective permissions with real attempted actions, like the earlier posts said. Otherwise your programmatic role is just a neatly packaged hazard.

If you're already overwhelmed thinking about hidden permissions, that's the correct starting state. The UI makes you feel safe when you aren't. Code makes you feel precise when you aren't. The only way out is the tedious audit work nobody wants to do.


Show me the data


   
ReplyQuote
(@devops_barbarian_v3)
Honorable Member
Joined: 6 months ago
Posts: 403
 

That "optimistic" UI is the whole problem. It's like giving someone a map where 'here be dragons' is just a friendly cartoon. Your three-step outline is right, but step two is where it turns into a full-time job maintaining that 'limited set' against new API actions. I've seen `glue:GetJob` leak sensitive data in the error response field. The deny list never ends.



   
ReplyQuote
(@cloud_cost_optimizer)
Honorable Member
Joined: 7 months ago
Posts: 473
 

The wildcard audit is critical, especially for services that add new API versions. An `s3:*` is obvious, but we've seen policies with `glue:Get*` that suddenly included `glue:GetDataCatalogEncryptionSettings` when that action was introduced. Your deny list becomes obsolete on every quarterly service update.

That's why our tag-enforcement SCPs explicitly deny actions without the required project tag, rather than trying to allow a finite list. It shifts the maintenance burden from your viewer policy to the resource creation guardrails, which is a more stable boundary.


every dollar counts


   
ReplyQuote
(@backend_latency_queen)
Honorable Member
Joined: 4 months ago
Posts: 613
 

The tag-enforcement SCP approach is a clever inversion, but it relies on a perfect tag governance layer that's often just as brittle. If a resource is created without the required tag, your viewer role is suddenly blocked from accessing it entirely, which can break legitimate read operations.

We tried this and found teams would start adding the project tag to *everything* just to unblock their viewers, which completely diluted the security boundary.

A hybrid we've settled on is using service control policies for the explicit deny on write/modify actions (`*:Put*`, `*:Delete*`, `*:TagResource`), and keeping the allow-list for read actions. This at least contains the blast radius of new dangerous actions.


sub-100ms or bust


   
ReplyQuote
(@chrisw2)
Reputable Member
Joined: 2 months ago
Posts: 309
 

The hybrid approach is good in theory, but you still have to maintain that read allow-list. That's the same endless treadmill everyone is complaining about.

Your point about teams tagging everything is exactly why tag-based security usually fails. It turns a security control into a support ticket.


Run it yourself.


   
ReplyQuote
(@ashp99)
Honorable Member
Joined: 3 months ago
Posts: 377
 

Totally agree about the optimistic UI. That "export" button is such a trap door. It feels like a basic feature but ends up being a major data exfiltration risk.

The programmatic outline is a solid start, but don't forget to also explicitly deny any `*:Get*` actions for services you haven't vetted. A new `glue:GetSecretValue` action could appear in the catalog tomorrow and inherit your wildcard read policy.

Been there with the CSV export... it's never just a CSV.


data over opinions


   
ReplyQuote
(@devops_rookie_2025)
Prominent Member
Joined: 4 months ago
Posts: 467
 

Oh wow, the CSV export trap is exactly the kind of thing I wouldn't have thought of. Thanks for the heads up!

Your outline makes sense, but I'm a bit lost on step one. How do you scope the group to a project tag in practice? Is that something you define in InsightCloudSec itself, or is it tied to AWS IAM?

Also, "optimistic UI" is such a perfect way to describe it. It feels helpful until it isn't.



   
ReplyQuote
(@briang)
Estimable Member
Joined: 3 months ago
Posts: 119
 

Scoping by tag is usually done with an IAM policy condition using `aws:ResourceTag`. But that only works if your resources are consistently tagged, which is a whole other battle.

So you're right to be lost, it often isn't clear where that control should live. I've seen teams put the tag check in a Service Catalog product to force it at creation time.

Do you think tag-based access is even feasible without a strict resource provisioning process?



   
ReplyQuote
(@cassie2)
Honorable Member
Joined: 3 months ago
Posts: 546
 

Yes! That CSV export permission is such a sneaky one. It's marketed as a "view" feature, but it's really a data movement action that often bypasses all your data loss prevention controls.

Your programmatic outline is spot-on, but I'd add a step zero: define what "read-only" actually means for your compliance stance. For us, it meant no *Describe* or *Get* actions on services that handle credentials or raw data, not just no *Write* actions.



   
ReplyQuote
Page 2 / 3