En corto

1
https://grafana.example.com/login?disableAutoLogin=true

Eso te lleva al formulario de usuario y contraseña aunque auto_login = true te esté redirigiendo al proveedor OAuth. Si además no recuerdas la contraseña del admin local:

1
2
3
4
# contenedor / pod
grafana cli --homepath /usr/share/grafana admin reset-admin-password 'nueva'
# paquete
grafana-cli admin reset-admin-password 'nueva'

Y si el formulario está desactivado ([auth] disable_login_form = true), primero GF_AUTH_DISABLE_LOGIN_FORM=false en el entorno y reinicia.

Roles que se deshacen solos

Le das Editor a alguien en Administration → Users, y al día siguiente vuelve a ser Viewer. No es un bug: en cada login OAuth Grafana sincroniza el rol de la organización con lo que diga el proveedor (o con auto_assign_org_role si el proveedor no dice nada) y pisa lo que pusiste a mano.

Dos formas de vivir con ello:

1. Que el proveedor mande de verdad. Mapea grupos o claims a roles con JMESPath y haz que sea estricto, para que un usuario sin grupo no entre como Viewer por defecto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[auth.github]
enabled = true
allow_sign_up = true
auto_login = true
client_id = $__file{/etc/secrets/github-client-id}
client_secret = $__file{/etc/secrets/github-client-secret}
scopes = user:email,read:org
allowed_organizations = my-org
role_attribute_strict = true
allow_assign_grafana_admin = true
role_attribute_path = contains(groups[*], '@my-org/grafana-admin') && 'GrafanaAdmin' || contains(groups[*], '@my-org/grafana-editor') && 'Editor' || contains(groups[*], '@my-org/grafana-viewer') && 'Viewer'

2. Que Grafana no toque los roles. Si prefieres gestionarlos en la UI:

1
2
[auth.github]
skip_org_role_sync = true

skip_org_role_sync va por proveedor (auth.github, auth.google, auth.generic_oauth, auth.azuread, auth.okta, auth.gitlab, SAML). El antiguo interruptor global [auth] oauth_skip_org_role_update_sync está obsoleto; si todavía lo tienes en el .ini, cámbialo por el de cada proveedor.

Con Google, hosted_domain y allowed_domains limitan quién puede entrar; sin role_attribute_path todos entran con auto_assign_org_role (Viewer por defecto).

Datasources aprovisionados

Los datasources definidos en provisioning/datasources/*.yaml (en el chart de Helm, datasources.datasources.yaml) tienen tres propiedades que sorprenden:

  • No se editan en la UI si llevan editable: false: el formulario aparece bloqueado. Es lo correcto en producción; el cambio va en el YAML.
  • Los secretos van en secureJsonData, no en jsonData: Grafana los cifra con secret_key antes de guardarlos en su base de datos (/var/lib/grafana/grafana.db, SQLite por defecto) y no los devuelve por la API. Tokens, contraseñas y certificados de cliente van ahí; en jsonData quedan en claro.
  • No desaparecen al quitarlos del YAML. Grafana solo inserta y actualiza; para borrar hay que decirlo:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: 1
prune: true                  # versiones recientes: borra lo aprovisionado que ya no esté en este archivo
deleteDatasources:
  - name: Sentry-old
    orgId: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    orgId: 1
    url: http://prometheus-server.monitoring.svc.cluster.local
    isDefault: true
    editable: false
    version: 1
  - name: Sentry
    type: grafana-sentry-datasource
    access: proxy
    orgId: 1
    editable: false
    jsonData:
      url: https://sentry.io
      orgSlug: my-org
    secureJsonData:
      authToken: ${SENTRY_TOKEN}      # variable de entorno del proceso de Grafana

Las variables de entorno se expanden con $VAR o ${VAR}; un $ literal en un secreto se escribe $$.

Trampas

  • auto_login con varios proveedores se ignora: solo funciona con uno configurado para auto-login.
  • allow_sign_up = false deja fuera a cualquier usuario nuevo del proveedor, incluido el que acabas de dar de alta en el grupo; el error en el log es “user signup disabled”.
  • role_attribute_strict = true sin grupo mapeado rechaza el login con “Role attribute not found”; es lo que quieres, pero avisa a la gente.
  • El admin local sigue existiendo con SSO: cámbiale la contraseña y guárdala en el gestor de secretos, es tu puerta de emergencia junto con disableAutoLogin.
  • secret_key por defecto (SW2YcwTIb9zpOOhoPsMm) cifra los secureJsonData de cualquier Grafana igual; ponle el tuyo ([security] secret_key) antes de aprovisionar nada, porque cambiarlo después invalida lo cifrado.

Referencias: Configure authentication y Provisioning en la documentación de Grafana.

Ver también