Tanium es una plataforma increíblemente potente, y es posible que muchos usuarios necesiten extraer datos de Tanium utilizando sus propias herramientas. Tanium Connect siempre puede exportar datos y enviarlos a un producto, un servidor o un archivo, respectivamente; sin embargo, en ocasiones los usuarios pueden necesitar extraer los datos manualmente en lugar de recibirlos. La nueva API Gateway de Tanium puede facilitar enormemente este proceso. En este blog, le mostraré cómo iniciar sesión en Tanium mediante Python y consultar los datos de los equipos.
Requisitos
- Un entorno de Tanium en el que se ha importado la última solución de API Gateway. Este blog se ha probado con la versión 1.3.64.0000.
- Python 3 with “requests” and “JSON” libraries
Autenticación
Antes de poder empezar a extraer datos de Tanium, tendremos que asegurarnos de que podemos iniciar sesión. Existen dos opciones para iniciar sesión: mediante un nombre de usuario y una contraseña de Tanium, o mediante un token de API. No es posible iniciar sesión con nombre de usuario y contraseña si lo hace mediante SSO o si utiliza Tanium Cloud, por lo que deberá utilizar un token de API si este es el caso en su entorno de Tanium.
Creación de un token de API
Para crear un token de API, deberá iniciar sesión en su servidor de Tanium como lo hace habitualmente y buscar la opción «Tokens de API» en el menú «Administración».

Una vez que haya accedido a la página «Tokens de API», puede hacer clic en el botón «Nuevo token de API», situado en la parte derecha de la pantalla. Esto le permitirá crear un token, indicar el periodo de validez del mismo y especificar qué direcciones de API están autorizadas a utilizar este token de API. Una vez rellenado el modal, aparecerá una ventana emergente en la que se mostrará el token durante un tiempo limitado. Le rogamos que anote el token, ya que no podrá volver a verlo una vez que se cierre la ventana emergente.
Iniciar sesión en Tanium con nombre de usuario y contraseña
Si su entorno de Tanium no utiliza el inicio de sesión único (SSO) para acceder, puede utilizar su nombre de usuario y contraseña para autenticarse y trabajar con la API de Tanium. La función que figura a continuación es un ejemplo de cómo podemos iniciar sesión en el servidor de Tanium mediante un nombre de usuario y una contraseña, y extraer el token de sesión.
[Nota: Este token de sesión caducará tras un periodo de inactividad, por lo que es posible que tenga que volver a autenticarse, si fuera necesario.]
Bloque de código 1: Obtención de un token de sesión mediante nombre de usuario y contraseña
def loginUsernamePassword(ts: str, username: str, password: str) -> str:
"""
Ejemplo de función que muestra cómo iniciar sesión en un servidor de Tanium a través de
utilizando una combinación de nombre de usuario y contraseña. Esto devolverá el token de sesión de
.
El parámetro «ts» corresponde al servidor de Tanium que se va a utilizar.
El parámetro «username» es el nombre de usuario que se debe utilizar al iniciar sesión.
El parámetro «password» es la contraseña que se debe utilizar al iniciar sesión.
"""
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"Código de estado recibido al iniciar sesión: {r.status_code}")
return session_token
Prueba de autenticación
Una vez que hayamos creado un token de API, podremos empezar a probar la autenticación. El token de la API debe añadirse como encabezado en todas las solicitudes HTTPS dirigidas al servidor de Tanium. Una vez que hayamos recibido el token de sesión, ya sea desde la página «Tokens de API» de la consola de Tanium o tras iniciar sesión con una combinación de nombre de usuario y contraseña, comprobaremos que el token funciona correctamente. Para ello, debe llamarse a la ruta /api/v2/session/validate en el servidor de Tanium. El bloque de funciones que figura a continuación muestra un ejemplo de cómo se puede llevar a cabo.
Bloque de código 2: Comprobación de la validez de un token de API o de sesión
def validateToken(ts: str, token: str):
"""
Ejemplo de función que muestra cómo validar que un token de API pueda
acceder al servidor de Tanium y obtener una respuesta 200 .
El parámetro «ts» corresponde al servidor de Tanium que se va a utilizar.
Ejemplo: 'https://MyTaniumServer.com'
El parámetro «token» es la cadena del token de la API generada desde la interfaz gráfica de usuario de TS.
"""
r = requests.post(f"{ts}/api/v2/session/validate",
json={'session': token},
headers={'session': token}
)
# El código de estado debería ser 200 si la validación del token se realiza correctamente.
print(f"Código de estado de la validación del token: {r.status_code}.")
Uso de API Gateway y GraphQL
Una vez que hayamos iniciado sesión correctamente en el servidor de Tanium y hayamos validado nuestro token, podremos empezar a realizar consultas a la pasarela de API para extraer información sobre el entorno. Si aún no ha utilizado GraphQL, quizá le convenga consultar su documentación para informarse brevemente sobre qué es GraphQL y cómo funciona su lenguaje de consulta. Puede acceder a la página web aquí: https://graphql.org/learn/ (se abre en una nueva pestaña).
Antes de automatizar procesos a través de la API de Tanium, puede acceder a API Gateway en la consola de Tanium y empezar a explorar los campos de datos que puede consultar. La foto 2 muestra dónde puede acceder a la sección de API Gateway de la consola de Tanium.

Una vez que accedamos a esta página, podremos ver un IDE interactivo de GraphQL que nos permite explorar y experimentar con diversas consultas, así como obtener datos reales. Consulte la foto 3 , donde podemos ejecutar una consulta inicial para ver la hora actual que indica el servidor.

Mediante el uso de la consulta GraphQL interactiva en la consola de Tanium, podemos explorar y crear nuestras consultas, que luego podemos incorporar a nuestro script de Python para automatizarlas. Por ejemplo, podemos crear una función muy sencilla en Python que ejecute la misma consulta «{now}», tal y como se muestra a continuación.
Bloque de código 3: Ejecución de la consulta «now» mediante Python
def graphQLQueryNow(ts: str, token: str):
"""
graphQLQueryNow ejecutará la consulta GraphQL «now»
en el servidor de Tanium que se haya pasado a esta función.
El parámetro «ts» corresponde al servidor de Tanium que se va a utilizar.
El parámetro «token» es la cadena del token de la API generada desde la interfaz gráfica de usuario de TS.
"""
jsonObj = {'query': "{now}"}
r = requests.post(ts + "/plugin/products/gateway/graphql",
json=jsonObj,
headers={'session': token},
)
print(f"Código de estado recibido de la consulta 'now': {r.status_code}")
print(f"Respuesta JSON de la consulta 'now': {r.json()}")
Este es un excelente punto de partida para ejecutar la primera consulta de Tanium mediante Python, pero intentemos obtener los datos de los puntos finales desde el explorador interactivo de GraphQL de la consola de Tanium. La imagen que aparece a continuación muestra cómo podemos consultar todos los terminales y su sistema operativo.

Por fin estamos obteniendo datos de los puntos finales, pero aún falta una última pieza. A menos que su entorno cuente con 20 equipos o menos, comprobará que estos datos no proporcionan la información relativa a la totalidad del entorno. GraphQL tiene la paginación activada de forma predeterminada, lo que significa que tendremos que realizar varias solicitudes para obtener el conjunto de datos completo de todo el entorno. Ampliemos nuestra consulta para que muestre la información de paginación; así sabremos cómo podemos analizarla al automatizar el proceso mediante un script de Python.

Cuando se activan estos datos «pageInfo», podemos comprobar si quedan más datos por procesar en el servidor a través del campo «hasNextPage». Además, podemos saber en qué punto del conjunto de datos nos encontramos consultando los campos «startCursor» y «endCursor». Si quisiéramos obtener el siguiente conjunto de datos, bastaría con añadir un (after: «lastcursor») a nuestra consulta de los puntos finales, tal y como se muestra a continuación.

Podemos observar que, al añadir este argumento «after» a la consulta de puntos finales, los datos resultantes corresponden al siguiente conjunto de 20 máquinas. Ahora que sabemos cómo paginar los datos, por fin podemos reunir todo en un script de Python que ejecutará una consulta automatizada por nosotros.
Bloque de código 4: Cómo integrar todos los elementos para consultar conjuntos de datos completos
def graphQL_pagination(ts: str, token: str):
"""
graphQL_pagination incluirá el nombre de cada punto final y utilizará
para la paginación en GraphQL.
El parámetro «ts» corresponde al servidor de Tanium que se va a utilizar.
El parámetro «token» es la cadena del token de la API generada desde la interfaz gráfica de usuario de TS.
"""
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:
# Realice la solicitud y formatee la respuesta en formato JSON
r = do_request(ts, token, next_query)
resp_obj = r.json()
# extraer la información de la página del objeto JSON
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"]
# Indique al usuario en qué parte del cursor nos encontramos.
print(
f"Se han recibido datos para los puntos extremos comprendidos entre el inicio: {start_cursor} y el final: {end_cursor}.")
# Añada los datos de los puntos finales a nuestro objeto de lista
endpoint_data.extend(resp_obj["data"]["endpoints"]["edges"])
# Si la página siguiente es «False», ¡significa que hemos llegado al final del conjunto de datos!
Si no existe la página siguiente:
break
# Inserte el argumento «after» en la consulta original
next_query = init_query[:25] + \
f"(after: \"{end_cursor}\") " + init_query[25:]
Esperamos que esto le sirva de introducción al uso de API Gateway fuera de Tanium. No olvide que muchos casos de uso pueden llevarse a cabo simplemente utilizando los conectores nativos que proporciona Tanium Connect. Cuando sea necesario desarrollar cualquier integración personalizada, API Gateway resulta un recurso de gran utilidad, y cada semana se añaden nuevas funcionalidades, incluida la compatibilidad con módulos. Póngase en contacto con su representante de Tanium para obtener más información sobre cualquier aspecto de la hoja de ruta o para recibir asistencia adicional en sus proyectos relacionados con API Gateway.
Descubra cómo puede aprovechar todo el potencial de la plataforma Tanium con la Galería de integraciones de Tanium de (se abre en una nueva pestaña), una consola centralizada que ofrece visibilidad en tiempo real de todas nuestras integraciones y permite a los clientes detectarlas, configurarlas e implementarlas sin esfuerzo. Al simplificar y agilizar la integración de la plataforma Tanium con socios tecnológicos clave como Microsoft, ServiceNow y otros, la Galería de integraciones de Tanium maximiza el valor de las inversiones en tecnología, al tiempo que reduce los riesgos y las ineficiencias operativas.




