Das Trust Flag in macmon ist entweder an oder aus. Soll das Flag nur für eine definierte Anzahl an Trust-Vorgängen aktiviert und dann wieder automatisch deaktiviert werden, schafft diese Konfiguration Abhilfe: Der "Trust Port Counter für macmon"
Einleitung
In macmon ist bisher (Stand Version 5.36.0) nicht vorsehen, dass ein Trust Flag nach einer bestimmten Anzahl von Vorgängen wieder automatisch entfernt wird. Da diese Anforderung in einem Projekt kam - und ich finde die Funktion auch durchaus sehr praktisch - habe ich mich an die Umsetzung einer Lösung gesetzt.
Trotzdem kann der Trust Port noch dauerhaft gesetzt werden. Praktisch? Lasst es uns in den Kommentaren gerne wissen was Ihr davon haltet.
Dieses How-To setzt erweiterte Kenntnisse in macmon und den Umgang mit der Linux Shell voraus.
Wir übernehmen keine Haftung für mögliche Fehler die an Eurer Installation durch die beschriebene Umsetzung erfolgen könnten.
Konfiguration
Variable anlegen
Zunächst füget Ihr den Interfacen eine benutzerdefinierte Variable hinzu. Diese Variable definiert die maximale Anzahl an Trust Ereignissen die an einem Port durchgeführt werden dürfen bis das Trust Flag wieder entfernt wird.
Einstellungen -> Benutzerdefinierte Eigenschaften -> Eigenschaft hinzufügen
Richlinie anlegen
Eine Regel anlegen die abhängig von der neuen Eigenschaft ein Script ausführt welches letztendlich die "Magie" ist.
Die Richtlinie wird bei einem Trust Ereignis ausgeführt sobald die Variable TrustCount gesetzt ist, sonst nicht.
Richtlinien->Ereignisse->Regel hinzufügen
interface.getUserProperty(system.interfaceUserProperty("TrustCount")).isEmpty().not()
/etc/macmon/userscripts/shellscript/trustcount.sh
[interface.getDevice().getId().getNumberAsString(),interface.getIndex().getNumberAsString(),interface.getUserProperty(system.interfaceUserProperty("TrustCount"))]
Script im Filesystem ablegen
Das Script müsst Ihr im Verzeichnis "/etc/macmon/userscripts/shellscript/trustcount.sh" ablegen und mit "chmod +x trustcount.sh" ausführbar machen.
#!/bin/bash
# Übergabeparameter prüfen
# $1 = ID des Netzwerkgerätes
# $2 = ID des Interfaces von Netzwerkgerät $1
# $3 = Wert des Trust Counters
if [ -z $1 ]; then
echo "Keine ID fuer ein Netzwerkgeraet angegeben!"
exit 1
else
DEVICE=$1
fi
if [ -z $2 ]; then
echo "Keine ID fuer ein Netzwerkgeraete-Port angegeben!"
exit 1
else
PORT=$2
fi
if [ -z $3 ]; then
echo "Wert des aktuellen Trust Counters eingeben!"
exit 1
else
TRUST=$3
fi
# Aktuellen Trust Counter um 1 reduzieren
if [ $TRUST -gt 0 ]; then
((TRUST--))
fi
# Aktion ausführen anhand neuem Wert
# größer 0
if [ $TRUST -gt 0 ]; then
# Updatestring zusammenbauen
UPDATESTRING="[{\"op\": \"replace\", \"path\": \"/interfaces/$PORT/userValues/TrustCount/value\", \"value\": \"$TRUST\"}]"
# URL für API Aufruf
URL="http://localhost:9090/api/v1.0/networkdevices/$DEVICE"
# API Call
HTTP_RESPONSE=$(curl --silent --insecure --write-out "HTTPSTATUS:%{http_code}" -H "Content-type: application/json" -X PATCH -d "$UPDATESTRING" $URL)
# Antwort auf API Call
HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
# Return Code aus API Call
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
# Status Code prüfen
if [ ! $HTTP_STATUS -eq 204 ]; then
echo "Error PATCH [HTTP status: $HTTP_STATUS]"
echo "$HTTP_BODY"
exit 1
fi
# gleich 0
elif [ $TRUST -eq 0 ]; then
# Updatestring zusammenbauen
UPDATESTRING="[{\"op\": \"remove\", \"path\": \"/interfaces/$PORT/userValues/TrustCount/value\"}, {\"op\": \"remove\", \"path\": \"/interfaces/$PORT/flag\"}]"
# URL für API Aufruf
URL="http://localhost:9090/api/v1.0/networkdevices/$DEVICE"
# API Call
HTTP_RESPONSE=$(curl --silent --insecure --write-out "HTTPSTATUS:%{http_code}" -H "Content-type: application/json" -X PATCH -d "$UPDATESTRING" $URL)
# Antwort auf API Call
HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
# Return Code aus API Call
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
# Status Code prüfen
if [ ! $HTTP_STATUS -eq 204 ]; then
echo "Error PATCH [HTTP status: $HTTP_STATUS]"
echo "$HTTP_BODY"
exit 1
fi
fi
Funktionsweise
Trust Counter setzen und nutzen
In der Interfaceansicht des Switches sowohl das Trust Flag setzen, als auch einen Wert bei Trust Count auswählen. Wird kein Trust Count gewählt, ist der Port dauerhaft Trusted!
Gerät an Trust Port anschließen
Weitere Ausbaustufen
Aktuell fallen mir noch weitere Umsetzung als Erweiterung ein. Diese sind aber nicht in meiner oben beschriebenen Umsetzung berücksichtigt.
- Trust Flag nach x Stunden entfernen
- In das Kommentarfeld die angelernten MAC Adressen und Zeitpunkt hinterlegen
Danke für den tollen Ansatz! Ich habe letzte Woche dein Script implementiert. Klappt super.