Read-only access sounds safe because nobody can change a record.
That is a very convenient story. It is also incomplete.
In a lot of SaaS and internal product environments, read-only means a person can see customer records, employee records, support history, invoices, security events, health data, contracts, implementation notes, internal comments, model outputs, or operational telemetry. They cannot edit the field. Fine. They can still learn the value.
Security teams often spend more energy arguing about write permissions than view permissions. That is understandable. Write access can break production. It can create fraudulent transactions, bad entitlements, deleted data, and configuration drift.
But read access can still create privacy exposure, insider risk, competitive leakage, investigation sensitivity, and regulatory pain. The tradeoff is not read versus write. The tradeoff is useful visibility versus uncontrolled knowledge.
Read-only is a permission to know
The phrase read-only hides the thing being granted.
A role does not merely grant read access to an application. It grants knowledge of specific people, accounts, transactions, conditions, disputes, pricing, risk decisions, internal notes, and operational history. That knowledge may be exactly what someone needs to do the job. It may also be far more than they need.
A finance analyst may need invoice totals and payment status, not support transcripts. A support lead may need troubleshooting context, not contract negotiations. A trust operations reviewer may need policy signals, not full billing history. A customer success manager may need account health, not authentication logs.
The mistake is bundling all of that into one comfortable viewer role because nobody wants to manage nuance.
This is how power user roles become dumping grounds. The same pattern shows up in SaaS admin models, where convenience bundles slowly become operating roles without clear accountability. See SaaS admin roles fail when power user becomes a dumping ground for the access version of the same problem.
The risk is reach, not just editing
A read-only role should be assessed by reach.
What objects can the user see? Which tenants, regions, departments, or customer segments? Which fields? Which historical records? Which notes? Which attachments? Which derived insights? Which logs? Which search results?
Most access reviews do not ask this clearly enough. They ask whether the person still needs the role. The manager sees read-only and approves it because it feels safe. The review passes. The exposure remains.
Better review questions sound more operational:
- What job decision does this role support?
- Which data classes are visible through it?
- Can the user search across all tenants or only assigned accounts?
- Are sensitive fields masked by default?
- Can results be exported, copied, printed, screenshotted, or forwarded through integrations?
- Does access expire when the project, ticket, investigation, or rotation ends?
- Who would notice if the role was used oddly?
That last question matters. A read-only role with broad search and weak evidence is not harmless. It is quiet.
Exports change the role
A viewer role becomes something else when it can export.
Inside the application, the data may be surrounded by session controls, access logs, field masking, tenant scope, and user identity. The moment the same data becomes a CSV, spreadsheet, PDF, email attachment, BI extract, or downstream sync, those controls usually weaken.
This is where organizations fool themselves. They classify the role as read-only, then allow bulk export because the user cannot edit production. But exporting thousands of records is a data movement decision. It changes retention, sharing, discovery, deletion, and incident response.
If a read-only role includes export, say that plainly. Do not bury it under the friendly label. Govern it as read plus transfer.
That does not mean every export needs a committee. It means the system should know the difference between viewing one assigned customer and extracting an entire segment. Different action, different evidence, different risk.
Search is where the boundary gets tested
Read-only roles usually become most dangerous through search.
A user may not have a direct reason to open a specific record, but a broad search box lets them discover records they did not know existed. Names, email addresses, company domains, case summaries, medical phrases, legal terms, VIP flags, fraud indicators, and internal tags can all become discovery paths.
That is why admin search deserves its own design review. It is not just a convenience feature. It decides how far curiosity, pressure, or sloppy process can travel. ZDS covered this more directly in Admin Search Is Where Data Minimization Gets Tested.
For read-only roles, search scope should match the job. If the job only supports assigned customers, search should not quietly span every tenant. If the user needs account lookup, results do not need to include sensitive snippets by default. If sensitive records appear, there should be a reason and a record.
Search is not neutral. It is access in motion.
Evidence should show the boundary
Audit evidence for read-only access is often thin.
The system logs a login. Maybe it logs that a page was viewed. Maybe it records a query. Maybe it does not. Then, when someone asks who viewed a sensitive record, the organization discovers that the evidence was designed for authentication, not accountability.
A useful audit trail should answer more than who logged in. It should show what was viewed, what authority allowed it, what search or workflow led there, whether sensitive fields were exposed, whether data was exported, and whether access was normal for that person’s role.
That does not require storing every screen or turning employee monitoring into a side business. It requires designing evidence around the control. The same principle applies to product audit logs generally: Audit Logs Are Product Features, Not Compliance Exhaust.
Read-only evidence should be strong enough to support customer questions, privacy investigations, insider risk reviews, and access cleanup. If it cannot do that, the role is less controlled than it looks.
Design read access around use, not comfort
The better model is not to make every viewer role painfully narrow. That creates workarounds and slows legitimate work.
The better model is to name the purpose and design from there.
Start with the job decision. Then define the data needed, the scope, the sensitive fields, the search behavior, the export path, the expiry condition, and the evidence. Some roles will still need broad visibility. Senior operations, security investigations, legal holds, incident response, and regulated support workflows may justify it.
But broad visibility should be named, owned, reviewed, and monitored. It should not hide behind read-only.
A simple operating pattern helps:
- Separate view, search, and export permissions.
- Scope read access by tenant, account assignment, region, queue, or case where possible.
- Mask sensitive fields unless the workflow needs them.
- Treat bulk viewing and bulk export as higher risk actions.
- Expire temporary viewer access automatically.
- Review roles based on data reach, not just role names.
- Make audit logs answer what was seen, not only who logged in.
If your access model has grown into a set of comfortable viewer roles that nobody wants to challenge, it may be time to redraw the boundaries. Zero Drama Security services can help teams turn that kind of messy operating reality into a cleaner security architecture decision.
Read-only is not bad. It is often necessary.
It is just not harmless by default.
