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

grafik.png

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

grafik-8.png

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.

grafik-3.png

Bei Identifier wird der vorher notierte Client Identifier eingetragen.

grafik-4.png

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).

grafik-5.png

Als Scope wird openid ausgewählt

grafik-7.png

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.

1
Invoke-RestMethod https://<ADFS-Url>/adfs/.well-known/openid-configuration
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[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.

grafik-9-1024x308.png

Der Grund ist, dass in meiner Domäne der UPN folgendermassen zusammengesetzt ist: @labirbech. Ich möchte jedoch, dass der Benutzername der Email Adresse entspricht, was in meinem Fall @irbech 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.

grafik-10.png grafik-11.png

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.

grafik-14.png

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.

grafik-15.png

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

1
2
[auth.generic_oauth] 
role_attribute_path = role

So kann die Rollenzuweisung mit einer Gruppenzuweisung im Active Directory erfolgen

grafik-16.png