はじめに
このドキュメントでは、エンドポイント用の高度なマルウェア防御(AMP)のイベントストリーム機能を設定して使用する方法について説明します。
前提条件
要 件
次の項目に関する知識があることが推奨されます。
- AMP for Endpoints
- Pythonプログラミングの基礎知識
使用するコンポーネント
このドキュメントの情報は、Python 3.7、pika(バージョン1.1.0)およびrequests(バージョン2.22.0)外部ライブラリに基づいています。
このドキュメントの情報は、特定のラボ環境にあるデバイスに基づいて作成されたものです。このドキュメントで使用するすべてのデバイスは、クリアな(デフォルト)設定で作業を開始しています。本稼働中のネットワークでは、各コマンドによって起こる可能性がある影響を十分確認してください。
設定
ネットワーク図
次の図に、イベントストリームのシーケンスの例を示します。

コンフィギュレーション
APIクレデンシャルの作成
- AMP for Endpointsポータルに移動してログインします
- Accountsで、API Credentialsを選択します
- New API Credentialsをクリックします。
- Application nameフィールドに値を入力します
- ScopeでRead & Writeを選択します。
- Createをクリックします。
- これらのクレデンシャルをパスワードマネージャまたは暗号化ファイルに保存します
イベントストリームの作成
- Pythonシェルを開き、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}")
- Advanced Message Queuing Protocol(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'
}
をクリックし、ヘッダー宣言を反映するようにポストリクエストを更新します。
r = requests.post(
url = url,
headers = headers,
data = data,
auth = (client_id, api_key)
)