@@ -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