ADFS OpenId Connect für Grafana

Zum Visualisieren von Metriken gehört Grafana für mich zu den Top Werkzeugen. In einem grösseren Umfeld kann die Benutzerverwaltung jedoch schnell aufwändig werden und es bietet sich meistens die Möglichkeit einen bereits vorhandenen Identity Provider zu verwenden der die zentrale Benutzer Verwaltung zur Verfügung stellt. Als etablierte Enterprise Web Anwendung verfügt Grafana über Authentifizierungs Möglichkeiten via LDAP, OpenId Connect, SAML und weitere. In einer Cloud orientierten Welt ist natürlich eine Federations basierte Authentifizierung sehr willkommen, weshalb ich die Konfiguration mit ADFS und OpenId Connect beschreibe.

Konfiguration ADFS

Als erstes wird eine neue “Application Group” hinzugefügt. Dazu kann die Vorlage “Server application accessing a web API” verwendet werden

Die Client Id muss für die Grafana Konfiguration kopiert und bei den Redirect URIs muss die öffentliche Adresse der Grafana Instanz eingetragen werden.

Den Haken bei “Generate shared secret” setzten und den erzeugten Schlüssel ebenfalls kopieren. Dieser Schlüssel wird einmalig angezeigt und danach nie wieder. Es kann aber jederzeit ein neuer erstellt werden, dabei muss allerdings auch die Grafana Konfiguration mit dem neuen Schlüssel aktualisiert werden.

Bei Identifier wird der vorher notierte Client Identifier eingetragen.

Als Access Control Policy verwende ich die 2 Faktor Authentisierung. Diese habe ich mit einem Yubikey als 2. Faktor eingerichtet (dazu erstelle ich ebenfalls einen Artikel, wie ein MFA Adapter in ADFS hinzugefügt werden kann).

Als Scope wird “openid” ausgewählt

Konfiguration Grafana

Grafana wird über eine .ini Datei konfiguriert. Im folgenden Abschnitt sind die Einstellungen aufgelistet, welche für die OpenId Connect Authentisierung via ADFS relevant sind. Die entsprechenden URL Endpoints können über die ADFS Metadaten abgefragt werden.

Invoke-RestMethod https://<ADFS-Url>/adfs/.well-known/openid-configuration
[auth]
oauth_auto_login = true

[auth.generic_oauth]                                                                                                  
enabled = true                                                                                                        
name = ADFS                                                                                                           
allow_sign_up = true                                                                                                  
client_id = 3d163a69-ee0b-*************************                                                                      
client_secret = ***********************************                                                              
scopes = openid                                                                                                       
email_attribute_name = email                                                                                          
;email_attribute_path =                                                                                               
auth_url = https://<ADFS-Url>/adfs/oauth2/authorize/                                                            
token_url = https://<ADFS-Url>/adfs/oauth2/token/                                                               
api_url = https://<ADFS-Url>/adfs/userinfo                                                                      
allowed_domains = irbe.ch                                                                                             
;team_ids =                                                                                                           
;allowed_organizations =                                                                                              
;role_attribute_path =                                                                                                
;tls_skip_verify_insecure = false                                                                                     
;tls_client_cert =                                                                                                    
;tls_client_key =                                                                                                     
;tls_client_ca = 

Beim Anmelden wird jedoch dieser Fehler erscheinen.

Der Grund ist, dass in meiner Domäne der UPN folgendermassen zusammengesetzt ist: <Benutzer>@lab<punkt>irbe<punkt>ch. Ich möchte jedoch, dass der Benutzername der Email Adresse entspricht, was in meinem Fall <Email>@irbe<punkt>ch wäre.
Dazu wird in ADFS das Scope “allatclaims” aktiviert, welches die Access Claims in dem Identitäts Token mitliefert und somit ein custom id_token ermöglicht. Zudem muss eine Claim Regel erstellt werden, welche die Email Adresse dem Token mitgibt.

Der Autologin klappt, nachdem ich mich beim ADFS Server angmeldet habe. Allerdings hat mein Benutzer nur die Grafana “Viewer” Rolle. Hier bietet es sich ebenfalls an, die Rollenzuweisung via Gruppen im Active Directory zu steuern.

Dazu erstelle ich im Active Directory 2 Gruppen Z-Grafana-Admin und Z-Grafana-Editor und füge meinen Benutzeraccount der Admin Gruppe hinzu. Auf dem ADFS Server in den Claims Rules erstelle ich 2 Regeln, welche dem Claim das Attribut Role, basierend auf der Gruppenzugehörigkeit, auf Admin oder Editor setzten.

In der grafana.ini wird die Konfiguration folgendermassen ergänzt

[auth.generic_oauth] 
role_attribute_path = role

So kann die Rollenzuweisung mit einer Gruppenzuweisung im Active Directory erfolgen

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.