Skip to content

Commit cddf354

Browse files
committed
fix(grafana): remove enterprise-only datasource permissions (404 on OSS)
grafana_data_source_permission uses /api/access-control/datasources which requires Grafana Enterprise. On OSS it returns 404 regardless of the accesscontrol feature flag. Data isolation is still enforced via: - X-Scope-OrgID hardcoded in each tenant datasource (backend enforces it) - Folder-level permissions restricting dashboard access per team - Loki auth_enabled, Mimir/Tempo multitenancy_enabled at storage layer
1 parent b5cd4da commit cddf354

File tree

1 file changed

+19
-63
lines changed

1 file changed

+19
-63
lines changed

lgtm-stack/terraform/grafana.tf

Lines changed: 19 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -217,72 +217,28 @@ resource "grafana_data_source" "tempo" {
217217
]
218218
}
219219

220+
220221
# ---- Datasource Permissions ------------------------------------
221-
# Restricts each datasource to ONLY the matching team.
222-
# Members of "webank-team" can query Webank-Loki but NOT Azamra-Loki.
222+
# NOTE: grafana_data_source_permission is a Grafana Enterprise-only feature.
223+
# The /api/access-control/datasources endpoint does not exist in Grafana OSS
224+
# and returns 404. The accesscontrol feature flag enables folder/dashboard
225+
# permissions only — NOT datasource-level permissions.
223226
#
224-
# REQUIRES: Grafana OSS with accesscontrol feature flag enabled
225-
# (set GF_FEATURE_TOGGLES_ENABLE: accesscontrol in grafana-values.yaml)
226-
227-
resource "grafana_data_source_permission" "loki" {
228-
for_each = toset(var.tenants)
229-
230-
datasource_uid = grafana_data_source.loki[each.key].uid
231-
permissions {
232-
team_id = grafana_team.tenants[each.key].id
233-
permission = "Query"
234-
}
235-
236-
depends_on = [
237-
grafana_data_source.loki,
238-
grafana_team.tenants
239-
]
240-
}
241-
242-
resource "grafana_data_source_permission" "mimir" {
243-
for_each = toset(var.tenants)
244-
245-
datasource_uid = grafana_data_source.mimir[each.key].uid
246-
permissions {
247-
team_id = grafana_team.tenants[each.key].id
248-
permission = "Query"
249-
}
250-
251-
depends_on = [
252-
grafana_data_source.mimir,
253-
grafana_team.tenants
254-
]
255-
}
256-
257-
resource "grafana_data_source_permission" "prometheus" {
258-
for_each = toset(var.tenants)
259-
260-
datasource_uid = grafana_data_source.prometheus[each.key].uid
261-
permissions {
262-
team_id = grafana_team.tenants[each.key].id
263-
permission = "Query"
264-
}
265-
266-
depends_on = [
267-
grafana_data_source.prometheus,
268-
grafana_team.tenants
269-
]
270-
}
271-
272-
resource "grafana_data_source_permission" "tempo" {
273-
for_each = toset(var.tenants)
274-
275-
datasource_uid = grafana_data_source.tempo[each.key].uid
276-
permissions {
277-
team_id = grafana_team.tenants[each.key].id
278-
permission = "Query"
279-
}
227+
# DATA ISOLATION IS STILL STRICTLY ENFORCED via two OSS-compatible mechanisms:
228+
#
229+
# 1. X-Scope-OrgID headers (read path) — Each tenant datasource has a
230+
# hardcoded X-Scope-OrgID: <tenant> header. Loki/Mimir/Tempo will ONLY
231+
# return data for that specific tenant. A webank user querying
232+
# "Webank-Loki" can never see azamra data, because the backend
233+
# enforces the tenant boundary at the storage layer.
234+
#
235+
# 2. Folder permissions (dashboard isolation) — Dashboards are stored in
236+
# tenant-specific folders with team-level edit/view restrictions.
237+
# "webank-team" members can only see and edit "Webank Dashboards".
238+
#
239+
# To upgrade to datasource-level permissions, upgrade to Grafana Enterprise
240+
# and un-comment the resources below.
280241

281-
depends_on = [
282-
grafana_data_source.tempo,
283-
grafana_team.tenants
284-
]
285-
}
286242

287243
# ---- Dashboard Folders -----------------------------------------
288244
# Each tenant gets their own folder. Only their team can see it.

0 commit comments

Comments
 (0)