Trust Port Counter für macmon

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.

Information

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

Die Werte 1-5 sind die Anzahl der möglichen Trust Vorgänge. Wollt ihr hier mehr haben, einfach die Werte um die gewünschte Zahl erweitern. Die Werte aber bitte immer 1-x durchnummerieren.
Durch die Vorgabe von Werten (im Screenshot = 1 bis 5 Vorgänge) wird verhindert, dass im Script ein nicht interpretierbarer Wert übergeben wird. Theoretisch kann auch die Option “Eigene Werte erlauben” aktiviert werden.

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

Regel Bedingung
interface.getUserProperty(system.interfaceUserProperty("TrustCount")).isEmpty().not()
Reaktion – Kommandopfad
/etc/macmon/userscripts/shellscript/trustcount.sh
Reaktion – Argumente
[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.

Shellscript – trustcount.sh
#!/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
Code Fenster erweitern

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

Trust Counter > 1
Das Gerät wird angelernt und das Script reduziert den Wert des “Trust Count” um 1.

Trust Counter = 1
Das Gerät wird angelernt und das Script löscht das Trust Flag und leert den “Trust Count” Wert. Ab jetzt ist der Port wieder ein normaler Port

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

Ein Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


WordPress Cookie Plugin von Real Cookie Banner