Basis jeder IT-Security ist das Sicherstellen der drei Grundziele der IT-Security, der CIA. Hinter der Abkürzung CIA verbergen sich die Ziele Vertraulichkeit (confidentiality), Integrität (integrity) und Verfügbarkeit (availability). Für die Sicherstellung der Verfügbarkeit, also auch die Möglichkeit auf Fehler zu reagieren, ist es daher notwendig ein qualifiziertes System-Monitoring zu betreiben. In diesem Artikel möchte ich unser Monitoring, welches komplett auf Open-Source-Software (Nagios3) aufbaut, beschreiben.
Vor Aufbau eines Backupsystems ist es notwendig, sich grundlegende Gedanken über Ziel des Systems sowie die zu überwachenden Hosts und Parameter zu machen. Die Erreichbarkeit von Servern und Applikationen stellt definitiv das absolute Minimum dar, um Ausfälle feststellen und bekämpfen zu können. Jedoch können moderne Monitoringsysteme auch bei der Prävention unterstützen. Hierfür ist es möglich und durchaus sinnvoll folgende Parameter zu überwachen:
-
Verfügbarer Speicher (in Prozent)
-
RAM-Auslastung
-
Laufende Prozesse
-
CPU-Last
-
Ping
-
Ausstehende Sicherheitsupdates
-
Status des Backups
-
Abhängig vom jeweiligen Szenario ist es möglich auch weitere Parameter zu überwachen.
Nachfolgend möchte ich unsere Überlegungen zum Thema Backup für verschiedene Kategorien beschreiben.
Servermonitoring
Die Frage, welche Parameter wir bei unseren Servern überwachen wollen, löste auch bei uns auch die Frage aus: “Was geht denn alles?” Generell lassen sich mit Monitoringtools quasi alle irgendwie abfragbaren Werte und Parameter überwachen. Daher haben wir uns als wesentlichen Hauptparameter auf Ping zur Sicherstellung der Erreichbarkeit des Hosts geeinigt. Neben den Antworten auf unsere Pings werten wir ebenfalls die durchschnittliche Laufzeit sowie den Paketverlust aus und lösen bei Abweichungen automatische Warnungen aus. Zur Erfassung von Hostparametern setzen wir das Tool nagios-nrpe-server ein, so dass auch der freie Speicher aller Partitionen, die Anzahl der aktiven User etc., überwacht werden können. (Nagios Remote Plugin Executor (NRPE) ist ein Addon zum Ausführen von Nagios/Icinga Plugins auf einem Linux System. Das Ausführen der Plugins wird durch einen Nagios Server initiiert, der auch die Ausgabe der Plugins auswertet. Eine Alternative zu NRPE ist “check_by_ssh”.)
Einen wichtigen Part beim Servermonitoring spielen Remote-Checks. Warum möchte man in seinem Monitoring prüfen, wie viele User aktuell in einem Server eingeloggt sind? In der Regel sind Server so konfiguriert, dass sie laufen und automatisiert über Tools gewartet werden, jedoch aber keine interaktive Usersession notwendig ist. Existieren eine oder mehrere Sessions (z.B. via SSH) so deutet dies in der Regel auf unauthorisierte Zugriffe oder einen Hack hin. Auch die Überwachung des Patch-Standes ist trotz automatischer Updates und Wartung durchaus sinnvoll. In manchen Fällen passiert es bei automatischen Updates, dass auftretende Fehler jegliche weitere Updates bis zu einem manuellen Eingriff blockieren. Auch die Parameter CPU-Last, Prozesse und RAM-Nutzung stellen für uns relevante Messpunkte dar, um die Stabilität des Systems bewerten zu können und frühzeitig auf Überlast etc. reagieren zu können.
Eine Besonderheit unserer Serverüberwachung stellt die Prüfung der Firewall, insbesondere die der nach außen geöffneten Ports dar. Um zu verhindern, dass Anwendungen unbemerkt Ports nach außen öffnen erfassen wir zentral die initiale Konfiguration und prüfen in regelmäßigen Abständen, ob es Abweichungen hierzu gibt.
Hier Auszüge unserer Konfiguration:
commands.cfg
define command { command_name notify_statuspage_service command_line / usr / lib / nagios / plugins / statuspageupdate.py $_CONTACTSP_API_KEY$ $_CONTACTSP_PAGE_ID$ $_CONTACTSP_COMPONENT_ID$ $SERVICESTATE$ } define command { command_name notify_statuspage_host command_line / usr / lib / nagios / plugins / statuspageupdate.py $_CONTACTSP_API_KEY$ $_CONTACTSP_PAGE_ID$ $_CONTACTSP_COMPONENT_ID$ $HOSTSTATE$ } define command { command_name notification - telegram - service command_line / usr / lib / nagios / telegram / telegram - bot.php "GroupID" "API-KEY" 1 "Notify: $NOTIFICATIONTYPE$ 0XzXZ0 Host: $HOSTNAME$ 0XzXZ0 Service: $SERVICEDESC$ 0XzXZ0 Date: $SHORTDATETIME$ 0XzXZ0 Info: $SERVICEOUTPUT$" } define command { command_name notification - telegram - host command_line / usr / lib / nagios / telegram / telegram - bot.php "GroupID" "API-KEY" 1 "Notify: $NOTIFICATIONTYPE$ 0XzXZ0 Host: $HOSTNAME$ 0XzXZ0 Date: $SHORTDATETIME$ 0XzXZ0 Info: $HOSTOUTPUT$" } define command { command_name check_ldap_repl command_line / usr / lib / nagios / plugins / check_ldap_repl } define command { command_name check_ite_backup command_line / usr / lib / nagios / plugins / check_ite_backup } define command { command_name check_nas3_backup command_line sudo / usr / lib / nagios / plugins / check_nas3_backup } define command { command_name check_offsite_backup command_line / usr / lib / nagios / plugins / check_offsite_backup } define command { command_name check_ite_disk command_line / usr / lib / nagios / plugins / check_disk - w $ARG0 - c $ARG1 - A - I '/mnt/backup/docker*' - I '/var/lib/docker/*' } define command { command_name check_bacula command_line / usr / lib / nagios / plugins / check_bacula.pl - H 24 - c 1 - w 2 - e 0 - a - b - r - j $HOSTNAME$$ARG1$ } define command { command_name check_https_ite command_line / usr / lib / nagios / plugins / check_http - H $HOSTADDRESS$ - S - e "HTTP/1.1 302 Found,HTTP/1.1 401 Authorization Required,HTTP/1.1 200 OK,HTTP/1.1 200 200,HTTP/1.1 302 Moved Temporarily,HTTP/1.1 401 Unauthorized,HTTP/1.1 301,HTTP/1.1 200,HTTP/1.1 302,HTTP/1.1 401 Unauthorized" } define command { command_name check_http_ite command_line / usr / lib / nagios / plugins / check_http - H $HOSTADDRESS$ - S - e "HTTP/1.1 302 Found,HTTP/1.1 401 Authorization Required,HTTP/1.1 200 OK,HTTP/1.1 200 200,HTTP/1.1 302 Moved Temporarily,HTTP/1.1 401 Unauthorized,HTTP/1.1 301,HTTP/1.1 200,HTTP/1.1 302,HTTP/1.1 401 Unauthorized" } define command { command_name check_ite_ssl command_line / usr / lib / nagios / plugins / CheckSSL.sh $HOSTADDRESS$ } define command { command_name check_ite_atlassian command_line / usr / lib / nagios / plugins / check_atlassian.sh $HOSTADDRESS$ } define command { command_name check_scan command_line / usr / lib / nagios / plugins / check_scan.sh - H $HOSTADDRESS$ } define command { command_name check_ldap_bind command_line / usr / lib / nagios / plugins / check_ldap_bind.php $ARG1$ }
server.cfg
define host { use generic-host host_name alias address <URL> contact_groups admins } define service { host_name alias service_description Portscan check_command check_scan use generic-service notification_interval 120 ; set > 0 if you want to be renotified } define service { host_name alias service_description Current_Load check_command check_nrpe_1arg!check_load use generic-service notification_interval 120 ; set > 0 if you want to be renotified } define service { host_name alias service_description PING check_command check_ping!500.0,40%!1000.0,80%!-4 use generic-service notification_interval 120 ; set > 0 if you want to be renotified } define service { host_name alias service_description Hardware sensors check_command check_nrpe_1arg!check_sensors use generic-service notification_interval 0 } define service { host_name alias service_description SSD Health Check check_command check_nrpe_1arg!check_ite_ssd use generic-service notification_interval 0 } define service { host_name alias service_description Current_Users check_command check_nrpe_1arg!check_users use generic-service notification_interval 120 ; set > 0 if you want to be renotified } define service { host_name alias service_description Total_Processes check_command check_nrpe_1arg!check_total_procs use generic-service notification_interval 120 ; set > 0 if you want to be renotified } define service { host_name alias service_description Disk Usage check_command check_nrpe_1arg!check_ite_disk use generic-service notification_interval 0 } define service { host_name alias service_description APT_Status notifications_enabled 0 check_command check_nrpe_1arg!check_apt use generic-service notification_interval 120 ; set > 0 if you want to be renotified } define service { host_name alias service_description SSH on port X check_command check_ssh_port!X!server use generic-service notification_interval 0 } define service { host_name alias service_description lpdap01 check_command check_ldap_bind!ldapbindurl use generic-service notification_interval 120 ; set > 0 if you want to be renotified }
Anwendungsmonitoring
Neben der Überwachung der Server ist es mindestens genauso wichtig die betriebenen Anwendungen auf deren Status hin zu überprüfen und den fehlerfreien Betrieb zu überwachen. Auch beim Monitoring von Anwendungen gibt es verschiedene Ansätze. So lassen sich Webanwendungen mindestens durch Prüfung auf den erwarteten HTTP-Status-Code überwachen, bieten meist aber auch eine Schnittstelle zur Statusüberwachung. Ein Beispiel hierfür stellen die Anwendungen von Atlassian dar, welche unter /status den aktuellen Status ausgibt. Zusätzlich empfiehlt es sich, die Antwortzeiten des Systems durch setzen geeigneter Timeouts zu prüfen.
Für Anwendungen, die wir als Software as a Service Lösung betreiben lässt sich folgende Config nutzen:
application.cfg
define host{ use generic-host host_name jira check_command check_https_ite alias JIRA address <URL> } define service { host_name jira service_description SSL check_command check_ite_ssl use generic-service notification_interval 120 ; set > 0 if you want to be renotified } define service { host_name jira service_description HTTPS check_command check_https_ite use generic-service notification_interval 120 ; set > 0 if you want to be renotified } define service { host_name jira service_description Atlassian check_command check_ite_atlassian use generic-service notification_interval 120 ; set > 0 if you want to be renotified }
Backupmonitoring
Ein gutes Backupsystem sollte selbstständig Benachrichtigungen versenden, wenn ein Backup fehlerhaft oder unvollständig war. Dennoch ist es empfehlenswert zusätzlich zu prüfen, ob ein Backup gelaufen ist und ob dabei für jeden Client auch eine Sicherung erfolgte. Hierzu haben wir früher folgendes Script eingesetzt:
https://exchange.nagios.org/directory/Plugins/Backup-and-Recovery/Bacula/check_bacula-2Epl/details
Nach unserer Migration auf Bareos, welches ich in meinem nachfolgenden Artikel beschreiben werde, nutzen wir ein selbst erstelltes Monitoringscript, welches sich mittels PHP auf die Datenbank des Backup-Servers verbindet. Wir werden unser Script an folgender Stelle veröffentlichen: https://bitbucket.it-economics.de/projects/OPENSOURCE/repos/bareos-monitoring/browse
Gerätemonitoring
Neben den vorhergehend beschriebenen Monitoringverfahren, welche sich auf zentrale Services oder Server beziehen, kann es aber auch empfehlenswert sein, die im eigenen Netz verbauten Geräte zu überwachen. In unserem Netz überwachen wir so die Erreichbarkeit der Telefone via Webinterface (auch um festzustellen, ob jemand an unserem Netz manipuliert), die Verfügbarkeit der Konferenzspinnen, aber auch die Erreichbarkeit unserer Drucker. Via SNMP ist es ferner sogar möglich Tonerstände und ähnliches abzufragen.
Benachrichtungen
Nun, da die Überwachung fertig konfiguriert ist, muss definiert werden, was bei auftretenden Meldungen geschehen soll. Der Standard ist hier die Benachrichtung in festgelegten Abständen via Mail. Neben dieser Standardfunktionalität setzen wir zusätzlich noch Pushnotications via Telegram Bots ein.
Telegram Bot:
Zur Benachrichtigung via Telegram setzen wir dieses Script ein. Zur Konfiguration ist es notwendig sich einen neuen Bot via Telegram zu erstellen und um eine Benachrichtigung via Gruppe zu erhalten, den erstellten Bot in die gewünschte Gruppe aufzunehmen. Nachfolgend kann unter folgender URL die ID der Gruppe abgefragt werden: http://api.telegram.org/bot<APIKEY>/getUpdates
Zudem ist es notwendig ein Benachrichtigungskommando zu definieren und dieses in der Kontaktkonfiguration hinzuzufügen.
commands.cfg
define command { command_name notification - telegram - host command_line / usr / lib / nagios / telegram / telegram - bot.php "GroupID" "API-KEY" 1 "Notify: $NOTIFICATIONTYPE$ 0XzXZ0 Host: $HOSTNAME$ 0XzXZ0 Date: $SHORTDATETIME$ 0XzXZ0 Info: $HOSTOUTPUT$" }
contacts_nagios2.cfg
define contact{ contact_name admin alias Adminname service_notification_period sleep host_notification_period sleep service_notification_options u,c,r host_notification_options d,r service_notification_commands notify-service-by-email,sm-service-push-notify,notification-telegram-service host_notification_commands notify-host-by-email,sm-host-push-notify,notification-telegram-host email mailadresse }