CIA #2 - Gibt es das perfekte Monitoring für die eigene Infrastruktur?

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
        }