Grafana Grafana

Authentifizierung und Zugriff über die Konfiguration einrichten

Richte Login, OAuth und Rollenzuordnung in grafana.ini ein und behandle Benutzer und Teams als Code.

12 min Fortgeschritten

Wer sich anmelden darf und mit welcher Rolle, ist Teil der Plattform und gehört genauso in die Versionskontrolle wie Dashboards. Das meiste davon liegt in grafana.ini. Der Rest, etwa Benutzer, Teams und Service Accounts, hat kein Provisioning-Dateiformat, daher zeigt diese Anleitung auch, wie du diese als Code verwaltest. Die unten genannten Optionsnamen entsprechen der Grafana-Konfigurationsreferenz, verifiziere sie aber gegen defaults.ini deiner Version, bevor du dich darauf verlässt.

Grundeinstellungen

[users]
allow_sign_up = false          # keine Selbstregistrierung
auto_assign_org = true
auto_assign_org_role = Viewer  # Standardrolle für neue Benutzer

[auth]
disable_login_form = false     # auf true setzen, sobald SSO funktioniert und du das Formular nicht mehr brauchst

[auth.anonymous]
enabled = false

Lass allow_sign_up = false, sofern du nicht bewusst eine offene Instanz willst. Wenn du anonymen Zugriff aktivierst, gib ihm die geringstmögliche Rolle:

[auth.anonymous]
enabled = true
org_role = Viewer

Single Sign-On mit Generic OAuth

Jeder OpenID-Connect- oder OAuth-2-Anbieter lässt sich in der Datei anbinden. Secrets kommen aus der Umgebung:

[server]
root_url = https://grafana.example.com/

[auth.generic_oauth]
enabled = true
name = Company SSO
allow_sign_up = true
client_id = grafana
client_secret = ${OAUTH_CLIENT_SECRET}
scopes = openid profile email groups
auth_url = https://sso.example.com/oauth2/authorize
token_url = https://sso.example.com/oauth2/token
api_url = https://sso.example.com/oauth2/userinfo
login_attribute_path = preferred_username
email_attribute_path = email
role_attribute_path = contains(groups[*], 'grafana-admins') && 'Admin' || contains(groups[*], 'grafana-editors') && 'Editor' || 'Viewer'

Was du wissen solltest:

  • Die Redirect-URI des Anbieters ist <root_url>login/generic_oauth, daher muss root_url exakt stimmen.
  • role_attribute_path ist ein JMESPath-Ausdruck, der gegen das Token oder Userinfo des Benutzers ausgewertet wird. Er bildet Gruppen des Identity Providers auf Grafana-Rollen (Admin, Editor, Viewer) ab, sodass Rollenänderungen im Identity Provider stattfinden und nicht in Grafana.
  • allow_sign_up bedeutet hier „beim ersten SSO-Login einen Grafana-Benutzer anlegen“, was du auch dann willst, wenn [users] allow_sign_up false ist.
  • Für gängige Anbieter gibt es eigene Abschnitte ([auth.github], [auth.google], [auth.azuread], [auth.gitlab] und weitere), und SAML und LDAP sind in Grafana Enterprise und Grafana Cloud verfügbar. LDAP liest außerdem eine separate Datei ldap.toml.

Sobald SSO funktioniert, setze disable_login_form = true und behalte das Admin-Konto nur als Break-Glass-Option, oder lass das Formular aktiviert, schütze es aber durch Netzwerkregeln.

Rollen und was Dateien nicht setzen können

Grafana hat Organisationsrollen (Admin, Editor, Viewer), und RBAC fügt in Enterprise und Cloud feingranulare Rollen hinzu. Diese Ressourcen haben in Open-Source-Grafana kein Provisioning-Dateiformat:

RessourceWie du sie als Code verwaltest
BenutzerÜber SSO erstellen oder per Admin-API in einem Bootstrap-Skript
Teams und Team-MitgliedschaftTerraform (grafana_team), die API oder Team Sync vom Identity Provider
OrganisationenTerraform (grafana_organization) oder die API
Service Accounts und TokensTerraform (grafana_service_account, grafana_service_account_token) oder die API
Berechtigungen für Ordner und DashboardsTerraform (grafana_folder_permission, grafana_dashboard_permission), der Operator oder die API

Die Terraform-Anleitung zeigt das Muster. Für ein kleines Setup ist ein einmaliges Skript, das die HTTP-API mit einer Admin-Berechtigung aufruft, im Repository gehalten und in CI ausgeführt, eine vernünftige Alternative.

Service Accounts für Automatisierung bootstrappen

Werkzeuge wie Terraform, der Operator und CI brauchen eine nicht menschliche Identität. Erstelle einmal einen Service Account mit der niedrigsten Rolle, die funktioniert, und speichere sein Token als Secret:

# den Service Account erstellen (Admin-API, Basic Auth)
curl -s -X POST -u admin:$GRAFANA_ADMIN_PASSWORD \
  -H 'Content-Type: application/json' \
  -d '{"name":"terraform","role":"Admin"}' \
  http://localhost:3000/api/serviceaccounts

# ein Token dafür erstellen, mit der oben zurückgegebenen id
curl -s -X POST -u admin:$GRAFANA_ADMIN_PASSWORD \
  -H 'Content-Type: application/json' \
  -d '{"name":"terraform-token"}' \
  http://localhost:3000/api/serviceaccounts/<id>/tokens

Das Token wird nur einmal angezeigt. Lege es direkt in deinem Secret Store ab und setze ein Ablaufdatum oder rotiere es nach Zeitplan.

Härtungseinstellungen, die es wert sind, committet zu werden

[security]
cookie_secure = true
cookie_samesite = lax
disable_gravatar = true
allow_embedding = false

[auth]
login_maximum_lifetime_duration = 30d
login_maximum_inactive_lifetime_duration = 7d

Prüfe sie bei Upgrades erneut und halte sie über Umgebungen hinweg identisch, außer wo sich ein Wert wirklich unterscheidet, wie root_url.

Ohne UI prüfen

curl -s -u admin:$GRAFANA_ADMIN_PASSWORD http://localhost:3000/api/admin/settings | jq '."auth.generic_oauth" | {enabled, name}'
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD http://localhost:3000/api/users | jq '.[] | {login, isAdmin}'
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD http://localhost:3000/api/teams/search | jq '.teams[].name'

Die vollständige Liste der Optionen pro Anbieter findest du in der Grafana-Dokumentation zur Authentifizierung.

Beliebte Anleitungen