Looker Security Review
A Looker access filter only restricts rows if someone remembers to add it to that Explore. We test your roles, model sets, access filters and embed credentials for exactly what they allow. CREST-certified testers, fixed price from £3,280 for a 2-day single-instance scope, quoted within 24 hours.
- Unlimited retesting
- Unlimited pre-retesting
- No hidden fees
“I would highly recommend EJN Labs to any organisation seeking reliable, detailed, and well-managed penetration testing services, particularly for government or enterprise-level projects.”
“There wasn’t another company we could find that could deliver what we needed in the timeframe we needed. The client loved it, and we got instant ROI from the engagement.”
Looker’s access_filter parameter for row-level security only applies to the Explore it was added to, and Looker’s own documentation warns that an Explore left without one shows unfiltered data to anyone who can query it.
In Looker, row-level security is switched on one Explore at a time
A Looker role is built from two separate pieces: a permission set, which lists granular capabilities such as access_data, explore, develop, see_sql and manage_models among dozens of others, and a model set, which lists the LookML models that permission set applies to. Google’s own roles documentation is explicit that some permissions do not stay inside that model set the way an admin might expect: manage_models gives a user access to every model in every project on the instance regardless of the model set their role was built from, and develop or see_lookml, once granted for any model in a project, exposes the LookML of every other model in that same project even though the user still cannot query it. We test which permissions each role actually carries against the model set it was meant to be confined to.
Row-level security in Looker runs through the access_filter parameter, applied inside a model file to a specific Explore and tied to a user attribute value, the same role a BigQuery row access policy plays when a Looker model queries a BigQuery warehouse directly, since Looker is Google Cloud’s own business intelligence layer built to sit on top of it. Google’s own access_filter reference warns that the parameter has to be added to every Explore that needs it, and an Explore left without one returns unfiltered rows to anyone who can query it. A separate access_grant parameter restricts an Explore, join, view or field to users whose user attribute matches an allowed value, and Looker’s documentation states that wildcards or a range of values are not supported in that match for security reasons; we test both mechanisms against every Explore and field they were meant to cover, not just the ones an admin remembered to configure.
Looker offers three ways to put a dashboard inside another application: signed embedding builds a URL with an HMAC-SHA1 signature over an embed secret that carries the permissions, models, group IDs and user attributes for a synthetic embed user, private embedding authenticates a real Looker account through a Looker login, Google OAuth or OpenID Connect, and the Embed SDK wraps either method with a JavaScript API the host application can call. Google’s own signed embedding documentation confirms these embed users are synthetic identities generated by the URL itself and cannot inherit permissions from externally managed SAML groups. The client ID and secret used for the Looker API, generated for an individual user and carrying that user’s own roles, and the separate database credentials Looker holds for building persistent derived tables, which Google’s documentation shows can be routed through a dedicated PDT-only database user with its own write access, matter just as much if either one leaks. We test how each of these credentials is issued, scoped and stored.
SCOPE
What we review in a Looker instance
Permission Sets and the Actions Each One Grants
Looker permission sets group granular capabilities such as access_data, explore, develop, manage_models and see_sql among dozens of others, and Google’s documentation lists exactly what each permission unlocks and which are limited to specific models. We check which permission sets your roles are actually built from against what each group of users needs to do.
Model Sets and the Data Connections They Reach
A model set is a list of LookML models, and because every model connects to one specific database connection, the model set attached to a role decides which underlying data source, not just which dashboard, that role’s permissions apply to. We test whether a model set was scoped to the one connection a team should reach or spans every connection on the instance.
Custom Roles That Reach Past Their Own Model Set
Google’s own documentation states that the manage_models permission gives a user access to every model in every project on the instance regardless of their assigned model set, and that develop or see_lookml, once granted for one model in a project, exposes the LookML of every other model in that project. We test every role holding either permission for exactly this kind of reach beyond its intended model set.
Access Filters: Row-Level Security Applied Explore by Explore
An access_filter ties an Explore to a user attribute in the same way a BigQuery row access policy ties a table to the caller’s identity, but Looker’s reference documentation warns that the parameter has to be added to each Explore individually or that Explore returns unfiltered rows to anyone who can query it. We test every Explore that should carry a filter, not only the ones that already do.
Access Grants on Explores, Joins, Views and Fields
An access_grant restricts a specific Explore, join, view or field to users whose user attribute matches an allowed value, for example limiting a salary field to a department attribute of finance or executive, and Looker’s documentation states that wildcards and value ranges are not supported in that match for security reasons. We test whether every sensitive field carries a required_access_grants restriction and whether the values behind it are still correct.
Looker API Credentials for Automation and Embedding
Looker API access runs on a client ID and client secret generated for an individual user, either created by an admin on the Users page or, on a Looker (Google Cloud core) instance, self-managed from that user’s Account page once API management is enabled for them, and every automated call runs under that user’s own roles. We check who holds live API credentials, what role sits behind each one, and how the secret is stored by the scripts and pipelines that use it.
Signed Embedding and the Embed Secret
A signed embed URL is built server-side with an HMAC-SHA1 signature over an embed secret, plus the permissions, models, group IDs and user attributes a synthetic embed user should get, and Looker’s own documentation confirms these embed users are distinct generated identities that cannot inherit externally managed SAML group permissions. We test where the embed secret is stored, who can generate a signed URL, and whether the permissions and models it grants match what an embedded viewer should actually see.
Private Embedding and Embedded User Accounts
Private embedding authenticates an embedded viewer as a real Looker account through a Looker login, Google OAuth or OpenID Connect, rather than the synthetic user a signed embed URL creates, so that account is bound by the same Sessions settings, folder permissions and roles as anyone logging in directly. We test what a privately embedded account can actually reach once inside the iframe, particularly where it sits inside a customer-facing application.
Persistent Derived Tables and the Database User That Builds Them
A persistent derived table needs a scratch schema on your database with write access for the Looker connection’s database user, and the connection’s PDT Overrides setting can route that traffic through a separate database user with its own host, credentials and schema, distinct from the one your regular queries run under. We check which database user actually builds your PDTs and whether its access extends beyond what PDT processing needs.
Instance Access Through Google Cloud IAM
A Looker (Google Cloud core) instance adds a Google Cloud IAM layer in front of Looker’s own roles, so permissions such as looker.instances.login are granted through IAM roles such as Looker Admin or Looker Instance User at the project level before Looker’s internal permission and model sets apply at all. We test who holds those IAM roles against who holds the matching Looker role, since the two are managed in different places.
OUR PROCESS
Looker Security Review: From Scope to Attestation
Scope and Access
We agree which Looker instance, projects and models are in scope, plus a Looker account or API credential that matches the access tier you want tested.
Role and Filter Mapping
We map permission sets, model sets, access filters and access grants against who in your organisation is meant to see which data.
Manual Testing
A CREST-certified tester works through the instance with the access provided, testing roles, filters, grants, embed credentials and PDT database access for gaps between intended and actual reach.
Reporting and Retest
You get a technical report with findings mapped to the specific roles, filters or credentials involved, a walkthrough call, a free retest once fixes are deployed, and an attestation letter for auditors.
CREDENTIALS
Verified Accreditations Auditors Accept
Every credential below is independently verifiable. UK procurement teams, FCA supervisors, ISO 27001 / SOC 2 auditors, and cyber insurance underwriters all recognise these standards.
GET YOUR QUOTE
Get a CREST Looker pen test quote in 24 hours
A fixed-price quote back in one business day, from a named CREST assessor. No sales pipeline, no chasing.
- CREST and IASME accredited. Testing your auditors and clients already recognise.
- Fast-track testing within 24 hours where required. Free retest of every fix included.
- Live findings via your client portal, not a four-week PDF.
- Fixed price from £3,500 for a single-role, single-app scope, agreed up front. Most engagements run £5,000 and up. No day-rate surprises.
Under NDA Further named references available on a scoping call.
- We reply within one business day with a fixed-price quote from a named CREST assessor.
- You approve the scope and we book a start date, usually within 24 hours.
- Live findings land in your client portal as we test, with a free retest of every fix.
Get your fixed pen test quote in 24 hours
Quote request received
We will reply within one business day with your fixed-price quote from a named CREST assessor.
Your data stays with us. No newsletter signup.
or book a 20-min scoping call first
We reply within one business day. Your data stays with us. No newsletter signup.
COMPLIANCE READY
Reports Mapped to Every Framework
Findings are written so your team can reference the report against each framework without translation work.
ISO 27001:2022
Annex A.8.8 management of technical vulnerabilities plus A.5.15-5.18 and A.8.2-8.5 access control validation.
SOC 2 Type I & II
CC6 logical access, CC7 system operations, CC8 change management evidence.
PCI DSS
Requirement 11.4 application penetration testing across cardholder data environments, including ecommerce penetration testing for online retail platforms.
FCA SYSC
SYSC 4.1.1R, 6.1.1R, 13 mapped to each finding for FCA-regulated firms.
UK GDPR
Article 32 effectiveness testing, customer-data security controls, ICO-acceptable evidence.
Cyber Essentials Plus
Direct certification through our IASME body status, single-vendor delivery.
PRICING
Transparent Looker Security Review Pricing
Pricing depends on the number of roles, integrations and environments in scope. See our pricing page for how we quote.
2 to 3 testing days
Single user role, basic CRUD application, marketing website with auth. Around 5 working days from kickoff to report.
Get a fixed quote3 to 5 testing days
Multi-role SaaS, business application with payment integration. Around 8 to 12 working days from kickoff to report.
Get a fixed quote5 to 7 testing days
Multi-tenant platform, complex authorisation matrix, integration-heavy applications. Around 15 to 20 working days from kickoff to report.
Get a fixed quoteSECTORS
Sectors We Test Looker For
Sector-specific scoping for regulated UK organisations.
Fintech & FCA-Regulated
FCA SYSC, Open Banking FAPI 1.0, PSD2 SCA, payment-flow scrutiny, KYC/AML testing.
Fintech sector pageSaaS Companies
SOC 2 Type I & II evidence, multi-tenant boundaries, role escalation, customer-tenant isolation.
SaaS sector pageLaw Firms
SRA Cyber Standard, privileged data, conveyancing fraud defence, partner-tier procurement.
Law firm sector pageHealthcare
NHS DTAC, DSP Toolkit v6, UK GDPR Article 32, EHR systems, telehealth platforms.
Healthcare sector pageInsurance
FCA / PRA Operational Resilience, cyber underwriting, claims data, broker portals.
Insurance sector pagePublic Sector
CCS / G-Cloud framework, NCSC-aligned, citizen-facing services, PSN-compliance scrutiny.
Public sector pageWHY EJN LABS
What You Get From Looker Security Review
Six concrete differentiators competitors don’t all match.
CREST-Certified Testers, Verifiable
Every test by a CREST-certified pen tester (CRT, CCT APP, CCT INF where applicable). Verify our company status at crest-approved.org.
24-Hour Startup, Where Required
From signed scope to active testing in a single business day for incident response, audit deadlines, or regulator-driven timelines.
Live Findings, Not 4-Week PDFs
Critical issues reported during testing through your client portal. Your team remediates while testing continues.
Audit-Ready Reports
Executive summary plus full technical report with CVSS scores and explicit framework mappings (ISO 27001, SOC 2, PCI DSS, FCA SYSC).
Free Retests, Standard
Verify remediation of every finding before close-out. Letter of attestation for audit submission included. Most competitors charge £1,500-£3,000 per retest.
UK-Based CREST Testers
Every engagement performed by vetted, UK-based CREST-certified testers, matched to your needs, security clearance, and compliance scope.
FAQ
Frequently Asked
What access do you need to test our Looker instance?
A Looker account, or an API client ID and secret, built from the same permission set and model set as the access tier you want tested. If you use access filters, access grants or embedded dashboards, tell us during scoping so we can test what each one is meant to restrict.
Will testing touch our live data?
We test with whichever Looker account or API credential you give us, and we do not run destructive changes such as deleting content or LookML. Where confirming an access filter or embed credential needs a real query against production, we agree that with you in writing before it happens.
How long does a Looker security review take?
A single Looker instance with a handful of projects sits in our 2-day single-instance scope, with a report typically landing around 5 working days after kickoff. More projects, more embedded use cases or a more complex access filter and access grant setup moves it into a wider scope.
Is Looker hosted on our infrastructure or Google’s?
A Looker (Google Cloud core) instance is always hosted by Google in the Google Cloud and is not available as a customer-hosted deployment, while a Looker (original) instance can also run on your own Kubernetes infrastructure. Either way, this review is scoped to your instance’s roles, filters, grants and connections, not to the hosting infrastructure itself.
What is out of scope for a single-instance Looker review?
The database or warehouse a Looker model connects to, such as BigQuery or Snowflake, is reviewed separately on our dedicated pages for that platform, as is the wider security of other Google Cloud services in the same project. This review is scoped to Looker’s own roles, model sets, filters, grants, embedding and API credentials.
Do you review our embedded Looker dashboards?
Yes, if embedding is in scope. We test how a signed embed URL and its embed secret are handled, what a privately embedded Looker account can reach, and how an Embed SDK integration is configured on top of either method.
Does Google Cloud have a customer penetration-testing policy covering Looker?
Google publishes a penetration-testing policy for Google Cloud Platform infrastructure that does not require you to contact Google first, provided testing stays within the Acceptable Use Policy and Terms of Service and only affects your own projects. A Looker (Google Cloud core) instance runs as a resource inside your own Google Cloud project, so it would reasonably fall under that same policy, but we confirm current terms during scoping before testing starts.
Do you need our database credentials or LookML source code?
No. We test using a Looker account or API credential you create for us, not your database’s own credentials. A grey-box option, where we also review your LookML models, connection configuration and PDT settings, is available if you want faster or deeper coverage.
20+ CREST-accredited testing services in one place
Web, mobile, API, cloud, AI, infrastructure, red team. Pick the test that fits your environment.
Get a fixed price for your Looker instance
A Looker access filter only restricts rows if someone remembers to add it to that Explore. We test your roles, model sets, access filters and embed credentials for exactly what they allow. CREST-certified testers, fixed price from £3,280 for a 2-day single-instance scope, quoted within 24 hours.



