Introdução
Este documento descreve como configurar e consumir o recurso Event Stream para Advanced Malware Protection (AMP) for Endpoints.
Pré-requisitos
Requisitos
A Cisco recomenda que você tenha conhecimento dos seguintes tópicos:
- AMP para endpoints
- Conhecimento básico de programação Python
Componentes Utilizados
As informações neste documento são baseadas no Python 3.7 com as bibliotecas externas pika (versão 1.1.0) e requests (versão 2.22.0).
As informações neste documento foram criadas a partir de dispositivos em um ambiente de laboratório específico. Todos os dispositivos utilizados neste documento foram iniciados com uma configuração (padrão) inicial. Se a rede estiver ativa, certifique-se de que você entenda o impacto potencial de qualquer comando.
Configurar
Diagrama de Rede
Esta imagem fornece um exemplo de sequenciamento de Fluxo de Eventos:

Configurações
Criar credenciais de API
- Navegue até o portal do AMP for Endpoints e faça login
- Em Contas, escolha Credenciais de API
- Clique em Novas credenciais de API
- Insira um valor no campo Application name
- Selecione Leitura e Gravação para Escopo
- Clique em Criar
- Armazenar essas credenciais em um gerenciador de senhas ou arquivo criptografado
Criar Fluxo de Eventos
- Abra um shell Python e importe as bibliotecas json, ssl, pika e requests.
import json
import pika
import requests
import ssl
- Armazene os valores de url, client_id e api_key. Sua URL pode variar se você não estiver usando a nuvem norte-americana. Além disso, o client_id e a api_key são exclusivos do seu ambiente.
url = "https://api.amp.cisco.com/v1/event_streams"
client_id = "d16aff14860af496e848"
api_key = "d01ed435-b00d-4a4d-a299-1806ac117e72"
- Crie o objeto de dados a ser passado para a solicitação. Isso deve incluir nome e pode incluir event_type e group_guid para restringir os eventos e grupos incluídos no fluxo. Se nenhum group_guid ou event_type for passado, o fluxo de eventos incluirá todos os grupos e tipos de eventos.
data = {
"name": "Event Stream for ACME Inc",
"group_guid": ["5cdf70dd-1b14-46a0-be90-e08da14172d8"],
"event_type": [1090519054]
}
- Faça a solicitação POST e armazene o valor em uma variável.
r = requests.post(
url = url,
data = data,
auth = (client_id, api_key)
)
- Imprimir o código de status. Confirme se o código é 201.
print(r.status_code)
- Carregue o conteúdo da resposta em um objeto json e armazene esse objeto em uma variável.
j = json.loads(r.content)
- Revise o conteúdo dos dados da resposta.
for k, v in j.items():
print(f"{k}: {v}")
- Os dados do Protocolo de Enfileiramento Avançado de Mensagens (AMQP) estão dentro da resposta. Extraia os dados nas respectivas variáveis.
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 uma função de retorno de chamada com esses parâmetros. Nessa configuração, você imprime o corpo do evento na tela. No entanto, você pode alterar o conteúdo dessa função para atender aos seus objetivos.
def callback(channel, method, properties, body):
print(body)
- Prepare o URL AMQP a partir das variáveis criadas.
amqp_url = f"amqps://{user_name}:{password}@{host}:{port}"
- Preparar o contexto SSL
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
amqp_ssl = pika.SSLOptions(context)
- Prepare o fluxo AMQP com os métodos de 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 o fluxo.
channel.start_consuming()
- O fluxo agora está ao vivo e aguardando eventos.
Verificar
Dispare um evento em um endpoint em seu ambiente. Por exemplo, inicie uma varredura em flash. Observe que o fluxo imprime os dados do evento na tela.
Pressione Ctrl+C (Windows) ou Command-C (Mac) para interromper o fluxo.
Troubleshooting
Códigos de status
- Um código de status 401 indica que há um problema com a autorização. Verifique seu client_id e api_key, ou gere novas chaves.
- Um código de status 400 indica que há um problema de solicitação incorreta. Verifique se você não tem um fluxo de eventos criado com esse nome ou se não tem mais de 5 fluxos de eventos criados.
- Outra solução possível para o código de estado 400 seria adicionar a seguinte variável:
headers = {
'content-type': 'application/json'
}
e atualize sua solicitação de postagem para refletir a declaração de cabeçalho:
r = requests.post(
url = url,
headers = headers,
data = data,
auth = (client_id, api_key)
)