Cisco Application Centric Infrastructure(ACI)のログを収集する
このドキュメントでは、Cisco Application Centric Infrastructure(ACI)ログを Google Security Operations に取り込む方法について説明します。パーサーは、まず Grok パターンを使用して、着信した Cisco ACI ログを syslog メッセージとして処理しようとします。syslog の解析に失敗すると、メッセージが JSON 形式であると想定して、それに応じて解析します。最後に、抽出されたフィールドを統合データモデル(UDM)にマッピングします。
この統合では、次の 2 つの方法がサポートされています。
- オプション 1: Bindplane エージェント経由の Syslog 形式
- オプション 2: APIC REST API を使用して AWS S3 経由で JSON 形式
各オプションは自己完結型であり、インフラストラクチャの要件とログ形式の好みに基づいて個別に実装できます。
オプション 1: Bindplane エージェント経由の Syslog
このオプションは、syslog メッセージを Bindplane エージェントに送信するように Cisco ACI ファブリックを構成します。Bindplane エージェントは、分析のために syslog メッセージを Chronicle に転送します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- Windows 2016 以降、または
systemdを使用する Linux ホスト - プロキシの背後で実行している場合は、Bindplane エージェントの要件に従ってファイアウォール ポートが開いていることを確認します。
- Cisco APIC コンソールへの特権アクセス
Google SecOps の取り込み認証ファイルを取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [コレクション エージェント] に移動します。
- Ingestion Authentication File をダウンロードします。Bindplane をインストールするシステムにファイルを安全に保存します。
Google SecOps のお客様 ID を取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [プロファイル] に移動します。
- [組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。
Bindplane エージェントをインストールする
次の手順に沿って、Windows または Linux オペレーティング システムに Bindplane エージェントをインストールします。
Windows のインストール
- 管理者として コマンド プロンプトまたは PowerShell を開きます。
次のコマンドを実行します。
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux のインストール
- root 権限または sudo 権限でターミナルを開きます。
次のコマンドを実行します。
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
その他のインストール リソース
- その他のインストール オプションについては、こちらのインストール ガイドをご覧ください。
Syslog を取り込んで Google SecOps に送信するように Bindplane エージェントを構成する
構成ファイルにアクセスします。
config.yamlファイルを見つけます。通常、Linux では/etc/bindplane-agent/ディレクトリに、Windows ではインストール ディレクトリにあります。- テキスト エディタ(
nano、vi、メモ帳など)を使用してファイルを開きます。
config.yamlファイルを次のように編集します。receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <CUSTOMER_ID> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'CISCO_ACI' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels- 自社のインフラストラクチャでの必要性に応じて、ポートと IP アドレスを置き換えます。
<customer_id>は、実際の顧客 ID に置き換えます。/path/to/ingestion-authentication-file.jsonの値を、Google SecOps の取り込み認証ファイルを取得するで認証ファイルを保存したパスに更新します。
Bindplane エージェントを再起動して変更を適用する
Linux で Bindplane エージェントを再起動するには、次のコマンドを実行します。
sudo systemctl restart bindplane-agentWindows で Bindplane エージェントを再起動するには、Services コンソールを使用するか、次のコマンドを入力します。
net stop BindPlaneAgent && net start BindPlaneAgent
Cisco ACI で Syslog 転送を構成する
帯域外管理契約を構成する
- Cisco APIC コンソールにログインします。
- [テナント > 管理 > 契約 > フィルタ] に移動します。
- [フィルタを作成] をクリックします。
- 次の構成の詳細を入力します。
- 名前: 「
syslog-udp-514」と入力します。 - エントリ名: 「
syslog」と入力します。 - EtherType: [IP] を選択します。
- IP Protocol: [UDP] を選択します。
- 宛先ポートの範囲(開始):
514と入力します。 - 宛先ポートの範囲(終了): 「
514」と入力します。
- 名前: 「
- [送信] をクリックします。
管理契約を作成する
- [テナント> 管理 > 契約 > 標準] に移動します。
- [契約を作成] をクリックします。
- 次の構成の詳細を入力します。
- 名前: 「
mgmt-syslog-contract」と入力します。 - スコープ: [コンテキスト] を選択します。
- 名前: 「
- [送信] をクリックします。
- 契約を開き、[Subjects] をクリックします。
- [Create Contract Subject] をクリックします。
- 次の構成の詳細を入力します。
- 名前: 「
syslog-subject」と入力します。 - 両方向に適用: このオプションをオンにします。
- 名前: 「
- [送信] をクリックします。
- 件名を開き、[フィルタ] をクリックします。
- [フィルタ バインディングを作成] をクリックします。
- 先ほど作成した
syslog-udp-514フィルタを選択します。 - [送信] をクリックします。
Syslog 宛先グループを構成する
- [管理] > [外部データ コレクタ] > [モニタリングの宛先] > [Syslog] に移動します。
- [Syslog] を右クリックし、[Syslog モニタリング移行先グループを作成] を選択します。
- 次の構成の詳細を入力します。
- 名前: 「
Chronicle-Syslog-Group」と入力します。 - Admin State: [Enabled] を選択します。
- 形式: [aci] を選択します。
- 名前: 「
- [次へ] をクリックします。
- [Syslog モニタリングの宛先を作成] ダイアログで、次の操作を行います。
- 名前: 「
Chronicle-BindPlane」と入力します。 - ホスト: Bindplane エージェント サーバーの IP アドレスを入力します。
- ポート: 「
514」と入力します。 - Admin State: [Enabled] を選択します。
- 重大度: [情報] を選択します(詳細なログをキャプチャするため)。
- 名前: 「
- [送信] をクリックします。
モニタリング ポリシーを構成する
ファブリック モニタリング ポリシー
- [Fabric] > [Fabric Policies] > [Policies] > [Monitoring] > [Common Policy] に移動します。
- [Callhome/Smart Callhome/SNMP/Syslog/TACACS] を展開します。
- [Syslog] を右クリックし、[Create Syslog Source] を選択します。
- 次の構成の詳細を入力します。
- 名前: 「
Chronicle-Fabric-Syslog」と入力します。 - 監査ログ: 監査イベントを含める場合にオンにします。
- イベント: システム イベントを含める場合にオンにします。
- Faults: 障害イベントを含める場合にオンにします。
- セッションログ: セッションログを含める場合にオンにします。
- 宛先グループ:
Chronicle-Syslog-Groupを選択します。
- 名前: 「
- [送信] をクリックします。
アクセス モニタリング ポリシー
- [Fabric] > [Access Policies] > [Policies] > [Monitoring] > [Default Policy] に移動します。
- [Callhome/Smart Callhome/SNMP/Syslog] を開きます。
- [Syslog] を右クリックし、[Create Syslog Source] を選択します。
- 次の構成の詳細を入力します。
- 名前: 「
Chronicle-Access-Syslog」と入力します。 - 監査ログ: 監査イベントを含める場合にオンにします。
- イベント: システム イベントを含める場合にオンにします。
- Faults: 障害イベントを含める場合にオンにします。
- セッションログ: セッションログを含める場合にオンにします。
- 宛先グループ:
Chronicle-Syslog-Groupを選択します。
- 名前: 「
- [送信] をクリックします。
システム Syslog メッセージ ポリシーを構成する
- [Fabric] > [Fabric Policies] > [Policies] > [Monitoring] > [Common Policy] に移動します。
- [Syslog Messages Policies] を開きます。
- [default] をクリックします。
- [施設フィルタ] セクションで次の操作を行います。
- ファシリティ: [default] を選択します。
- 最小重大度: [情報] に変更します。
- [送信] をクリックします。
オプション 2: AWS S3 経由の JSON
このオプションでは、APIC REST API を使用して、Cisco ACI ファブリックから JSON 形式のイベント、障害、監査ログを収集し、SecOps の取り込み用に AWS S3 に保存します。
始める前に
- Google SecOps インスタンス。
- Cisco APIC コンソールへの特権アクセス。
- AWS(S3、IAM、Lambda、EventBridge)への特権アクセス。
Cisco ACI APIC の前提条件(ID、API キー、組織 ID、トークン)を収集する
- HTTPS を使用して Cisco APIC コンソールにログインします。
- [Admin] > [AAA](APIC 6.0 以降)または [Admin] > [Authentication] > [AAA](以前のリリース)に移動します。
- 注: APIC 6.0(1) 以降、AAA メニューのパスが変更されました。
- 適切な権限を持つローカル ユーザーを作成するか、既存のローカル ユーザーを使用します。
- 次の詳細をコピーして安全な場所に保存します。
- APIC Username: モニタリング データへの読み取りアクセス権を持つローカル ユーザー
- APIC Password: ユーザーのパスワード
- APIC URL: APIC の HTTPS URL(例:
https://apic.example.com)
Google SecOps 用に AWS S3 バケットと IAM を構成する
- バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
- 後で参照できるように、バケットの名前とリージョンを保存します(例:
cisco-aci-logs)。 - IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成したユーザーを選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] で [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックし、[アクセスキー] と [シークレット アクセスキー] を保存して、今後の参照に備えます。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションで [権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- AmazonS3FullAccess ポリシーを検索します。
- ポリシーを選択します。
- [次へ] をクリックします。
- [権限を追加] をクリックします。
S3 アップロードの IAM ポリシーとロールを構成する
- AWS コンソールで、[IAM] > [ポリシー] に移動します。
- [ポリシーを作成> [JSON] タブ] をクリックします。
次のポリシーを入力します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::cisco-aci-logs/*" }, { "Sid": "AllowGetStateObject", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::cisco-aci-logs/cisco-aci-events/state.json" } ] }- 別のバケット名を入力した場合は、
cisco-aci-logsを置き換えます。
- 別のバケット名を入力した場合は、
[次へ] > [ポリシーを作成] をクリックします。
[IAM] > [ロール] > [ロールの作成] > [AWS サービス] > [Lambda] に移動します。
新しく作成したポリシーと AWSLambdaBasicExecutionRole 管理ポリシーを関連付けます。
ロールに「
cisco-aci-lambda-role」という名前を付けて、[ロールを作成] をクリックします。
Lambda 関数を作成する
- AWS コンソールで、[Lambda] > [Functions] > [Create function] に移動します。
- [Author from scratch] をクリックします。
次の構成情報を提供してください。
- 名前:
cisco-aci-events-collector - ランタイム: Python 3.13
- アーキテクチャ: x86_64
- 実行ロール:
cisco-aci-lambda-role
- 名前:
関数を作成したら、[コード] タブを開き、スタブを削除して次のコード(
cisco-aci-events-collector.py)を入力します。import json import boto3 import urllib3 import base64 from datetime import datetime, timedelta import os import logging # Configure logging logger = logging.getLogger() logger.setLevel(logging.INFO) # AWS S3 client and HTTP pool manager s3_client = boto3.client('s3') http = urllib3.PoolManager() def lambda_handler(event, context): """ AWS Lambda handler to fetch Cisco ACI events, faults, and audit logs and store them in S3 """ try: # Get environment variables s3_bucket = os.environ['S3_BUCKET'] s3_prefix = os.environ['S3_PREFIX'] state_key = os.environ['STATE_KEY'] apic_url = os.environ['APIC_URL'] apic_username = os.environ['APIC_USERNAME'] apic_password = os.environ['APIC_PASSWORD'] # Optional parameters page_size = int(os.environ.get('PAGE_SIZE', '100')) max_pages = int(os.environ.get('MAX_PAGES', '10')) logger.info(f"Starting Cisco ACI data collection for bucket: {s3_bucket}") # Get last run timestamp from state file last_timestamp = get_last_timestamp(s3_bucket, state_key) if not last_timestamp: last_timestamp = (datetime.utcnow() - timedelta(hours=1)).isoformat() + 'Z' # Authenticate to APIC session_token = authenticate_apic(apic_url, apic_username, apic_password) headers = { 'Cookie': f'APIC-cookie={session_token}', 'Accept': 'application/json', 'Content-Type': 'application/json' } # Data types to collect data_types = ['faultInst', 'eventRecord', 'aaaModLR'] all_collected_data = [] for data_type in data_types: logger.info(f"Collecting {data_type} data") collected_data = collect_aci_data(apic_url, headers, data_type, last_timestamp, page_size, max_pages) # Tag each record with its type for record in collected_data: record['_data_type'] = data_type all_collected_data.extend(collected_data) logger.info(f"Collected {len(collected_data)} {data_type} records") logger.info(f"Total records collected: {len(all_collected_data)}") # Store data in S3 if any were collected if all_collected_data: timestamp_str = datetime.utcnow().strftime('%Y%m%d_%H%M%S') s3_key = f"{s3_prefix}cisco_aci_events_{timestamp_str}.ndjson" # Convert to NDJSON format (one JSON object per line) ndjson_content = '\n'.join(json.dumps(record) for record in all_collected_data) # Upload to S3 s3_client.put_object( Bucket=s3_bucket, Key=s3_key, Body=ndjson_content.encode('utf-8'), ContentType='application/x-ndjson' ) logger.info(f"Uploaded {len(all_collected_data)} records to s3://{s3_bucket}/{s3_key}") # Update state file with latest timestamp from collected data latest_timestamp = get_latest_timestamp_from_records(all_collected_data) if not latest_timestamp: latest_timestamp = datetime.utcnow().isoformat() + 'Z' update_state(s3_bucket, state_key, latest_timestamp) return { 'statusCode': 200, 'body': json.dumps({ 'message': 'Success', 'total_records_collected': len(all_collected_data), 'data_types_collected': data_types }) } except Exception as e: logger.error(f"Error in lambda_handler: {str(e)}") return { 'statusCode': 500, 'body': json.dumps({ 'error': str(e) }) } def authenticate_apic(apic_url, username, password): """ Authenticate to APIC and return session token """ login_url = f"{apic_url}/api/aaaLogin.json" login_data = { "aaaUser": { "attributes": { "name": username, "pwd": password } } } response = http.request( 'POST', login_url, body=json.dumps(login_data).encode('utf-8'), headers={'Content-Type': 'application/json'}, timeout=30 ) if response.status != 200: raise RuntimeError(f"APIC authentication failed: {response.status} {response.data[:256]!r}") response_data = json.loads(response.data.decode('utf-8')) token = response_data['imdata'][0]['aaaLogin']['attributes']['token'] logger.info("Successfully authenticated to APIC") return token def collect_aci_data(apic_url, headers, data_type, last_timestamp, page_size, max_pages): """ Collect data from APIC REST API with pagination """ all_data = [] page = 0 while page < max_pages: # Build API URL with pagination and time filters api_url = f"{apic_url}/api/class/{data_type}.json" params = [ f'page-size={page_size}', f'page={page}', f'order-by={data_type}.created|asc' ] # Add time filter for all data types to prevent duplicates time_attr = 'created' if last_timestamp: params.append(f'query-target-filter=gt({data_type}.{time_attr},"{last_timestamp}")') full_url = f"{api_url}?{'&'.join(params)}" logger.info(f"Fetching {data_type} page {page} from APIC") # Make API request response = http.request('GET', full_url, headers=headers, timeout=60) if response.status != 200: logger.error(f"API request failed: {response.status} {response.data[:256]!r}") break data = json.loads(response.data.decode('utf-8')) records = data.get('imdata', []) if not records: logger.info(f"No more {data_type} records found") break # Extract the actual data from APIC format extracted_records = [] for record in records: if data_type in record: extracted_records.append(record[data_type]) all_data.extend(extracted_records) page += 1 # If we got less than page_size records, we've reached the end if len(records) < page_size: break return all_data def get_last_timestamp(bucket, state_key): """ Get the last run timestamp from S3 state file """ try: response = s3_client.get_object(Bucket=bucket, Key=state_key) state_data = json.loads(response['Body'].read().decode('utf-8')) return state_data.get('last_timestamp') except s3_client.exceptions.NoSuchKey: logger.info("No state file found, starting from 1 hour ago") return None except Exception as e: logger.warning(f"Error reading state file: {str(e)}") return None def get_latest_timestamp_from_records(records): """ Get the latest timestamp from collected records to prevent missing events """ if not records: return None latest = None latest_time = None for record in records: try: # Handle both direct attributes and nested structure attrs = record.get('attributes', record) created = attrs.get('created') modTs = attrs.get('modTs') # Fallback for some object types timestamp = created or modTs if timestamp: if latest_time is None or timestamp > latest_time: latest_time = timestamp latest = record except Exception as e: logger.debug(f"Error parsing timestamp from record: {e}") continue return latest_time def update_state(bucket, state_key, timestamp): """ Update the state file with the current timestamp """ try: state_data = { 'last_timestamp': timestamp, 'updated_at': datetime.utcnow().isoformat() + 'Z' } s3_client.put_object( Bucket=bucket, Key=state_key, Body=json.dumps(state_data).encode('utf-8'), ContentType='application/json' ) logger.info(f"Updated state file with timestamp: {timestamp}") except Exception as e: logger.error(f"Error updating state file: {str(e)}")[構成] > [環境変数] に移動します。
[編集>新しい環境変数を追加] をクリックします。
次の環境変数を入力し、実際の値に置き換えます。
- S3_BUCKET:
cisco-aci-logs - S3_PREFIX:
cisco-aci-events/ - STATE_KEY:
cisco-aci-events/state.json - APIC_URL:
https://apic.example.com - APIC_USERNAME:
<your-apic-username> - APIC_PASSWORD:
<your-apic-password> - PAGE_SIZE:
100(省略可、ページネーションのサイズを制御します) - MAX_PAGES:
10(省略可、実行ごとに取得する合計ページ数を制限します)
- S3_BUCKET:
関数を作成したら、そのページにとどまるか、[Lambda] > [Functions] > [cisco-aci-events-collector] を開きます。
[CONFIGURATION] タブを選択します。
[全般設定] パネルで、[編集] をクリックします。
[Timeout] を [5 minutes (300 seconds)] に変更し、[Save] をクリックします。
EventBridge スケジュールを作成する
- [Amazon EventBridge] > [Scheduler] > [スケジュールの作成] に移動します。
- 次の構成の詳細を入力します。
- 定期的なスケジュール: レート(
15 minutes)。 - ターゲット: Lambda 関数
cisco-aci-events-collector。 - 名前:
cisco-aci-events-collector-15m
- 定期的なスケジュール: レート(
- [スケジュールを作成] をクリックします。
省略可: Google SecOps 用の読み取り専用の IAM ユーザーと鍵を作成する
- AWS コンソール > IAM > ユーザー > ユーザーを追加 に移動します。
- [ユーザーを追加] をクリックします。
- 次の構成の詳細を入力します。
- ユーザー: 「
secops-reader」と入力します。 - アクセスの種類: [アクセスキー - プログラムによるアクセス] を選択します。
- ユーザー: 「
- [Create user] をクリックします。
- 最小限の読み取りポリシー(カスタム)を適用する: [ユーザー] > [secops-reader] > [権限] > [権限を追加] > [ポリシーを直接適用] > [ポリシーを作成]。
JSON エディタで、次のポリシーを入力します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::cisco-aci-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::cisco-aci-logs" } ] }名前を
secops-reader-policyに設定します。[Create policy] > を検索して選択 > [Next] > [Add permissions] に移動します。
[セキュリティ認証情報] > [アクセスキー] > [アクセスキーを作成] に移動します。
CSV をダウンロードします(これらの値はフィードに入力されます)。
Cisco ACI のログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [+ 新しいフィードを追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Cisco ACI JSON logs)。 - [ソースタイプ] として [Amazon S3 V2] を選択します。
- [Log type] として [Cisco Application Centric Infrastructure] を選択します。
- [次へ] をクリックします。
- 次の入力パラメータの値を指定します。
- S3 URI:
s3://cisco-aci-logs/cisco-aci-events/ - Source deletion options: 必要に応じて削除オプションを選択します。
- ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます。デフォルトは 180 日です。
- アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
- シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
- アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- S3 URI:
- [次へ] をクリックします。
- [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
| @timestamp | read_only_udm.metadata.event_timestamp | 値は、未加工ログのフィールド「@timestamp」から取得され、タイムスタンプとして解析されます。 |
| aci_tag | read_only_udm.metadata.product_log_id | 値は、未加工ログのフィールド「aci_tag」から取得されます。 |
| cisco_timestamp | - | マッピングされていません。 |
| DIP | read_only_udm.target.ip | 値は、未加工ログのフィールド「DIP」から取得されます。 |
| DPort | read_only_udm.target.port | 値は未加工ログのフィールド「DPort」から取得され、整数に変換されます。 |
| 説明 | read_only_udm.security_result.description | 値は、未加工ログのフィールド「description」から取得されます。 |
| fault_cause | read_only_udm.additional.fields.value.string_value | 値は、未加工ログのフィールド「fault_cause」から取得されます。キーは「Fault Cause」に設定されます。 |
| hostname | read_only_udm.principal.hostname | 値は、未加工ログの「hostname」フィールドから取得されます。 |
| lifecycle_state | read_only_udm.metadata.product_event_type | 値は、未加工ログのフィールド「lifecycle_state」から取得されます。 |
| log.source.address | - | マッピングされていません。 |
| logstash.collect.host | - | マッピングされていません。 |
| logstash.collect.timestamp | read_only_udm.metadata.collected_timestamp | 値は、未加工ログのフィールド「logstash.collect.timestamp」から取得され、タイムスタンプとして解析されます。 |
| logstash.ingest.host | read_only_udm.intermediary.hostname | 値は、未加工ログのフィールド「logstash.ingest.host」から取得されます。 |
| logstash.irm_environment | read_only_udm.additional.fields.value.string_value | 値は、未加工ログのフィールド「logstash.irm_environment」から取得されます。キーは「IRM_Environment」に設定されます。 |
| logstash.irm_region | read_only_udm.additional.fields.value.string_value | 値は、未加工ログのフィールド「logstash.irm_region」から取得されます。キーは「IRM_Region」に設定されます。 |
| logstash.irm_site | read_only_udm.additional.fields.value.string_value | 値は、未加工ログのフィールド「logstash.irm_site」から取得されます。キーは「IRM_Site」に設定されます。 |
| logstash.process.host | read_only_udm.intermediary.hostname | 値は、未加工ログのフィールド「logstash.process.host」から取得されます。 |
| メッセージ | - | マッピングされていません。 |
| message_class | - | マッピングされていません。 |
| message_code | - | マッピングされていません。 |
| message_content | - | マッピングされていません。 |
| message_dn | - | マッピングされていません。 |
| message_type | read_only_udm.metadata.product_event_type | 値は、角かっこを削除した後に、未加工ログのフィールド「message_type」から取得されます。 |
| node_link | read_only_udm.principal.process.file.full_path | 値は、未加工ログのフィールド「node_link」から取得されます。 |
| PktLen | read_only_udm.network.received_bytes | 値は未加工ログのフィールド「PktLen」から取得され、符号なし整数に変換されます。 |
| プログラム | - | マッピングされていません。 |
| .proto | read_only_udm.network.ip_protocol | 値は未加工ログのフィールド「Proto」から取得され、整数に変換されて、対応する IP プロトコル名(6 -> TCP)。 |
| SIP | read_only_udm.principal.ip | 値は、未加工ログのフィールド「SIP」から取得されます。 |
| SPort | read_only_udm.principal.port | 値は未加工ログのフィールド「SPort」から取得され、整数に変換されます。 |
| syslog_facility | - | マッピングされていません。 |
| syslog_facility_code | - | マッピングされていません。 |
| syslog_host | read_only_udm.principal.ip、read_only_udm.observer.ip | 値は、未加工ログのフィールド「syslog_host」から取得されます。 |
| syslog_prog | - | マッピングされていません。 |
| syslog_severity | read_only_udm.security_result.severity_details | 値は、未加工ログのフィールド「syslog_severity」から取得されます。 |
| syslog_severity_code | read_only_udm.security_result.severity | 値は未加工ログのフィールド「syslog_severity_code」から取得され、対応する重大度レベルにマッピングされます。5、6、7 -> INFORMATIONAL、3、4 -> MEDIUM、0、1、2 -> HIGH。 |
| syslog5424_pri | - | マッピングされていません。 |
| Vlan-Id | read_only_udm.principal.resource.id | 値は、未加工ログのフィールド「Vlan-Id」から取得されます。 |
| - | read_only_udm.metadata.event_type | ロジック: 「SIP」または「hostname」が存在し、「Proto」が存在する場合は、「NETWORK_CONNECTION」に設定します。それ以外の場合で、「SIP」、「hostname」、「syslog_host」のいずれかが存在する場合は、「STATUS_UPDATE」に設定します。それ以外の場合は、「GENERIC_EVENT」に設定されます。 |
| - | read_only_udm.metadata.log_type | ロジック: 「CISCO_ACI」に設定されます。 |
| - | read_only_udm.metadata.vendor_name | ロジック: 「Cisco」に設定します。 |
| - | read_only_udm.metadata.product_name | ロジック: 「ACI」に設定します。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。