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 の取り込み認証ファイルを取得する

  1. Google SecOps コンソールにログインします。
  2. [SIEM 設定] > [コレクション エージェント] に移動します。
  3. Ingestion Authentication File をダウンロードします。Bindplane をインストールするシステムにファイルを安全に保存します。

Google SecOps のお客様 ID を取得する

  1. Google SecOps コンソールにログインします。
  2. [SIEM 設定] > [プロファイル] に移動します。
  3. [組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。

Bindplane エージェントをインストールする

次の手順に沿って、Windows または Linux オペレーティング システムに Bindplane エージェントをインストールします。

Windows のインストール

  1. 管理者として コマンド プロンプトまたは PowerShell を開きます。
  2. 次のコマンドを実行します。

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Linux のインストール

  1. root 権限または sudo 権限でターミナルを開きます。
  2. 次のコマンドを実行します。

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

その他のインストール リソース

Syslog を取り込んで Google SecOps に送信するように Bindplane エージェントを構成する

  1. 構成ファイルにアクセスします。

    1. config.yaml ファイルを見つけます。通常、Linux では /etc/bindplane-agent/ ディレクトリに、Windows ではインストール ディレクトリにあります。
    2. テキスト エディタ(nanovi、メモ帳など)を使用してファイルを開きます。
  2. 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-agent
    
  • Windows で Bindplane エージェントを再起動するには、Services コンソールを使用するか、次のコマンドを入力します。

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Cisco ACI で Syslog 転送を構成する

帯域外管理契約を構成する

  1. Cisco APIC コンソールにログインします。
  2. [テナント > 管理 > 契約 > フィルタ] に移動します。
  3. [フィルタを作成] をクリックします。
  4. 次の構成の詳細を入力します。
    • 名前: 「syslog-udp-514」と入力します。
    • エントリ名: 「syslog」と入力します。
    • EtherType: [IP] を選択します。
    • IP Protocol: [UDP] を選択します。
    • 宛先ポートの範囲(開始): 514 と入力します。
    • 宛先ポートの範囲(終了): 「514」と入力します。
  5. [送信] をクリックします。

管理契約を作成する

  1. [テナント> 管理 > 契約 > 標準] に移動します。
  2. [契約を作成] をクリックします。
  3. 次の構成の詳細を入力します。
    • 名前: 「mgmt-syslog-contract」と入力します。
    • スコープ: [コンテキスト] を選択します。
  4. [送信] をクリックします。
  5. 契約を開き、[Subjects] をクリックします。
  6. [Create Contract Subject] をクリックします。
  7. 次の構成の詳細を入力します。
    • 名前: 「syslog-subject」と入力します。
    • 両方向に適用: このオプションをオンにします。
  8. [送信] をクリックします。
  9. 件名を開き、[フィルタ] をクリックします。
  10. [フィルタ バインディングを作成] をクリックします。
  11. 先ほど作成した syslog-udp-514 フィルタを選択します。
  12. [送信] をクリックします。

Syslog 宛先グループを構成する

  1. [管理] > [外部データ コレクタ] > [モニタリングの宛先] > [Syslog] に移動します。
  2. [Syslog] を右クリックし、[Syslog モニタリング移行先グループを作成] を選択します。
  3. 次の構成の詳細を入力します。
    • 名前: 「Chronicle-Syslog-Group」と入力します。
    • Admin State: [Enabled] を選択します。
    • 形式: [aci] を選択します。
  4. [次へ] をクリックします。
  5. [Syslog モニタリングの宛先を作成] ダイアログで、次の操作を行います。
    • 名前: 「Chronicle-BindPlane」と入力します。
    • ホスト: Bindplane エージェント サーバーの IP アドレスを入力します。
    • ポート: 「514」と入力します。
    • Admin State: [Enabled] を選択します。
    • 重大度: [情報] を選択します(詳細なログをキャプチャするため)。
  6. [送信] をクリックします。

モニタリング ポリシーを構成する

ファブリック モニタリング ポリシー

  1. [Fabric] > [Fabric Policies] > [Policies] > [Monitoring] > [Common Policy] に移動します。
  2. [Callhome/Smart Callhome/SNMP/Syslog/TACACS] を展開します。
  3. [Syslog] を右クリックし、[Create Syslog Source] を選択します。
  4. 次の構成の詳細を入力します。
    • 名前: 「Chronicle-Fabric-Syslog」と入力します。
    • 監査ログ: 監査イベントを含める場合にオンにします。
    • イベント: システム イベントを含める場合にオンにします。
    • Faults: 障害イベントを含める場合にオンにします。
    • セッションログ: セッションログを含める場合にオンにします。
    • 宛先グループ: Chronicle-Syslog-Group を選択します。
  5. [送信] をクリックします。

アクセス モニタリング ポリシー

  1. [Fabric] > [Access Policies] > [Policies] > [Monitoring] > [Default Policy] に移動します。
  2. [Callhome/Smart Callhome/SNMP/Syslog] を開きます。
  3. [Syslog] を右クリックし、[Create Syslog Source] を選択します。
  4. 次の構成の詳細を入力します。
    • 名前: 「Chronicle-Access-Syslog」と入力します。
    • 監査ログ: 監査イベントを含める場合にオンにします。
    • イベント: システム イベントを含める場合にオンにします。
    • Faults: 障害イベントを含める場合にオンにします。
    • セッションログ: セッションログを含める場合にオンにします。
    • 宛先グループ: Chronicle-Syslog-Group を選択します。
  5. [送信] をクリックします。

システム Syslog メッセージ ポリシーを構成する

  1. [Fabric] > [Fabric Policies] > [Policies] > [Monitoring] > [Common Policy] に移動します。
  2. [Syslog Messages Policies] を開きます。
  3. [default] をクリックします。
  4. [施設フィルタ] セクションで次の操作を行います。
    • ファシリティ: [default] を選択します。
    • 最小重大度: [情報] に変更します。
  5. [送信] をクリックします。

オプション 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、トークン)を収集する

  1. HTTPS を使用して Cisco APIC コンソールにログインします。
  2. [Admin] > [AAA](APIC 6.0 以降)または [Admin] > [Authentication] > [AAA](以前のリリース)に移動します。
    • 注: APIC 6.0(1) 以降、AAA メニューのパスが変更されました。
  3. 適切な権限を持つローカル ユーザーを作成するか、既存のローカル ユーザーを使用します。
  4. 次の詳細をコピーして安全な場所に保存します。
    • APIC Username: モニタリング データへの読み取りアクセス権を持つローカル ユーザー
    • APIC Password: ユーザーのパスワード
    • APIC URL: APIC の HTTPS URL(例: https://apic.example.com

Google SecOps 用に AWS S3 バケットと IAM を構成する

  1. バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
  2. 後で参照できるように、バケットの名前リージョンを保存します(例: cisco-aci-logs)。
  3. IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
  4. 作成したユーザーを選択します。
  5. [セキュリティ認証情報] タブを選択します。
  6. [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
  7. [ユースケース] で [サードパーティ サービス] を選択します。
  8. [次へ] をクリックします。
  9. 省略可: 説明タグを追加します。
  10. [アクセスキーを作成] をクリックします。
  11. [CSV ファイルをダウンロード] をクリックし、[アクセスキー] と [シークレット アクセスキー] を保存して、今後の参照に備えます。
  12. [完了] をクリックします。
  13. [権限] タブを選択します。
  14. [権限ポリシー] セクションで [権限を追加] をクリックします。
  15. [権限を追加] を選択します。
  16. [ポリシーを直接アタッチする] を選択します。
  17. AmazonS3FullAccess ポリシーを検索します。
  18. ポリシーを選択します。
  19. [次へ] をクリックします。
  20. [権限を追加] をクリックします。

S3 アップロードの IAM ポリシーとロールを構成する

  1. AWS コンソールで、[IAM] > [ポリシー] に移動します。
  2. [ポリシーを作成> [JSON] タブ] をクリックします。
  3. 次のポリシーを入力します。

    {
      "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 を置き換えます。
  4. [次へ] > [ポリシーを作成] をクリックします。

  5. [IAM] > [ロール] > [ロールの作成] > [AWS サービス] > [Lambda] に移動します。

  6. 新しく作成したポリシーと AWSLambdaBasicExecutionRole 管理ポリシーを関連付けます。

  7. ロールに「cisco-aci-lambda-role」という名前を付けて、[ロールを作成] をクリックします。

Lambda 関数を作成する

  1. AWS コンソールで、[Lambda] > [Functions] > [Create function] に移動します。
  2. [Author from scratch] をクリックします。
  3. 次の構成情報を提供してください。

    • 名前: cisco-aci-events-collector
    • ランタイム: Python 3.13
    • アーキテクチャ: x86_64
    • 実行ロール: cisco-aci-lambda-role
  4. 関数を作成したら、[コード] タブを開き、スタブを削除して次のコード(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)}")
    
  5. [構成] > [環境変数] に移動します。

  6. [編集>新しい環境変数を追加] をクリックします。

  7. 次の環境変数を入力し、実際の値に置き換えます。

    • 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(省略可、実行ごとに取得する合計ページ数を制限します)
  8. 関数を作成したら、そのページにとどまるか、[Lambda] > [Functions] > [cisco-aci-events-collector] を開きます。

  9. [CONFIGURATION] タブを選択します。

  10. [全般設定] パネルで、[編集] をクリックします。

  11. [Timeout] を [5 minutes (300 seconds)] に変更し、[Save] をクリックします。

EventBridge スケジュールを作成する

  1. [Amazon EventBridge] > [Scheduler] > [スケジュールの作成] に移動します。
  2. 次の構成の詳細を入力します。
    • 定期的なスケジュール: レート15 minutes)。
    • ターゲット: Lambda 関数 cisco-aci-events-collector
    • 名前: cisco-aci-events-collector-15m
  3. [スケジュールを作成] をクリックします。

省略可: Google SecOps 用の読み取り専用の IAM ユーザーと鍵を作成する

  1. AWS コンソール > IAM > ユーザー > ユーザーを追加 に移動します。
  2. [ユーザーを追加] をクリックします。
  3. 次の構成の詳細を入力します。
    • ユーザー: 「secops-reader」と入力します。
    • アクセスの種類: [アクセスキー - プログラムによるアクセス] を選択します。
  4. [Create user] をクリックします。
  5. 最小限の読み取りポリシー(カスタム)を適用する: [ユーザー] > [secops-reader] > [権限] > [権限を追加] > [ポリシーを直接適用] > [ポリシーを作成]
  6. 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"
        }
      ]
    }
    
  7. 名前を secops-reader-policy に設定します。

  8. [Create policy] > を検索して選択 > [Next] > [Add permissions] に移動します。

  9. [セキュリティ認証情報] > [アクセスキー] > [アクセスキーを作成] に移動します。

  10. CSV をダウンロードします(これらの値はフィードに入力されます)。

Cisco ACI のログを取り込むように Google SecOps でフィードを構成する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [+ 新しいフィードを追加] をクリックします。
  3. [フィード名] フィールドに、フィードの名前を入力します(例: Cisco ACI JSON logs)。
  4. [ソースタイプ] として [Amazon S3 V2] を選択します。
  5. [Log type] として [Cisco Application Centric Infrastructure] を選択します。
  6. [次へ] をクリックします。
  7. 次の入力パラメータの値を指定します。
    • S3 URI: s3://cisco-aci-logs/cisco-aci-events/
    • Source deletion options: 必要に応じて削除オプションを選択します。
    • ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます。デフォルトは 180 日です。
    • アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
    • シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
    • アセットの名前空間: アセットの名前空間
    • Ingestion labels: このフィードのイベントに適用されるラベル。
  8. [次へ] をクリックします。
  9. [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 のプロフェッショナルから回答を得ることができます。