Proaktive Überwachung mit Grafana und Telegram

  1. Einleitung
  2. Telegram Bot erstellen
  3. Telegram Gruppe erstellen und Bot einladen
  4. Grafana konfigurieren
  5. Alerts in Grafana definieren
  6. Weiterführende Links

Einleitung

Eine proaktive Überwachung eines Servers oder einer Platform kann mit relativ einfachen Mitteln realisiert werden. Telegram bietet mit sogenannten Bots die Möglichkeit einen Chat mit Maschinen zu erstellen. In diesem Beitrag verwende ich eine Chatgruppe, in der sich menschliche Teilnehmer austauschen können. Der Bot, welcher Teil der Gruppe ist kann aber keine Nachrichten interpretieren sondern nur selber welche schicken.

Telegram Bot erstellen

Das Erstellen eines Telegram Kontos wird bewusst in diesem Artikel nicht erwähnt. Dies kann über https://web.telegram.org/ oder die Mobile App erledigt werden.

Als erstes muss der BotFather angeschrieben werden (welcher selber ebenfalls ein Bot ist) um einen Bot erstellen zu können. Dazu kann im Kontakt Suchfeld /BotFather geschrieben, der Kontakt ausgewählt und anschliessend im Chatfenster auf Start gedrückt werden.

Darauf präsentiert der BotFather auch gleich seine Interaktions Möglichkeiten. Das Erstellen des Bots läuft interaktiv ab, wir beginnen mit /newbot
Anschliessend werden wir nach dem Namen des Bots gefragt und Usernamen, welcher auf bot enden muss. In meinem Fall ist der Name DirectoryServicesAlerts und der Username DSAlerts_bot. Als Resultat erhalten wir das Token, mit dem Grafana über diesen Bot mit uns kommunizieren kann.

Telegram Gruppe erstellen und Bot einladen

Es ist von Vorteil anstelle eines direkt Chats mit 1 Person eine Gruppe in Telegram zu erstellen, in welcher der Bot Mitglied ist. Dadurch können beliebig menschliche Mitglieder hinzugefügt und entfernt werden je nach Bedarf (z.B im Pikettfall).
Durch klicken auf das Hamburgermenü neben dem Titel Telegram kann mit New Group eine neue Gruppe angelegt werden. Bei Kontakten wird der Bot mit der Suche nach dem Username des Bots (in meinem Fall /DSAlerts_bot ) hinzugefügt. Neben unserem Bot benötigen wir einmalig auch noch den IDBot (/myidbot), welcher uns die ID für die Gruppe sagen kann. Diese wird in Grafana benötigt, damit der Bot weiss in welche Gruppe er die Mitteilungen schicken soll.

Die Gruppen ID kann anschliessend im Gruppen Chat mit /getgroupid@myidbot angezeigt werden.

Anschliessend kann der IDBot wieder aus der Gruppe entfernt werden, er wird nicht mehr benötigt.

Grafana konfigurieren

In Grafana wird über das Alerting Menü ein neuer Notification channel hinzugefügt

Der Name des Channels kann frei gewählt werden. Als Type wird Telegram ausgewählt und bei den Telegram API Settings das BOT API Token, welches uns der BotFather mitgeteilt hat, eingetragen sowie bei Chat ID diejenige welche uns der IDBot im Gruppenchat geschickt hat.

Abschliessend kann das Ganze mit Send Test überprüft werden. Sollte alles korrekt konfiguriert worden sein ist eine Test Nachricht im Gruppen Chat ersichtlich.

Alerts in Grafana definieren

In Grafana kann nun auf einem Panel im Alert Tab der gewünschte Schwellwert hinzugefügt werden, ich nehme zum testen die CPU Auslastung.

Mit folgenden Powershell Einzeiler wird die CPU auf einem Test Server zu 100% ausgelastet

(1..(GWmi Win32_Processor | Select -Expand NumberOfLogicalProcessors)) | ForEach-Object { Start-Job {while(1){}} }; Read-Host "Press any key to stop cpu load test";Stop-Job *;Remove-Job *

und schon meldet der Bot den Alarm, bzw. dessen Aufhebung

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