An welchem Port befindet sich der Host?

Diese Frage muss natuerlich beantwortet sein, wenn ich Rechner die einen Virus haben automatisch in ein VLAN packen moechte. Gestern habe ich geschrieben, wie man auf den FSM726v2 einen Port via SNMP automatisch in ein VLAN setzt. Heute geht es nun darum, basierend auf einer MAC-Adresse, in unserem Wohnheim herauszufinden, auf welchem Switch und an welchem Port darauf ein Rechner sitzt, bzw. DER vireninfizierte Rechner sitzt. Es gab dafuer bei uns im Tutorium ein perl-Skript, das fuer diese Aufgabe gute 4 1/2 Minuten benoetigte.  Wir haben so um die 45 Switche bei uns im Wohnheim.

Meine erste Loesung in bash dauerte ca. doppelt so lange wie das perl Skript, aber nachdem ich das ganze noch einmal ueberdacht hatte bekomme ich die gewuenschte Information nun in Sekunden. Das Skript in dieser Form funktioniert fuer FSM726v2 und FSM7328 Switche, sollte aber ohne Probleme wenn man die OIDs anpasst auch fuer alle anderen Switchtypen funktionieren.  Hier das Skript:

#!/bin/bash
 
##
# sucht nach mac-adressen auf den switchen und
# gibt den port aus, auf dem sie zu finden ist
#
# syntax: ./mac-port.sh 00:11:22:33:44:55
#
# 04/2009 - Jan Toenjes - jan@atw.goe.net
##
 
# Ueberpruefen ob uns eine gueltige MAC-Adresse uebergeben wurde
VALID=$( echo $1 | sed -n "/^\([0-9A-Z][0-9A-Z]:\)\{5\}[0-9A-Z][0-9A-Z]$/p" )
 
if [ -z $VALID ]; then
  echo ""
  echo " syntax: $0 00:11:22:33:44:55"
  echo ""
  echo ""
  echo " Dem Skript muss eine gueltige MAC-Adresse als Parameter uebergeben werden."
  echo ""
  echo " Version: 0.1 von Jan Toenjes - jan@atw.goe.net "
  echo ""
 
else
 
# SWITCHE1 = FSM726v2 ; SWITCHE2 = FSM7328
SWITCHE1="1.1.1.1 1.1.1.2 1.1.1.3 "
SWITCHE2="1.1.2.1 1.1.2.2"
 
# Zeugs
OID1=".1.3.6.1.2.1.17.4.3.1.2"
OID2="SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.1"
MACDEC=""
 
# Doppelpunkte aus MAC-Adresse entfernen
MACSPLIT=`echo $1 | sed 's/:/ /g'`
 
# MAC-Adresse von HEX in DEC konvertieren
for i in $MACSPLIT ; do
  MACDEC=$MACDEC.$(echo "ibase=16; $i"| bc) ;
done
 
# Gucken ob die MAC-Adresse auf dem Switch FSM726v2 vorhanden ist und wenn ja welcher Port
for i in $SWITCHE1 ; do
  RESULT1=`snmpget -v1 -c tutrw $i $OID1$MACDEC 2>&1 | head -1 | grep INTEGER`;
  # Port extrahieren
  RESULT2=`echo $RESULT1 | sed 's/.*INTEGER: //g'` ;
  # Wenn kein Uplink-Port dann Info ausgeben
  if ([ "$RESULT2" != "25" ] && [ "$RESULT2" != "26" ]  && [ -n "$RESULT2" ]); then
    echo Mac-Adresse: $1 gefunden auf Switch $i und Port $RESULT2
  fi
done
 
# und das gleiche auch noch einmal fuer die FSM7328
for i in $SWITCHE2 ; do
  RESULT1=`snmpget -v1 -c tutrw $i $OID2$MACDEC 2>&1 | head -1 | grep INTEGER`;
  RESULT2=`echo $RESULT1 | sed 's/.*INTEGER: //g'` ;
 
  if ([ "$RESULT2" != "25" ] && [ "$RESULT2" != "26" ] && [ "$RESULT2" != "27" ] && [ "$RESULT2" != "28" ] && [ -n "$RESULT2" ]); then
    echo Mac-Adresse: $1 gefunden auf Switch $i und Port $RESULT2
  fi
done
 
fi

Netgear FSM726v2 set VLAN via SNMP

Ich hab extra ein Ticket geschrieben um mir das rumfummeln in dem Bereich zu ersparen, aber Netgear konnte mir leider keine Antwort darauf geben, wie ich auf den FSM726v2 bei bereits eingerichteten VLANs dann via SNMP einem Port ein VLAN zuweise. Hintergrund der Geschichte ist, dass ich bei uns im Wohnheim gerne Rechner die einen Virus haben in ein eigenes VLAN stecken moechte. Doch nun hier erstmal die Antwort:

Der interessante Bereich beim FSM726v2 beginnt ab der OID: 1.3.6.1.4.1.4526.1.10

Die OIDs die fuer das VLAN verantwortlich sind lauten: 1.3.6.1.4.1.4526.1.10.11.6.1.12

Beispiel: In welchem VLAN ist Port 20 auf dem Switch 10.10.97.8:

snmpget -v1 -c private 10.10.97.8 1.3.6.1.4.1.4526.1.10.11.6.1.12.20
SNMPv2-SMI::enterprises.4526.1.10.11.6.1.12.20 = INTEGER: 1

Beispiel: Port 20 auf Switch 10.10.97.8 soll ins VLAN 2:

snmpset -v1 -c private 10.10.97.8 1.3.6.1.4.1.4526.1.10.11.6.1.12.20 int 2
SNMPv2-SMI::enterprises.4526.1.10.11.6.1.12.20 = INTEGER: 2

Schade das ich das Ticket nicht mehr aufmachen kann um das dem doch sehr netten und freundlichen Mitarbeiter von Netgear rueckzumelden…

Xen, BackupPC und speed2fritz && Freetz

Mit allem habe ich mich an diesem Wochenende sehr intensiv und zum Ende auch erfolgreich beschaeftigt. Ich wollte zu alldem noch was schreiben, aber ich bin zu platt, deswegen nur die Ergebnisse:

  • Xen – Ersten produktiven Xen-Server unter Debian vollstaendig aufgesetzt, 3 Maschinen in domUs migriert, Monitoring der VMs via Nagios
  • BackupPC – Bevor das Backup von unserem Wohnheim-Webserver ausgefuehrt wird, werden nun die MySQL DBs darauf via Skript gesichert
  • speed2fritz && Freetz – Meinen Speedport W701V neu geflasht und Freetz hinzugefuegt. Jetzt u.a. mit WOL-Webinterface

check_rogue – Nagios Plugin zum erkennen von rogue DHCP

Bereits vor einiger Zeit schrieb ich darueber, dass wir bei uns im Wohnheim Probleme mit einem rogue DHCP hatten. Vorlon schrieb in einem Comment, das auch das SANS Diary das Problem beschreibt. Auch Heise war das ganze inzwischen einen Artikel wert! Wir haben bei uns im Internettutorium verschiedene Gegenmassnamen ergriffen, die fuer andere evtl. auch von Interesse sein koennen, deswegen an dieser Stelle mal kurz festgehalten:

Sperrung via iptables

Bei uns in der Firewall wird die gesamte Range in der die „boesen“ DNS-Server stehen auf Port 53 gesperrt. Der Zugriff wird geloggt, und stuendlich checken wir die Logfiles, ob es einen Zugriff gab. Wenn ja, dann gibts ne Mail.

Die iptables-Regeln im Firewall Skript lauten wie folgt:

iptables -F ukr_dns
iptables -X ukr_dns
iptables -N ukr_dns
iptables -A ukr_dns -j LOG -m limit --limit 90/h --log-prefix "FW: MALDNS "
iptables -A ukr_dns -j REJECT
iptables -I FORWARD -p udp --dport 53 -d 85.255.112.0/255.255.255.0 -j ukr_dns
iptables -I FORWARD -p tcp --dport 53 -d 85.255.112.0/255.255.255.0 -j ukr_dns

Der dazugehoerige crontab-Einzeiler-Eintrag lautet wie folgt:

0 *     * * *    root    /bin/grep MALDNS /var/log/syslog | grep -v CRON | \
mail -e -s "MALDNS-Report /bin/date -I" vir-reports@mydomain.tld

check auf rogue DHCP mit Nagios

neben dieser mehr schadensbegrenzenden Massname wenn bereits etwas passiert ist, ueberpruefen wir unser Netz auf rogue DHCP Server mit einem Nagios-Skript. Das Skript ist ein Wrapper zu dhcp_probe.
Leider ist dhcp_probe nicht direkt fuer Debian Linux verfuegbar. Das bedeutet im Klartext, dass ein bisschen Handarbeit angesagt ist, zumal es auch unter Debian Linux erst nach einer Modifikation von libnet funktioniert.

Als erstes muss man natuerlich die benoetigten *-dev Pakete installieren und wenn nicht bereits passiert auch die build-essential

aptitude install libpcap-dev build-essential

Das installieren vom libnet-dev Paket aus apt wuerde das compilieren von dhcp_probe nicht zu einem Erfolg bewegen, da die in Debian etch enthaltene Version eine wichtige Funktion nicht mitbringt. Siehe dazu auch den entsprechenden Eintrag in der INSTALL.dhcp_probe. Deswegen lautet der naechste Schritt libnet herunterzuladen, entpacken und entsprechend zu patchen.

wget http://www.packetfactory.net/libnet/dist/libnet.tar.gz
tar -xzvf libnet.tar.gz

Wie in der bereits verlinkten INSTALL.dhcp_probe unter Punkt 2. beschrieben nun die beiden Dateien ./src/libnet_cq.c und ./include/libnet/libnet-functions.h bearbeiten, den entsprechenden Code unten einfuegen. Der Dreisatz aus ./configure, make sowie make install als root fuehrt einen dann zum gewuenschten Ergebnis.
Ab dieser Stelle ist nun auch ein compilieren von dhcp_probe von Erfolg gekroent.

wget http://www.net.princeton.edu/software/dhcp_probe/dhcp_probe-1.2.2.tar.gz

entpacken, compilieren und installieren. Wenn man bis zu diesem Punkt ohne Fehler gekommen ist, ist schon der grossteil der Arbeit geschafft. Es fehlt noch dhcp_probe zu konfigurieren. Eine Beispiel-Konfigurationsdatei liegt dem Quelltext mit bei. Einfach aus dem entpackten Verzeichnis heraus ein

cp extras/dhcp_probe.cf.sample /etc/dhcp_probe.cf

machen und durchlesen. Der wichtigste Eintrag ist der Punkt legal_server, bei dem evtl. intendiert vorhandene Server angegeben werden sollten. Uebrigens ein guter Punkt bei dem man testen kann, ob dhcp_probe auch gut funktioniert.

Wenn all diese Vorraussetzungen erfuellt sind, kommt es endlich zu dem Nagios wrapper Skript fuer dhcp_probe. Die folgende Datei /usr/lib/nagios/plugins/ ablegen:

Nun noch fix in Nagios ein command und definiert:

/etc/nagios2/commands.cfg

define command{
        command_name    check_rogue
        command_line    $USER1$/check_rogue
        }

und schon kann ich den Check auf dem Client einrichten, auf dem das Skript liegt und dhcp_probe installiert ist. Bei uns sieht das ganze dann so aus:

nag_rogue_ok

nag_rogue_detected

Ja, ich weiss, das das Plugin nicht schoen geschrieben ist, aber es tut seinen zweck. Und an dieser Stelle nochmal herzlichen Dank an Matthias, Alex und Sebastian bei der Hilfe das ganze zu entdecken und zu beheben etc. :-)