Tanium ist eine unglaublich leistungsstarke Plattform, und viele Nutzer müssen möglicherweise Daten mit ihren eigenen Tools aus Tanium extrahieren. Tanium Connect kann Daten jederzeit exportieren und an ein Produkt, einen Server bzw. eine Datei senden; manchmal kann es jedoch vorkommen, dass Benutzer Daten manuell abrufen müssen, anstatt sie zu übernehmen. Das neue API-Gateway von Tanium kann diesen Vorgang zu einem Kinderspiel machen. In diesem Blogbeitrag werde ich Ihnen zeigen, wie Sie sich über Python bei Tanium anmelden und Rechnerdaten abfragen können.
Anforderungen
- Eine Tanium-Umgebung, in die die neueste API-Gateway-Lösung importiert wurde. Dieser Blog wurde mit Version 1,3,64,0000 getestet.
- Python 3 with “requests” and “JSON” libraries
Authentifizierung
Bevor wir mit dem Abruf von Daten aus Tanium beginnen können, müssen wir sicherstellen, dass wir uns anmelden können. Es gibt zwei Möglichkeiten, sich anzumelden: entweder mit einem Tanium-Benutzernamen und -Passwort oder mit einem API-Token. Die Anmeldung mit Benutzername und Passwort ist nicht möglich, wenn Sie sich über SSO anmelden oder Tanium Cloud verwenden; in diesem Fall müssen Sie daher ein API-Token verwenden, sofern dies in Ihrer Tanium-Umgebung zutrifft.
Erstellen eines API-Tokens
Um ein API-Token zu erstellen, melden Sie sich bitte wie gewohnt bei Ihrem Tanium-Server an und suchen Sie im Menü „Administration“ die Option „API-Token“.

Nachdem Sie die Seite „API-Token“ aufgerufen haben, können Sie auf die Schaltfläche „Neues API-Token“ auf der rechten Seite des Bildschirms klicken. Auf diese Weise können Sie ein Token erstellen und festlegen, wie lange das Token gültig ist und welche API-Adressen dieses API-Token verwenden dürfen. Nachdem Sie das Modalfenster ausgefüllt haben, erscheint ein Popup-Fenster, in dem das Token für einen begrenzten Zeitraum angezeigt wird. Bitte notieren Sie sich das Token, da es nach dem Schließen des Popups nicht mehr angezeigt werden kann.
Anmeldung bei Tanium mit Benutzername und Passwort
Falls in Ihrer Tanium-Umgebung kein SSO für die Anmeldung verwendet wird, können Sie sich mit Ihrem Benutzernamen und Passwort authentifizieren und die Tanium-API nutzen. Die folgende Funktion ist ein Beispiel dafür, wie wir uns mit einem Benutzernamen und einem Passwort beim Tanium-Server anmelden und das Sitzungstoken abrufen können.
[Hinweis: Dieses Sitzungstoken läuft nach einer bestimmten Zeit der Inaktivität ab, sodass Sie sich gegebenenfalls erneut authentifizieren müssen.]
Codeblock 1: Abrufen eines Sitzungstokens über Benutzername und Passwort
def loginUsernamePassword(ts: str, username: str, password: str) -> str:
"""
Beispielfunktion zur Anmeldung bei einem Tanium-Server über
mit einer Kombination aus Benutzername und Passwort. Dadurch wird das Sitzungstoken von
zurückgegeben.
Der Parameter „ts“ gibt den zu verwendenden Tanium-Server an.
Der Parameter „username“ gibt den Benutzernamen an, der bei der Anmeldung verwendet werden soll.
Der Parameter „password“ gibt das Passwort an, das bei der Anmeldung verwendet werden soll.
"""
payload = {}
payload["username"] = username
payload["password"] = password
r = requests.post(f"{ts}/api/v2/session/login",
json=payload
)
session_token = r.json()['data']['session']
print(f"Bei der Anmeldung erhaltener Statuscode: {r.status_code}")
return session_token
Testen der Authentifizierung
Sobald wir ein API-Token erstellt haben, können wir mit dem Testen der Authentifizierung beginnen. Das API-Token muss in allen HTTPS-Anfragen an den Tanium-Server als Header hinzugefügt werden. Nachdem wir das Sitzungstoken entweder über die Seite „API-Token“ in der Tanium-Konsole oder durch die Anmeldung mit einer Kombination aus Benutzername und Passwort erhalten haben, werden wir überprüfen, ob das Token ordnungsgemäß funktioniert. Dies kann durch Aufruf der Route /api/v2/session/validate auf dem Tanium-Server erfolgen. Der folgende Funktionsblock enthält ein Beispiel dafür, wie dies umgesetzt werden kann.
Codeblock 2: Überprüfung der Gültigkeit eines API-/Sitzungstokens
def validateToken(ts: str, token: str):
"""
Beispielfunktion zur Überprüfung, ob ein API-Token in der Lage ist,
den Tanium-Server anzusteuern und eine 200 -Antwort zu erhalten.
Der Parameter „ts“ gibt den zu verwendenden Tanium-Server an.
Beispiel: 'https://MyTaniumServer.com'
Der Parameter „token“ ist die API-Token-Zeichenkette, die über die TS-Benutzeroberfläche generiert wurde.
"""
r = requests.post(f"{ts}/api/v2/session/validate",
json={'session': token},
headers={'session': token}
)
# Der `status_code` sollte bei erfolgreicher Validierung des Tokens den Wert 200 annehmen.
print(f"Statuscode nach der Validierung des Tokens: {r.status_code}.")
Verwendung des API-Gateways und von GraphQL
Nachdem wir uns erfolgreich beim Tanium-Server angemeldet und unser Token validiert haben, können wir damit beginnen, Abfragen an das API-Gateway zu senden, um Informationen über die Umgebung abzurufen. Falls Sie GraphQL bisher noch nicht verwendet haben, empfiehlt es sich, einen Blick in die Dokumentation zu werfen, um sich einen kurzen Überblick darüber zu verschaffen, was GraphQL ist und wie die Abfragesprache funktioniert. Die Website finden Sie hier: https://graphql.org/learn/ (wird in einem neuen Tab geöffnet).
Bevor wir Prozesse über die Tanium-API automatisieren, können wir im API-Gateway der Tanium-Konsole die Datenfelder erkunden, die wir abfragen können. Abbildung 2 zeigt, wo Sie auf den Bereich „API Gateway“ der Tanium-Konsole zugreifen können.

Sobald wir diese Seite aufrufen, wird eine interaktive GraphQL-IDE angezeigt, mit der wir verschiedene Abfragen erkunden und damit experimentieren sowie echte Daten abrufen können. Siehe Abbildung 3 , in der wir eine erste Abfrage ausführen können, um die vom Server gemeldete aktuelle Uhrzeit anzuzeigen.

Mithilfe der interaktiven GraphQL-Abfrage in der Tanium-Konsole können wir unsere Abfragen erkunden und erstellen, die wir anschließend in unser Python-Skript übernehmen können, um sie zu automatisieren. Beispielsweise können wir eine sehr einfache Python-Funktion erstellen, die dieselbe Abfrage „{now}“ ausführt, wie unten gezeigt.
Codeblock 3: Ausführung der „now“-Abfrage über Python
def graphQLQueryNow(ts: str, token: str):
"""
graphQLQueryNow führt die GraphQL-Abfrage „now“
auf dem Tanium-Server aus, der an diese Funktion übergeben wird.
Der Parameter „ts“ gibt den zu verwendenden Tanium-Server an.
Der Parameter „token“ ist die API-Token-Zeichenkette, die über die TS-Benutzeroberfläche generiert wurde.
"""
jsonObj = {'query': "{now}"}
r = requests.post(ts + "/plugin/products/gateway/graphql",
json=jsonObj,
headers={'session': token},
)
print(f"Von der 'now'-Abfrage erhaltener Statuscode: {r.status_code}")
print(f"JSON-Antwort der 'now'-Abfrage: {r.json()}")
Dies ist ein guter Anfang, um die erste Tanium-Abfrage über Python auszuführen, doch lassen Sie uns nun versuchen, Endpunktdaten aus dem interaktiven GraphQL-Explorer in der Tanium-Konsole abzurufen. Das folgende Foto zeigt, wie wir alle Endpunkte und deren Betriebssysteme abfragen können.

Damit erhalten wir nun endlich die Endpunktdaten, doch es fehlt noch ein letztes Puzzlestück. Sofern Ihre Umgebung nicht aus höchstens 20 Rechnern besteht, werden Sie feststellen, dass diese Daten nicht die Informationen für die gesamte Umgebung liefern. Bei GraphQL ist die Paginierung standardmäßig aktiviert, was bedeutet, dass wir mehrere Anfragen stellen müssen, um einen vollständigen Datensatz der gesamten Umgebung zu erhalten. Erweitern wir unsere Abfrage, um Paginierungsinformationen anzuzeigen, damit wir wissen, wie wir diese bei der Automatisierung mittels eines Python-Skripts auswerten können.

Wenn diese „pageInfo“-Daten aktiviert sind, können wir anhand des Feldes „hasNextPage“ erkennen, ob auf dem Server noch weitere Daten zum Auswerten vorhanden sind. Darüber hinaus können wir anhand der Felder „startCursor“ und „endCursor“ nachvollziehen, an welcher Stelle wir uns innerhalb des Datensatzes befinden. Wenn wir den nächsten Datensatz abrufen möchten, können wir einfach ein „(after: ‚lastcursor‘)“ in unsere Endpunktabfrage einfügen, wie unten dargestellt.

Wir können feststellen, dass, wenn wir dieses „after“-Argument in die Endpoints-Abfrage einfügen, die resultierenden Daten die nächste Gruppe von 20 Rechnern darstellen. Da wir nun wissen, wie man die Daten paginiert, können wir endlich alles in einem Python-Skript zusammenfassen, das eine automatisierte Abfrage für uns ausführt.
Code-Block 4: Alles zusammenführen, um vollständige Datensätze abzufragen
def graphQL_pagination(ts: str, token: str):
"""
„graphQL_pagination“ enthält die Namen aller Endpunkte sowie Informationen zur Verwendung von GraphQL und Paginierung unter
.
Der Parameter „ts“ gibt den zu verwendenden Tanium-Server an.
Der Parameter „token“ ist die API-Token-Zeichenkette, die über die TS-Benutzeroberfläche generiert wurde.
"""
init_query = '''
{
endpoints {
pageInfo {
startCursor
endCursor
hasNextPage
}
edges {
node {
name
os {
name
}
}
}
}
}
'''
def do_request(ts: str, token: str, queryString: str) -> requests.Response:
r = requests.post(ts + "/plugin/products/gateway/graphql",
json={'query': queryString},
headers={'session': token},
)
return r
endpoint_data = []
next_query = init_query
while True:
# Die Anfrage ausführen und die Antwort als JSON formatieren
r = do_request(ts, token, next_query)
resp_obj = r.json()
# Extrahieren Sie die Seiteninformationen aus dem JSON-Objekt
has_next_page = resp_obj["data"]["endpoints"]["pageInfo"]["hasNextPage"]
end_cursor = resp_obj["data"]["endpoints"]["pageInfo"]["endCursor"]
start_cursor = resp_obj["data"]["endpoints"]["pageInfo"]["startCursor"]
# Dem Benutzer mitteilen, an welcher Stelle des Cursors wir uns gerade befinden.
print(
f"Daten für Endpunkte zwischen Start: {start_cursor} und Ende: {end_cursor} empfangen.")
# Fügen Sie die Endpunktdaten in unser Listenobjekt ein
endpoint_data.extend(resp_obj["data"]["endpoints"]["edges"])
# Wenn die nächste Seite „False“ ist, dann haben wir das Ende des Datensatzes erreicht!
if not has_next_page:
break
# Fügen Sie das Argument „after“ in die ursprüngliche Abfrage ein
next_query = init_query[:25] + \
f"(after: \"{end_cursor}\") " + init_query[25:]
Hoffentlich erhalten Sie hiermit einen ersten Einblick in die Nutzung des API-Gateways außerhalb von Tanium. Bitte beachten Sie, dass sich viele Anwendungsfälle bereits durch die Verwendung der von Tanium Connect bereitgestellten nativen Konnektoren realisieren lassen. Wenn Sie eine maßgeschneiderte Integration erstellen müssen, ist das API-Gateway eine äußerst hilfreiche Ressource, und jede Woche kommen neue Funktionen hinzu – darunter auch die Unterstützung von Modulen. Wenden Sie sich bitte an Ihren Tanium-Ansprechpartner, um weitere Informationen zu den einzelnen Punkten der Roadmap zu erhalten oder Unterstützung bei Ihren API-Gateway-Projekten zu erhalten.
Erfahren Sie, wie Sie das volle Potenzial der Tanium-Plattform mit der „ “ ausschöpfen können: Tanium Integrations Gallery (wird in einem neuen Tab geöffnet) – eine zentralisierte Konsole, die in Echtzeit Einblick in alle unsere Integrationen bietet und es Kunden ermöglicht, diese mühelos zu finden, zu konfigurieren und bereitzustellen. Durch die Vereinfachung und Beschleunigung der Integration der Tanium-Plattform mit wichtigen Technologiepartnern wie Microsoft, ServiceNow und anderen maximiert die Tanium Integrations Gallery den Nutzen von Technologieinvestitionen und reduziert gleichzeitig Risiken sowie betriebliche Ineffizienzen.




