简介
本文档介绍如何配置和使用面向终端的高级恶意软件防护(AMP)的事件流功能。
先决条件
要求
思科建议您了解以下主题:
使用的组件
本文档中的信息基于Python 3.7以及pika(版本1.1.0)和请求(版本2.22.0)外部库。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
配置
网络图
此图像提供事件流排序的示例:

配置
创建API凭证
- 导航到面向终端的AMP门户并登录
- 在Accounts下,选择API Credentials
- 单击New API Credentials
- 在应用程序名称字段中输入值
- 选择Read & Write for Scope
- 单击Create
- 将这些凭证存储在密码管理器或加密文件中
创建事件流
- 打开Python shell并导入json、ssl、pika和requests库。
import json
import pika
import requests
import ssl
- 存储url、client_id和api_key的值。 如果您不使用北美云,您的URL可能会有所不同。 此外,您的client_id和api_key对于您的环境是唯一的。
url = "https://api.amp.cisco.com/v1/event_streams"
client_id = "d16aff14860af496e848"
api_key = "d01ed435-b00d-4a4d-a299-1806ac117e72"
- 创建要传递到请求的数据对象。 必须包括name,并且可以包括event_type和group_guid,以限制流中包含的事件和组。 如果未传递group_guid或event_type,事件流将包括所有组和事件类型。
data = {
"name": "Event Stream for ACME Inc",
"group_guid": ["5cdf70dd-1b14-46a0-be90-e08da14172d8"],
"event_type": [1090519054]
}
- 进行POST请求调用,并将该值存储在变量中。
r = requests.post(
url = url,
data = data,
auth = (client_id, api_key)
)
- 打印状态代码。 确认代码是201。
print(r.status_code)
- 将响应的内容加载到json对象中,并将该对象存储在变量中。
j = json.loads(r.content)
- 查看响应数据的内容。
for k, v in j.items():
print(f"{k}: {v}")
- 高级消息队列协议(AMQP)数据位于响应内部。 将数据提取到相应的变量中。
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"]
- 使用这些参数定义回调函数。 在此设置中,您将事件正文打印到屏幕。 但是,您可以更改此功能的此内容以符合您的目标。
def callback(channel, method, properties, body):
print(body)
- 根据您创建的变量准备AMQP URL。
amqp_url = f"amqps://{user_name}:{password}@{host}:{port}"
- 准备SSL情景
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
amqp_ssl = pika.SSLOptions(context)
- 使用pika库方法准备AMQP流。
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
)
- 启动数据流。
channel.start_consuming()
- 溪流现已开通并等待相关事件。
验证
在您的环境中的终端上触发事件。 例如,启动快速扫描。 请注意,数据流会将事件数据打印到屏幕。
按Ctrl+C(Windows)或Command-C(Mac)中断流。
故障排除
状态代码
- 状态代码401表示存在授权问题。 检查您的client_id和api_key,或者生成新密钥。
- 状态代码400表示存在错误请求问题。 请确保未使用该名称创建事件流,或者未创建超过5个事件流。
- 状态代码400的另一个可能的补救方法是添加以下变量:
headers = {
'content-type': 'application/json'
}
并更新您的post请求以反映报头声明:
r = requests.post(
url = url,
headers = headers,
data = data,
auth = (client_id, api_key)
)