Introducción
En este documento se describe cómo configurar y utilizar la función Event Stream para la protección frente a malware avanzado (AMP) para terminales.
Prerequisites
Requirements
Cisco recomienda que tenga conocimiento de los siguientes temas:
- AMP para terminales
- Conocimientos básicos de programación Python
Componentes Utilizados
La información de este documento se basa en Python 3.7 con las bibliotecas externas pika (versión 1.1.0) y requests (versión 2.2.0).
La información que contiene este documento se creó a partir de los dispositivos en un ambiente de laboratorio específico. Todos los dispositivos que se utilizan en este documento se pusieron en funcionamiento con una configuración verificada (predeterminada). Si tiene una red en vivo, asegúrese de entender el posible impacto de cualquier comando.
Configurar
Diagrama de la red
Esta imagen proporciona un ejemplo de secuenciación de Event Stream:

Configuraciones
Crear credenciales de API
- Vaya al portal de AMP para terminales e inicie sesión
- En Cuentas, elija Credenciales de API
- Haga clic en New API Credentials
- Introduzca un valor en el campo Nombre de aplicación
- Seleccione Read & Write para Scope
- Haga clic en Crear
- Almacenar estas credenciales en un administrador de contraseñas o en un archivo cifrado
Crear flujo de eventos
- Abra un shell de Python e importe las bibliotecas json, ssl, pika y requests.
import json
import pika
import requests
import ssl
- Almacene los valores de url, client_id y api_key. La URL puede variar si no utiliza la nube de Norteamérica. Además, client_id y api_key son únicos en su entorno.
url = "https://api.amp.cisco.com/v1/event_streams"
client_id = "d16aff14860af496e848"
api_key = "d01ed435-b00d-4a4d-a299-1806ac117e72"
- Cree el objeto de datos que se pasará a la solicitud. Debe incluir name y puede incluir event_type y group_guid para restringir los eventos y grupos incluidos en la secuencia. Si no se pasa ningún group_guid o event_type, la secuencia de eventos incluirá todos los grupos y tipos de eventos.
data = {
"name": "Event Stream for ACME Inc",
"group_guid": ["5cdf70dd-1b14-46a0-be90-e08da14172d8"],
"event_type": [1090519054]
}
- Realice la llamada de solicitud POST y almacene el valor en una variable.
r = requests.post(
url = url,
data = data,
auth = (client_id, api_key)
)
- Imprimir el código de estado. Confirme que el código es 201.
print(r.status_code)
- Cargue el contenido de la respuesta en un objeto json y almacene ese objeto en una variable.
j = json.loads(r.content)
- Revise el contenido de los datos de respuesta.
for k, v in j.items():
print(f"{k}: {v}")
- Los datos del protocolo avanzado de Message Queue Server (AMQP) se encuentran dentro de la respuesta. Extraiga los datos en las variables respectivas.
user_name = j["data"]["amqp_credentials"]["user_name"]
queue_name = j["data"]["amqp_credentials"]["queue_name"]
password = j["data"]["amqp_credentials"]["password"]
host = j["data"]["amqp_credentials"]["host"]
port = j["data"]["amqp_credentials"]["port"]
proto = j["data"]["amqp_credentials"]["proto"]
- Defina una función de devolución de llamada con estos parámetros. En esta configuración, imprimirá el cuerpo del evento en la pantalla. Sin embargo, puede cambiar el contenido de esta función para que se ajuste a sus objetivos.
def callback(channel, method, properties, body):
print(body)
- Prepare la URL de AMQP a partir de las variables que ha creado.
amqp_url = f"amqps://{user_name}:{password}@{host}:{port}"
- Preparación del contexto SSL
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
amqp_ssl = pika.SSLOptions(context)
- Prepare la secuencia de AMQP con los métodos de la biblioteca pika.
params = pika.URLParameters(amqp_url)
params.ssl_options = amqp_ssl
connection = pika.BlockingConnection(params)
channel = connection.channel()
channel.basic_consume(
queue_name,
callback,
auto_ack = False
)
- Inicie la secuencia.
channel.start_consuming()
- La transmisión ya está activa y a la espera de eventos.
Verificación
Desencadenar un evento en un terminal de su entorno. Por ejemplo, inicie un análisis flash. Observe que la secuencia imprime los datos del evento en la pantalla.
Presione Ctrl+C (Windows) o Command-C (Mac) para interrumpir la secuencia.
Troubleshoot
Códigos de estado
- El código de estado 401 indica que hay un problema con la autorización. Verifique su client_id y api_key, o genere nuevas claves.
- Un código de estado de 400 indica que hay un problema de solicitud incorrecta. Compruebe que no tiene un flujo de eventos creado con ese nombre o que no tiene más de 5 flujos de eventos creados.
- Otra solución posible para el código de estado 400 sería añadir la siguiente variable:
headers = {
'content-type': 'application/json'
}
y actualice su solicitud de publicación para reflejar la declaración de encabezado:
r = requests.post(
url = url,
headers = headers,
data = data,
auth = (client_id, api_key)
)