Beispiel: Parametrisierte Sensoren

Parametrisierte Sensoren fordern den Benutzer auf, einen Wert anzugeben, wenn Sie eine dynamische Frage stellen. Wenn Sie die Frage speichern, wird der Sensorwert Teil der Konfiguration der gespeicherten Frage. Wenn Sie dann die gespeicherte Frage ausgeben, gibt TaaSder Tanium Server automatisch den Sensorwert an. Erstellen Sie parametrisierte Sensoren, um bestimmte Werte von Endpunkten abzufragen, die oft variabel sind, z. B. Dateinamen, Prozessnamen und Registry-Schlüsselwerte.

Registry Value Data (Registry-Wert-Daten) ist ein von Tanium bereitgestellter parametrisierter Sensor. Wenn Sie diesen Sensor in einer dynamischen Frage verwenden, fordert TaaSder Tanium Server Sie auf, Werte für die Parameter Registry Key (Registry-Schlüssel) und Registry Value (Registry-Wert) anzugeben.

Abbildung 1:  Dynamische Frage mit parametrisiertem Sensor
Parametrisierter Sensor

Wenn Sie Werte angeben und auf Ask Question (Frage stellen) klicken, gibt TaaSder Tanium Server die Frage aus. Dann zeigt das Fragefeld die substituierten Werte an und das Raster Question Results (Fragenergebnisse) zeigt die Ergebnisse an.

Abbildung 2:  Ergebnisse einer dynamischen Frage mit einem parametrisierten Sensor

Wenn Sie eine Frage speichern, die einen parametrischen Sensor aufweist, wird die Sensordefinition, einschließlich der substituierten Werte, in einem Objekt gespeichert, das als temporärer Sensor bezeichnet wird. Am Endpunkt führt der Tanium Client den temporären Sensor aus, wenn er Antworten auf eine gespeicherte Frage berechnet, die ihn aufruft. Eine gespeicherte Frage, die gemäß einem Zeitplan neu ausgegeben wird, verwendet weiterhin den temporären Sensor, auch wenn der Sensor, auf dem sie basiert, aktualisiert wird. Wenn also ein Sensor aktualisiert wird und Sie möchten, dass die gespeicherte Frage den aktualisierten Code verwendet, müssen Sie die gespeicherte Frage erneut erstellen.

Sensorskript

Wenn Sie das Sensorskript entwickeln (siehe Einen Sensor erstellen), umschließen Sie die Eingabeparameter mit doppelten vertikalen Balken (||), wie ||strKey|| im folgenden Beispiel.

Abbildung 3:  Sensorskript

Der Tanium Server kodiert Parameterdaten, bevor er sie an das zugrunde liegende Skript weiterleitet, und die Daten müssen vor ihrem Gebrauch UTF-8-dekodiert werden. Das Sensorskript Registry Value Data (Daten des Registry-Werts), das in Abbildung 3 gezeigt wird, verwendet ein @include für das Skript i18n/UTF8Decode.vbs. Dieses Skript stellt sicher, dass die Benutzereingabe im Formular der Tanium Console korrekt codiert ist, wenn sie an das Sensorskript übergeben wird.

'- Begin file: i18n/UTF8Decode.vbs
'========================================
' UTF8Decode
'========================================
' Used to convert the UTF-8 style parameters passed from 
' the server to sensors in sensor parameters.
' This function should be used to safely pass non english input to sensors.
'-----
'-----
Function UTF8Decode(str)
    Dim arraylist(), strLen, i, sT, val, depth, sR
    Dim arraysize
    arraysize = 0
    strLen = Len(str)
    for i = 1 to strLen
        sT = mid(str, i, 1)
        if sT = "%" then
            if i + 2 <= strLen then
                Redim Preserve arraylist(arraysize + 1)
                arraylist(arraysize) = cbyte("&H" &mid(str, i + 1, 2))
                arraysize = arraysize + 1
                i = i + 2
            end if
        else
            Redim Preserve arraylist(arraysize + 1)
            arraylist(arraysize) = asc(sT)
            arraysize = arraysize + 1
        end if
    next
    depth = 0
    for i = 0 to arraysize – 1
		Dim mybyte
        mybyte = arraylist(i)
        if mybyte and &h80 then
            if (mybyte and &h40) = 0 then
                if depth = 0 then
                    Err.Raise 5
                end if
                val = val * 2 ^ 6 + (mybyte and &h3f)
                depth = depth – 1
                if depth = 0 then
                    sR = sR &chrw(val)
                    val = 0
                end if
            elseif (mybyte and &h20) = 0 then
                if depth >0 then Err.Raise 5
                val = mybyte and &h1f
                depth = 1
            elseif (mybyte and &h10) = 0 then
                if depth >0 then Err.Raise 5
                val = mybyte and &h0f
                depth = 2
            else
                Err.Raise 5
            end if
        else
            if depth >0 then Err.Raise 5
            sR = sR &chrw(mybyte)
        end if
    next
    if depth >0 then Err.Raise 5
    UTF8Decode = sR
End Function
'- End file: i18n/UTF8Decode.vbs

In Shellscripts können Sie eine Funktion ähnlich der nachfolgenden verwenden, um die Parameterdaten zu dekodieren:

#!/bin/sh

percent_decode() {
        local data=$(echo "$1" | sed 's/%/\\\x/g')
        /usr/bin/printf '%b' "$data"
}

myVariable=`percent_decode "||parameter_value||"`

Das printf-Dienstprogramm ist eventuell nicht verfügbar oder funktioniert möglicherweise nicht korrekt auf allen Linux-, MacOS- und UNIX-Plattformen. Eine narrensichere aber weniger elegante Implementierung ist:

#!/bin/sh 

brute_force_percent_decode() {
        # decode everything between 0x20-0x7E except:
        #0 1 2 3 4 5 6 7 8 9 (0x30-0x39)
        #A B C D E F G H I J K L M N O P Q R S T U V W X Y Z (0x41-0x5A)
        #a b c d e f g h i j k l m n o p q r s t u v w x y z (0x61-0x7A)
        echo "$1" | sed -e 's/%20/ /g' \
        -e 's/%21/!/g' \
        -e 's/%22/"/g' \
        -e 's/%23/#/g' \
        -e 's/%24/$/g' \
        -e 's/%25/%/g' \
        -e 's/%26/\&/g' \
        -e "s/%27/'/g" \
        -e 's/%28/(/g' \
        -e 's/%29/)/g' \
        -e 's/%2[aA]/*/g' \
        -e 's/%2[bB]/+/g' \
        -e 's/%2[cC]/,/g' \
        -e 's/%2[dD]/-/g' \
        -e 's/%2[eE]/./g' \
        -e 's#%2[fF]#/#g' \
        -e 's/%3[aA]/:/g' \
        -e 's/%3[bB]/;/g' \
        -e 's/%3[cC]/</g' \
        -e 's/%3[dD]/=/g' \
        -e 's/%3[eE]/>/g' \
        -e 's/%3[fF]/?/g' \
        -e 's/%40/@/g' \
        -e 's/%5[bB]/[/g' \
        -e 's/%5[cC]/\\/g' \
        -e 's/%5[dD]/]/g' \
        -e 's/%5[eE]/^/g' \
        -e 's/%5[fF]/_/g' \
        -e 's/%60/`/g' \
        -e 's/%7[bB]/{/g' \
        -e 's/%7[cC]/|/g' \
        -e 's/%7[dD]/}/g' \
        -e 's/%7[eE]/-/g'
}

myVariable=`brute_force_percent_decode "||parameter_value||"`

Einstellungen für die Parametereingabe

Parameter-Eingaben, die Sie in einer Sensorkonfiguration festlegen, bestimmen die Einstellungen, zu deren Konfiguration Tanium Console Benutzer bei der Ausgabe einer Frage mit parametrisierten Sensoren aufgefordert werden (siehe Fragen mit parametrisierten Sensoren). Geben Sie im Feld Key (Schlüssel) die Parameternamen ein, die im Skript verwendet werden. Geben Sie keine doppelten vertikalen Balken (||) ein. Die Balken werden automatisch eingeschlossen, wenn Sie einen Parameter hinzufügen.

Abbildung 4:  Parametereingaben

Das häufigste Widget für die Benutzereingabe ist ein Textfeld, aber Sie können eine der folgenden Optionen auswählen:

  • Kontrollkästchen: Durch Markieren eines Kästchens kann der Benutzer eine Einstellung aktivieren. Der Wert 0 oder 1 wird in die Variable eingegeben. Der Sensor gibt 1 zurück, wenn aktiviert und 0, wenn nicht aktiviert.
  • Datum, Datum/Uhrzeit, Datum – Zeitspanne: Der Benutzer wählt ein Datum und eine Uhrzeit oder eine Datums-Zeitspanne aus. Das Datum/Uhrzeit-Format wird in Millisekunden angegeben. Für einen Bereich gibt der Benutzer zwei Datum-Uhrzeit-Angaben an, die durch ein Pipe-Zeichen getrennt sind.
  • Dropdown-Liste: Der Benutzer wählt nur eine Option aus einer Liste aus.
  • Liste: Der Benutzer wählt eine oder mehrere Werte aus. Mehrere Werte werden durch ein Pipe-Zeichen getrennt.
  • Numerisch: Der Benutzer gibt eine Zahl ein. Die Eingabe kann mit Minimal- und Maximalwerten gesteuert werden. Sie können eine Schrittgröße angeben, um zu verlangen, dass die Eingabe durch den angegebenen Wert teilbar ist. Snap Zeitabstand ist der Betrag, um den eine Zahl durch Drücken der Aufwärts- bzw. Abwärts-Taste erhöht oder verringert wird. Der Wert für Schrittgröße sollte ein Vielfaches des Wertes für Snap Zeitabstand sein, es sei denn, der Snap Zeitabstand ist 0. Die vom Benutzer gewählte Zahl wird in die Variable eingegeben.
  • Numerisches Intervall: Der Benutzer wählt eine Zahl und ein Element aus einer Liste aus. Das Listenelement hat einen numerischen Wert. Der in die Variable eingegebene Wert ist das Ergebnis der Multiplikation. Wenn ein Benutzer beispielsweise eine 2 und „Hoch“ wählt (wobei hoch ein Wert von 3 bedeutet), lautet der Wert in der Variablen 6.
  • Trennzeichen: Ein Trennzeichen ist eine grafische Methode, um Abschnitte im Benutzereingabeformular zu trennen.
  • Textbereich: Der Benutzer gibt eine große Textmenge ein. Der Text wird in die Variable eingegeben.
  • Texteingabe: Der Benutzer gibt Texteingaben ein. Zulässige Einträge können mit regulären Ausdrücken gesteuert werden. Die Benutzereingabe wird in die Variable eingegeben.
  • Zeit: Der Benutzer wählt eine Zeit aus einer Dropdown-Liste aus. Die Eingabe kann Einschränkungen unterliegen.