Recopila registros de Cisco Application Centric Infrastructure (ACI)

Se admite en los siguientes sistemas operativos:

En este documento, se explica cómo transferir registros de la infraestructura centrada en aplicaciones (ACI) de Cisco a Google Security Operations. En primer lugar, el analizador intenta procesar los registros de Cisco ACI entrantes como mensajes de syslog con patrones de Grok. Si falla el análisis de syslog, se supone que el mensaje está en formato JSON y se analiza en consecuencia. Por último, asigna los campos extraídos al modelo de datos unificado (UDM).

Esta integración admite dos métodos:

  • Opción 1: Formato de Syslog a través del agente de Bindplane
  • Opción 2: Formato JSON a través de AWS S3 con la API de REST de APIC

Cada opción es independiente y se puede implementar por separado según los requisitos de infraestructura y las preferencias de formato de registro.

Opción 1: Syslog a través del agente de Bindplane

Esta opción configura el tejido de Cisco ACI para enviar mensajes de syslog a un agente de Bindplane, que los reenvía a Chronicle para su análisis.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos previos:

  • Una instancia de Google SecOps
  • Un host de Windows 2016 o posterior, o Linux con systemd
  • Si se ejecuta detrás de un proxy, asegúrate de que los puertos de firewall estén abiertos según los requisitos del agente de Bindplane.
  • Acceso con privilegios a la consola de Cisco APIC

Obtén el archivo de autenticación de transferencia de Google SecOps

  1. Accede a la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Agentes de recopilación.
  3. Descarga el archivo de autenticación de transferencia. Guarda el archivo de forma segura en el sistema en el que se instalará BindPlane.

Obtén el ID de cliente de Google SecOps

  1. Accede a la consola de Google SecOps.
  2. Ve a Configuración de SIEM > Perfil.
  3. Copia y guarda el ID de cliente de la sección Detalles de la organización.

Instala el agente de BindPlane

Instala el agente de Bindplane en tu sistema operativo Windows o Linux según las siguientes instrucciones.

Instalación en Windows

  1. Abre el símbolo del sistema o PowerShell como administrador.
  2. Ejecuta el comando siguiente:

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

Instalación en Linux

  1. Abre una terminal con privilegios de raíz o sudo.
  2. Ejecuta el comando siguiente:

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

Recursos de instalación adicionales

Configura el agente de BindPlane para transferir Syslog y enviarlo a Google SecOps

  1. Accede al archivo de configuración:

    1. Ubica el archivo config.yaml. Por lo general, se encuentra en el directorio /etc/bindplane-agent/ en Linux o en el directorio de instalación en Windows.
    2. Abre el archivo con un editor de texto (por ejemplo, nano, vi o Bloc de notas).
  2. Edita el archivo config.yaml de la siguiente manera:

    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
    

Reinicia el agente de Bindplane para aplicar los cambios

  • Para reiniciar el agente de Bindplane en Linux, ejecuta el siguiente comando:

    sudo systemctl restart bindplane-agent
    
  • Para reiniciar el agente de Bindplane en Windows, puedes usar la consola de Servicios o ingresar el siguiente comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Configura el reenvío de Syslog en Cisco ACI

Configura el contrato de administración fuera de banda

  1. Accede a la consola de Cisco APIC.
  2. Ve a Tenants > mgmt > Contracts > Filters.
  3. Haz clic en Crear filtro.
  4. Proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa syslog-udp-514.
    • Nombre de entrada: Ingresa syslog.
    • EtherType: Selecciona IP.
    • Protocolo IP: Selecciona UDP.
    • Rango de puertos de destino (desde): Ingresa 514.
    • Rango de puertos de destino hasta: Ingresa 514.
  5. Haz clic en Enviar.

Crear contrato de administración

  1. Ve a Tenants > mgmt > Contracts > Standard.
  2. Haz clic en Crear contrato.
  3. Proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa mgmt-syslog-contract.
    • Alcance: Selecciona Contexto.
  4. Haz clic en Enviar.
  5. Expande el contrato y haz clic en Temas.
  6. Haz clic en Crear asunto del contrato.
  7. Proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa syslog-subject.
    • Aplicar en ambas direcciones: Marca esta opción.
  8. Haz clic en Enviar.
  9. Expande el asunto y haz clic en Filtros.
  10. Haz clic en Create Filter Binding.
  11. Selecciona el filtro syslog-udp-514 que creaste antes.
  12. Haz clic en Enviar.

Configura el grupo de destino de Syslog

  1. Ve a Administrador > Recopiladores de datos externos > Destinos de supervisión > Syslog.
  2. Haz clic con el botón derecho en Syslog y selecciona Create Syslog Monitoring Destination Group.
  3. Proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa Chronicle-Syslog-Group.
    • Estado de administrador: Selecciona Habilitado.
    • Formato: Selecciona aci.
  4. Haz clic en Siguiente.
  5. En el diálogo Create Syslog Monitoring Destination, haz lo siguiente:
    • Nombre: Ingresa Chronicle-BindPlane.
    • Host: Ingresa la dirección IP del servidor del agente de Bindplane.
    • Puerto: Ingresa 514.
    • Estado de administrador: Selecciona Habilitado.
    • Gravedad: Selecciona información (para capturar registros detallados).
  6. Haz clic en Enviar.

Configura políticas de supervisión

Política de supervisión de Fabric

  1. Ve a Fabric > Fabric Policies > Policies > Monitoring > Common Policy.
  2. Expande Callhome/Smart Callhome/SNMP/Syslog/TACACS.
  3. Haz clic con el botón derecho en Syslog y selecciona Create Syslog Source.
  4. Proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa Chronicle-Fabric-Syslog.
    • Registros de auditoría: Marca esta opción para incluir eventos de auditoría.
    • Eventos: Marca esta opción para incluir los eventos del sistema.
    • Faults: Marca esta opción para incluir eventos de fallas.
    • Registros de sesión: Marca esta opción para incluir los registros de sesión.
    • Grupo de destino: Selecciona Chronicle-Syslog-Group.
  5. Haz clic en Enviar.

Política de Supervisión de Acceso

  1. Ve a Fabric > Access Policies > Policies > Monitoring > Default Policy.
  2. Expande Callhome/Smart Callhome/SNMP/Syslog.
  3. Haz clic con el botón derecho en Syslog y selecciona Create Syslog Source.
  4. Proporciona los siguientes detalles de configuración:
    • Nombre: Ingresa Chronicle-Access-Syslog.
    • Registros de auditoría: Marca esta opción para incluir eventos de auditoría.
    • Eventos: Marca esta opción para incluir los eventos del sistema.
    • Faults: Marca esta opción para incluir eventos de fallas.
    • Registros de sesión: Marca esta opción para incluir los registros de sesión.
    • Grupo de destino: Selecciona Chronicle-Syslog-Group.
  5. Haz clic en Enviar.

Configura la política de mensajes de Syslog del sistema

  1. Ve a Fabric > Fabric Policies > Policies > Monitoring > Common Policy.
  2. Expande Políticas de mensajes de Syslog.
  3. Haz clic en predeterminada.
  4. En la sección Facility Filter, haz lo siguiente:
    • Instalación: Selecciona predeterminado.
    • Minimum Severity: Cambia a information.
  5. Haz clic en Enviar.

Opción 2: JSON a través de AWS S3

Esta opción usa la API de REST de APIC para recopilar eventos, fallas y registros de auditoría con formato JSON del tejido de Cisco ACI y los almacena en AWS S3 para la incorporación de SecOps.

Antes de comenzar

  • Es la instancia de Google SecOps.
  • Acceso con privilegios a la consola de Cisco APIC
  • Acceso con privilegios a AWS (S3, IAM, Lambda, EventBridge).

Recopila los requisitos previos de Cisco ACI APIC (IDs, claves de API, IDs de organización y tokens)

  1. Accede a la consola de Cisco APIC a través de HTTPS.
  2. Ve a Admin > AAA (en APIC 6.0 y versiones posteriores) o Admin > Authentication > AAA (en versiones anteriores).
    • Nota: La ruta de menú de AAA cambió a partir de APIC 6.0(1).
  3. Crea un usuario local nuevo o usa uno existente con los privilegios adecuados.
  4. Copia y guarda en una ubicación segura los siguientes detalles:
    • Nombre de usuario de APIC: Usuario local con acceso de lectura a los datos de supervisión
    • Contraseña de APIC: Contraseña del usuario
    • URL de APIC: Es la URL HTTPS de tu APIC (por ejemplo, https://apic.example.com).

Configura el bucket de AWS S3 y el IAM para Google SecOps

  1. Crea un bucket de Amazon S3 siguiendo esta guía del usuario: Cómo crear un bucket.
  2. Guarda el Nombre y la Región del bucket para futuras referencias (por ejemplo, cisco-aci-logs).
  3. Crea un usuario siguiendo esta guía del usuario: Cómo crear un usuario de IAM.
  4. Selecciona el usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. Haz clic en Crear clave de acceso en la sección Claves de acceso.
  7. Selecciona Servicio de terceros como Caso de uso.
  8. Haz clic en Siguiente.
  9. Opcional: Agrega una etiqueta de descripción.
  10. Haz clic en Crear clave de acceso.
  11. Haz clic en Descargar archivo CSV para guardar la clave de acceso y la clave de acceso secreta para consultarlas en el futuro.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permisos.
  14. Haz clic en Agregar permisos en la sección Políticas de permisos.
  15. Selecciona Agregar permisos.
  16. Selecciona Adjuntar políticas directamente.
  17. Busca la política AmazonS3FullAccess.
  18. Selecciona la política.
  19. Haz clic en Siguiente.
  20. Haz clic en Agregar permisos.

Configura la política y el rol de IAM para las cargas de S3

  1. En la consola de AWS, ve a IAM > Políticas.
  2. Haz clic en Crear política > pestaña JSON.
  3. Ingresa la siguiente política:

    {
      "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"
        }
      ]
    }
    
    • Reemplaza cisco-aci-logs si ingresaste un nombre de bucket diferente.
  4. Haz clic en Siguiente > Crear política.

  5. Ve a IAM > Roles > Crear rol > Servicio de AWS > Lambda.

  6. Adjunta la política recién creada y la política administrada AWSLambdaBasicExecutionRole.

  7. Nombra el rol cisco-aci-lambda-role y haz clic en Crear rol.

Crea la función Lambda

  1. En la consola de AWS, ve a Lambda > Functions > Create function.
  2. Haz clic en Crear desde cero.
  3. Proporciona los siguientes detalles de configuración:

    • Nombre: cisco-aci-events-collector
    • Entorno de ejecución: Python 3.13
    • Arquitectura: x86_64
    • Rol de ejecución: cisco-aci-lambda-role
  4. Después de crear la función, abre la pestaña Code, borra el código auxiliar y, luego, ingresa el siguiente código (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. Ve a Configuration > Environment variables.

  6. Haz clic en Editar > Agregar nueva variable de entorno.

  7. Ingresa las siguientes variables de entorno proporcionadas y reemplázalas por tus valores.

    • 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 (opcional, controla el tamaño de la paginación)
    • MAX_PAGES: 10 (opcional, limita la cantidad total de páginas recuperadas por ejecución)
  8. Después de crear la función, permanece en su página (o abre Lambda > Functions > cisco-aci-events-collector).

  9. Selecciona la pestaña Configuración.

  10. En el panel Configuración general, haz clic en Editar.

  11. Cambia Tiempo de espera a 5 minutos (300 segundos) y haz clic en Guardar.

Crea una programación de EventBridge

  1. Ve a Amazon EventBridge > Scheduler > Create schedule.
  2. Proporciona los siguientes detalles de configuración:
    • Programación recurrente: Frecuencia (15 minutes).
    • Destino: Tu función Lambda cisco-aci-events-collector.
    • Nombre: cisco-aci-events-collector-15m.
  3. Haz clic en Crear programación.

Opcional: Crea un usuario y claves de IAM de solo lectura para Google SecOps

  1. Ve a Consola de AWS > IAM > Usuarios > Agregar usuarios.
  2. Haz clic en Agregar usuarios.
  3. Proporciona los siguientes detalles de configuración:
    • Usuario: Ingresa secops-reader.
    • Tipo de acceso: Selecciona Clave de acceso: Acceso programático.
  4. Haz clic en Crear usuario.
  5. Adjunta una política de lectura mínima (personalizada): Usuarios > secops-reader > Permisos > Agregar permisos > Adjuntar políticas directamente > Crear política.
  6. En el editor de JSON, ingresa la siguiente política:

    {
      "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. Configura el nombre como secops-reader-policy.

  8. Ve a Crear política > busca o selecciona > Siguiente > Agregar permisos.

  9. Ve a Credenciales de seguridad > Claves de acceso > Crear clave de acceso.

  10. Descarga el archivo CSV (estos valores se ingresan en el feed).

Configura un feed en Google SecOps para transferir registros de Cisco ACI

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en + Agregar feed nuevo.
  3. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Cisco ACI JSON logs).
  4. Selecciona Amazon S3 V2 como el Tipo de fuente.
  5. Selecciona Cisco Application Centric Infrastructure como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifica valores para los siguientes parámetros de entrada:
    • URI de S3: s3://cisco-aci-logs/cisco-aci-events/
    • Opciones de borrado de la fuente: Selecciona la opción de borrado según tu preferencia.
    • Antigüedad máxima del archivo: Incluye los archivos modificados en la cantidad de días especificada. El valor predeterminado es de 180 días.
    • ID de clave de acceso: Clave de acceso del usuario con acceso al bucket de S3.
    • Clave de acceso secreta: Clave secreta del usuario con acceso al bucket de S3.
    • Espacio de nombres del recurso: Es el espacio de nombres del recurso.
    • Etiquetas de transmisión: Es la etiqueta que se aplica a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
@timestamp read_only_udm.metadata.event_timestamp El valor se toma del campo de registro sin procesar "@timestamp" y se analiza como una marca de tiempo.
aci_tag read_only_udm.metadata.product_log_id El valor se toma del campo de registro sin procesar "aci_tag".
cisco_timestamp - Sin asignar.
DIP read_only_udm.target.ip El valor se toma del campo de registro sin procesar "DIP".
DPort read_only_udm.target.port El valor se toma del campo de registro sin procesar "DPort" y se convierte en un número entero.
descripción read_only_udm.security_result.description El valor se toma del campo de registro sin procesar "description".
fault_cause read_only_udm.additional.fields.value.string_value El valor se toma del campo de registro sin procesar "fault_cause". La clave se establece en "Causa de la falla".
Nombre de host read_only_udm.principal.hostname El valor se toma del campo de registro sin procesar "hostname".
lifecycle_state read_only_udm.metadata.product_event_type El valor se toma del campo de registro sin procesar "lifecycle_state".
log.source.address - Sin asignar.
logstash.collect.host - Sin asignar.
logstash.collect.timestamp read_only_udm.metadata.collected_timestamp El valor se toma del campo de registro sin procesar "logstash.collect.timestamp" y se analiza como una marca de tiempo.
logstash.ingest.host read_only_udm.intermediary.hostname El valor se toma del campo de registro sin procesar "logstash.ingest.host".
logstash.irm_environment read_only_udm.additional.fields.value.string_value El valor se toma del campo de registro sin procesar "logstash.irm_environment". La clave se establece en "IRM_Environment".
logstash.irm_region read_only_udm.additional.fields.value.string_value El valor se toma del campo de registro sin procesar "logstash.irm_region". La clave se establece en "IRM_Region".
logstash.irm_site read_only_udm.additional.fields.value.string_value El valor se toma del campo de registro sin procesar "logstash.irm_site". La clave se establece en "IRM_Site".
logstash.process.host read_only_udm.intermediary.hostname El valor se toma del campo de registro sin procesar "logstash.process.host".
mensaje - Sin asignar.
message_class - Sin asignar.
message_code - Sin asignar.
message_content - Sin asignar.
message_dn - Sin asignar.
message_type read_only_udm.metadata.product_event_type El valor se toma del campo de registro sin procesar "message_type" después de quitar los corchetes.
node_link read_only_udm.principal.process.file.full_path El valor se toma del campo de registro sin procesar "node_link".
PktLen read_only_udm.network.received_bytes El valor se toma del campo de registro sin procesar "PktLen" y se convierte en un número entero sin signo.
programa - Sin asignar.
Proto read_only_udm.network.ip_protocol El valor se toma del campo de registro sin procesar "Proto", se convierte en un número entero y se asigna al nombre del protocolo IP correspondiente (p.ej., 6 -> TCP).
SIP read_only_udm.principal.ip El valor se toma del campo de registro sin procesar "SIP".
SPort read_only_udm.principal.port El valor se toma del campo de registro sin procesar "SPort" y se convierte en un número entero.
syslog_facility - Sin asignar.
syslog_facility_code - Sin asignar.
syslog_host read_only_udm.principal.ip, read_only_udm.observer.ip El valor se toma del campo de registro sin procesar "syslog_host".
syslog_prog - Sin asignar.
syslog_severity read_only_udm.security_result.severity_details El valor se toma del campo de registro sin procesar "syslog_severity".
syslog_severity_code read_only_udm.security_result.severity El valor se toma del campo de registro sin procesar "syslog_severity_code" y se asigna al nivel de gravedad correspondiente: 5, 6, 7 -> INFORMATIONAL; 3, 4 -> MEDIUM; 0, 1, 2 -> HIGH.
syslog5424_pri - Sin asignar.
Vlan-Id read_only_udm.principal.resource.id El valor se toma del campo de registro sin procesar "Vlan-Id".
- read_only_udm.metadata.event_type Lógica: Si están presentes "SIP" o "hostname" y "Proto", se establece en "NETWORK_CONNECTION". De lo contrario, si se incluye "SIP", "hostname" o "syslog_host", se establece en "STATUS_UPDATE". De lo contrario, se establece como "GENERIC_EVENT".
- read_only_udm.metadata.log_type Lógica: Se establece en "CISCO_ACI".
- read_only_udm.metadata.vendor_name Lógica: Se establece en "Cisco".
- read_only_udm.metadata.product_name Lógica: Se establece en "ACI".

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.