Mit PRTG und Ansible iptables überwachen (und Sensoren sparen)

Datum

iptables ist das Verbindungsregelwerk unter Linux / UNIX. Es macht Sinn seine Serverlandschaft damit abzusichern und einzelne Teile abzuschotten – je nach Zweckmäßigkeit.

Dieses Regelwerk auf Servern kann überwacht werden. Mein Konzept dazu sieht folgendermaßen aus:

  • Der Inhalt der iptables wird in eine Datei geschrieben.
  • Aus dieser Datei wird eine Checksumme generiert.
  • Auf dem Ansible-Server liegt eine Initialversion der Datei, und hier wird ebenfalls eine Checksumme generiert.
  • Diese Checksummen werden pro Host verglichen.
  • Das Ergebnis wird für PRTG aufbereitet und kann als Sensor bereitgestellt werden.

Man kann das Ganze auch einfacher gestalten und einen einfachen Check auf den zu überwachenden Servern bauen und diese Skripte dann jeweils als Sensor in PRTG zum entspr. Host hinzufügen. Das ist aber nicht so sicher, wie die Vergleichsdateien auszulagern. Die Vorteile der Verwendung eines Monitoring Jump Hosts und gleichzeitig Ansible-Servers sind die, dass man

  • Sensoren in PRTG einspart und
  • eine zentrale und für die zu überwachenden Hostsysteme unerreichbare Vergleichsstelle hat (sofern ein ausreichendes Sicherheitskonzept vorliegt).

Das Konzept in ein Bash-Skript umgesetzt sieht z. B. wie folgt aus:

#!/bin/bash
e=0
c=0
txt=""
usr="ansible"
srv=$(hostname)
mkdir /home/$usr/iptables >/dev/null 2>&1
#
# Ansible-Host selbst
#
ms=$(sudo iptables -L -n|md5sum|cut -d' ' -f1)
if [ -f /home/$usr/iptables/$srv.txt ]
then
        e=$e
else
        sudo iptables -L -n > /home/$usr/iptables/$srv.txt 2>/dev/null
fi
msa=$(md5sum < /home/$usr/iptables/$srv.txt|cut -d' ' -f1)
if [ "$ms" == "$msa" ]
then
        e=$e
else
        txt=$txt', '$srv
        c=$(($c+1))
        e=1
fi
#
# Alle anderen Hosts, die von Ansible verwaltet werden
#
OIFS=$IFS
IFS=$'\n'
for ln in $(sudo -u $usr ansible all -m shell -a "iptables -L -n > /home/$usr/iptables.txt 2>/dev/null && chown $usr.$usr /home/$usr/iptables.txt 2>/dev/null && md5sum < /home/$usr/iptables.txt|cut -d' ' -f1" -o|sort)
do
        s=$(echo $ln|cut -d'|' -f1|sed 's/ //g')
        ms=$(echo $ln|cut -d'|' -f4|cut -d')' -f2|sed 's/ //g')
        if [ -f /home/ansible/iptables/$s.txt ]
        then
                e=$e
        else
                sudo -u $usr scp $s:/home/$usr/iptables.txt /home/$usr/iptables/$s.txt >/dev/null 2>&1
        fi
        msa=$(md5sum < /home/$usr/iptables/$s.txt|cut -d' ' -f1)
        if [ "$ms" == "$msa" ]
        then
                e=$e
        else
                txt=$txt', '$s
                c=$(($c+1))
                e=1
        fi
done
IFS=$OIFS
#
# Ausgabe
#
if [ ${#txt} -eq 0 ]
then
        txt=', OK'
fi
echo -n "$e:$c:"
echo $txt|cut -c3-
exit $e

Das unter /var/prtg/scripts/ auf dem Ansible-Server abgelegt kann, sofern der PRTG-Benutzer entspr. Zugriff darauf hat, in PRTG als Sensor (SSH-Skript) ausgewählt werden. Und wenn alles ok ist, sieht das so aus:

Die Bedienung ist sehr einfach:

  • Unter /home/ansible wird ein Verzeichnis angelegt, sofern es nicht existiert: iptables.
  • Dann wird ein Befehl mittels Ansible an alle Ansible-Hosts abgesetzt, wo eine Textdatei mit dem aktuellen iptables-Regelwerk angelegt und daraus eine MD5-Checksumme erstellt wird.
  • Anschließend wird geprüft, ob eine entsprechende Textdatei für den Host auf dem Ansible-Server vorhanden ist.
    • Wenn nicht, wird die auf dem Host befindliche Textdatei als gegeben hingenommen und per SCP auf den Ansible-Server kopiert.
  • Anschließend wird aus der entsprechenden Textdatei auf dem Ansible-Server ebenfalls eine MD5-Checksumme generiert und mit der vom Host verglichen.
    • Stimmen sie überein, ist alles ok. Wenn nicht, dann wird das Errorlevel erhöht und der entspr. Host aufgelistet.

Wenn sich an einem Regelwerk etwas ändert, genügt es die entspr. Datei auf dem Ansible-Server zu entfernen. Dann wird beim nächsten Check durch PRTG das aktuelle Regelwerk des Hosts auf den Ansible-Server kopiert und künftig für den Vergleich genommen.

Autor
Kategorien PRTG, Ansible

PRTG Map