Zabbix Webfrontend zusaetzlich absichern

Doppelt gemoppelt hält besser

Wenn Sie der Authentifizierung über das Zabbix-Frontend nicht trauen, können Sie eine zusätzliche Passwortabfrage über den Webserver vorschalten.

Dies macht bei Systemen, die über das öffentliche Internet verfügbar sind durchaus Sinn. Es könnten Fehler im Progammcode von Zabbix auftauchen, so dass es ggf. möglich ist, die Authentifizierung von Zabbix auszuhebeln.

Zabbix macht erfreulicherweise wenig Schlagzeilen hinsichtlich Sicherheitproblemen. Trotzdem hat es in der Vergangenheit einige wenige Sicherheitslücken gegeben. So bestand beispielsweise im Oktober 2013 eine Sicherheitslücke im Webfrontend, die eine sogenannte SQL-Injection ermöglichte. Angriffspunkt über einen HTTP-Request war die Datei api_jsonrpc.php, welche vom damaligen Standardbenutzer „guest“ ohne Authentifizierung ausgeführt werden konnte.

Wenn Sie eine vom Webserver generierte Passwortabfrage vorschalten, dann schützt diese den gesamten Server, auch wenn die Passwortabfrage von Zabbix versagt.

Wenn Sie eine der nachfolgend beschriebenen Authentifizierungen aktivieren, müssen Sie die Anfragen an die Zabbix-API ebenfalls anpassen. Die API-Requests müssen dann ebenfalls „Http-Basic-Auth“ verwenden anstatt der zabbix-internen Authentifizierung.

Variante 1: Apache Basic-Auth

Zabbix kann komplett auf die eigene Authentifizierung verzichten und diese dem Webserver überlassen. Deaktivieren Sie in die Apache-Konfigurationsdatei, welche die Zabbix-Konfiguration enthält die Zeile Require all granted und fügen Sie im Block /usr/share/zabbix folgenden Block ein:

<Directory "/usr/share/zabbix">
  #Require all granted
  ...
  AuthType Basic
  AuthName "Authentication Required"
  AuthUserFile "/usr/lib/zabbix/passwd"
  Require valid-user
  Order allow,deny
  Allow from all
</Directory>

Starten Sie anschließend den Webserver neu oder lesen Sie die Konfiguration erneut ein.

Legen Sie anschließend Benutzer an. Die Benutzernamen müssen zusätzlich identisch in Zabbix angelegt werden.

htpasswd -c /usr/lib/zabbix/passwd admin

Alle weiteren Benutzer fügen Sie mit folgendem Kommando hinzu:

htpasswd /usr/lib/zabbix/passwd <USERNAME>

Weisen Sie nun Zabbix an, die Authentifizierung dem Apache-Webserver zu überlassen. Klicken Sie auf Administration|authentication, wählen Sie als „Default authentication“ „HTTP“ aus und aktivieren Sie die Konfiguration mit einem Klick auf die Schaltfläche „Update“.

Sobald Sie die Authentifizierungmethode zu HTTP umgeschaltet haben, können Sie beim Anlegen von Benutzern über das Webfrontend kein Passwort mehr vorgeben. Ebenfalls steht der Link „Logout“ nicht mehr zur Verfügung.

Sie gewinnen mit dieser Authentifizierung Sicherheit, verlieren aber Komfort. Die Zabbix-Benutzer können nicht das Passwort nicht mehr selbstständig ändern. Außerdem muss der Administrator die Benutzer doppelt anlegen.

Variante 2: Apache MySQL-Auth

Damit Sie die User und Passwörter nicht doppelt pflegen müssen, können Sie das Apache-Modul mod-auth-mysql verwenden, welches die User und Passwörter aus der Zabbix-Datenbank liest.

Apache Modul installieren

Mit dem Modul mod-auth-external kann Apache eine Authentifizierung gegen die Zabbix-Datenbank durchführen. Nutzer von Debian und Ubuntu können das Modul über den Paketmanager installieren:

apt-get install libapache2-mod-authnz-external
a2enmod authnz_external
a2enmod authn_socache
a2enmod socache_shmcb

Datenbank User anlegen

Legen in der Zabbix-Datenbank einen User an, der nur die Tabelle Users lesen darf.

mysql -e "GRANT SELECT ON zabbix.users TO apache IDENTIFIED BY 'password'"

Apache konfigurieren

Passen Sie die Apache-Konfiguration von Zabbix an, welche sich in der Datei /etc/apache2/conf-enabled/zabbix.conf befindet.

Passen Sie die Datei wie folgt an:

DefineExternalAuth zabbix-mysql environment /usr/lib/zabbix/mysql-auth.sh
AuthnCacheSOCache shmcb
<Directory "/usr/share/zabbix">
    AuthType Basic
    AuthName Zabbix
    AuthBasicProvider socache external
    AuthExternalProvideCache On
    AuthnCacheProvideFor external
    AuthExternal zabbix-mysql
    Require valid-user
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all

    php_value max_execution_time 300
    php_value memory_limit 128M
    php_value post_max_size 16M
    php_value upload_max_filesize 2M
    php_value max_input_time 300
    # php_value date.timezone Europe/Riga
</Directory>

Nun sucht fragt Apache das Skript /usr/lib/zabbix/mysql-auth.sh, ob ein User Zugriff gewährt wird, oder nicht. Dieses Skript schaut dann in der Zabbix-Datenbank in der Tabelle users nach, ob Benutzername und Passwort zusammenpassen. Das Skript sollte wir folgt angelegt werden:

#!/bin/bash
MYSQL_USER=apache
MYSQL_PASS=password

mysql -e "select alias from users where\
  alias='$USER'\
  and passwd=md5('$PASS')" zabbix -u $MYSQL_USER -p${MYSQL_PASS} >/dev/null && exit 0

exit 1

Wenn Sie den Zugriff aus einem internen Netz ohne Passwortabfrage durch den Webserver zulassen möchten, verwenden Sie die Die Option Satisfy Any sorgt dafür, dass "allow from 192.168.1" ausreicht, um "durchzukommen". Verwenden Sie "allow from 127.0.0.1" wenn Sie von einem lokal ausgeführten Skript auf die Zabbix-API zugreifen wollen. Beispiel:

<Directory /var/www/>
  ...
  deny from all
  allow from 192.168.1
  Satisfy Any 
</Directory>

Reloaden Sie den Webserver, nachdem Sie Änderungen an den Konfigurationsdateien vorgenommen haben.

 service apache2 reload