Coletar registros do Cisco Application Centric Infrastructure (ACI)

Compatível com:

Este documento explica como ingerir registros da Cisco Application Centric Infrastructure (ACI) no Google Security Operations. Primeiro, o analisador tenta processar os registros do Cisco ACI como mensagens syslog usando padrões Grok. Se a análise do syslog falhar, a mensagem será considerada no formato JSON e analisada de acordo. Por fim, ele mapeia os campos extraídos para o modelo de dados unificado (UDM).

Essa integração é compatível com dois métodos:

  • Opção 1: formato Syslog usando o agente Bindplane
  • Opção 2: formato JSON via AWS S3 usando a API REST do APIC

Cada opção é independente e pode ser implementada separadamente com base nos requisitos de infraestrutura e nas preferências de formato de registro.

Opção 1: Syslog via agente do Bindplane

Essa opção configura a estrutura do Cisco ACI para enviar mensagens syslog a um agente do Bindplane, que as encaminha para o Chronicle para análise.

Antes de começar

Verifique se você tem os pré-requisitos a seguir:

  • Uma instância do Google SecOps
  • Um host Windows 2016 ou mais recente ou Linux com systemd
  • Se você estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas de acordo com os requisitos do agente Bindplane.
  • Acesso privilegiado ao console do Cisco APIC

Receber o arquivo de autenticação de ingestão do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Agentes de coleta.
  3. Baixe o arquivo de autenticação de ingestão. Salve o arquivo de forma segura no sistema em que o Bindplane será instalado.

Receber o ID de cliente do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Perfil.
  3. Copie e salve o ID do cliente na seção Detalhes da organização.

Instalar o agente do Bindplane

Instale o agente do Bindplane no seu sistema operacional Windows ou Linux de acordo com as instruções a seguir.

Instalação do Windows

  1. Abra o Prompt de Comando ou o PowerShell como administrador.
  2. Execute este comando:

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

Instalação do Linux

  1. Abra um terminal com privilégios de root ou sudo.
  2. Execute este comando:

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

Outros recursos de instalação

Configurar o agente do Bindplane para ingerir o Syslog e enviar ao Google SecOps

  1. Acesse o arquivo de configuração:

    1. Localize o arquivo config.yaml. Normalmente, ele fica no diretório /etc/bindplane-agent/ no Linux ou no diretório de instalação no Windows.
    2. Abra o arquivo usando um editor de texto (por exemplo, nano, vi ou Bloco de Notas).
  2. Edite o arquivo config.yaml da seguinte forma:

    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
    
    • Substitua a porta e o endereço IP conforme necessário na sua infraestrutura.
    • Substitua <customer_id> pelo ID do cliente real.
    • Atualize /path/to/ingestion-authentication-file.json para o caminho em que o arquivo de autenticação foi salvo na seção Receber arquivo de autenticação de ingestão do Google SecOps.

Reinicie o agente do Bindplane para aplicar as mudanças

  • Para reiniciar o agente do Bindplane no Linux, execute o seguinte comando:

    sudo systemctl restart bindplane-agent
    
  • Para reiniciar o agente do Bindplane no Windows, use o console Serviços ou insira o seguinte comando:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Configurar o encaminhamento de syslog no Cisco ACI

Configurar o contrato de gerenciamento fora da banda

  1. Faça login no console do Cisco APIC.
  2. Acesse Locatários > gerenciamento > Contratos > Filtros.
  3. Clique em Criar filtro.
  4. Informe os seguintes detalhes de configuração:
    • Nome: insira syslog-udp-514.
    • Nome da entrada: insira syslog.
    • EtherType: selecione IP.
    • Protocolo IP: selecione UDP.
    • Intervalo de porta de destino de: insira 514.
    • Intervalo de porta de destino até: insira 514.
  5. Clique em Enviar.

Criar contrato de gerenciamento

  1. Acesse Locatários > gerenciamento > Contratos > Padrão.
  2. Clique em Criar contrato.
  3. Informe os seguintes detalhes de configuração:
    • Nome: insira mgmt-syslog-contract.
    • Escopo: selecione Contexto.
  4. Clique em Enviar.
  5. Abra o contrato e clique em Assuntos.
  6. Clique em Criar assunto do contrato.
  7. Informe os seguintes detalhes de configuração:
    • Nome: insira syslog-subject.
    • Aplicar ambas as direções: marque essa opção.
  8. Clique em Enviar.
  9. Expanda o assunto e clique em Filtros.
  10. Clique em Criar vinculação de filtro.
  11. Selecione o filtro syslog-udp-514 criado anteriormente.
  12. Clique em Enviar.

Configurar grupo de destino do Syslog

  1. Acesse Administrador > Coletores de dados externos > Destinos de monitoramento > Syslog.
  2. Clique com o botão direito do mouse em Syslog e selecione Criar grupo de destino de monitoramento do Syslog.
  3. Informe os seguintes detalhes de configuração:
    • Nome: insira Chronicle-Syslog-Group.
    • Estado do administrador: selecione Ativado.
    • Formato: selecione aci.
  4. Clique em Próxima.
  5. Na caixa de diálogo Criar destino de monitoramento do Syslog:
    • Nome: insira Chronicle-BindPlane.
    • Host: insira o endereço IP do servidor do agente do Bindplane.
    • Porta: insira 514.
    • Estado do administrador: selecione Ativado.
    • Gravidade: selecione Informações para capturar registros detalhados.
  6. Clique em Enviar.

Configurar políticas de monitoramento

Política de monitoramento do Fabric

  1. Acesse Fábrica > Políticas da fábrica > Políticas > Monitoramento > Política comum.
  2. Expanda Callhome/Smart Callhome/SNMP/Syslog/TACACS.
  3. Clique com o botão direito do mouse em Syslog e selecione Criar fonte Syslog.
  4. Informe os seguintes detalhes de configuração:
    • Nome: insira Chronicle-Fabric-Syslog.
    • Registros de auditoria: marque para incluir eventos de auditoria.
    • Eventos: marque para incluir eventos do sistema.
    • Falhas: marque para incluir eventos de falha.
    • Registros de sessão: marque para incluir registros de sessão.
    • Grupo de destino: selecione Chronicle-Syslog-Group.
  5. Clique em Enviar.

Política de monitoramento de acesso

  1. Acesse Fabric > Políticas de acesso > Políticas > Monitoramento > Política padrão.
  2. Expanda Callhome/Smart Callhome/SNMP/Syslog.
  3. Clique com o botão direito do mouse em Syslog e selecione Criar fonte Syslog.
  4. Informe os seguintes detalhes de configuração:
    • Nome: insira Chronicle-Access-Syslog.
    • Registros de auditoria: marque para incluir eventos de auditoria.
    • Eventos: marque para incluir eventos do sistema.
    • Falhas: marque para incluir eventos de falha.
    • Registros de sessão: marque para incluir registros de sessão.
    • Grupo de destino: selecione Chronicle-Syslog-Group.
  5. Clique em Enviar.

Configurar a política de mensagens do Syslog do sistema

  1. Acesse Fábrica > Políticas da fábrica > Políticas > Monitoramento > Política comum.
  2. Expanda Políticas de mensagens Syslog.
  3. Selecione padrão.
  4. Na seção Filtro de unidade:
    • Unidade: selecione padrão.
    • Gravidade mínima: mude para informações.
  5. Clique em Enviar.

Opção 2: JSON via AWS S3

Essa opção usa a API REST do APIC para coletar eventos, falhas e registros de auditoria formatados em JSON da estrutura do Cisco ACI e os armazena no AWS S3 para ingestão do SecOps.

Antes de começar

  • Instância do Google SecOps.
  • Acesso privilegiado ao console do Cisco APIC.
  • Acesso privilegiado à AWS (S3, IAM, Lambda, EventBridge).

Coletar pré-requisitos do Cisco ACI APIC (IDs, chaves de API, IDs de organização, tokens)

  1. Faça login no console do Cisco APIC usando HTTPS.
  2. Acesse Admin > AAA (no APIC 6.0 ou mais recente) ou Admin > Authentication > AAA (em versões mais antigas).
    • Observação: o caminho do menu AAA mudou a partir do APIC 6.0(1).
  3. Crie ou use um usuário local com os privilégios adequados.
  4. Copie e salve em um local seguro os seguintes detalhes:
    • Nome de usuário do APIC: usuário local com acesso de leitura aos dados de monitoramento
    • Senha da APIC: senha do usuário
    • URL do APIC: o URL HTTPS do APIC (por exemplo, https://apic.example.com)

Configurar o bucket do AWS S3 e o IAM para o Google SecOps

  1. Crie um bucket do Amazon S3 seguindo este guia do usuário: Como criar um bucket.
  2. Salve o Nome e a Região do bucket para referência futura (por exemplo, cisco-aci-logs).
  3. Crie um usuário seguindo este guia: Como criar um usuário do IAM.
  4. Selecione o usuário criado.
  5. Selecione a guia Credenciais de segurança.
  6. Clique em Criar chave de acesso na seção Chaves de acesso.
  7. Selecione Serviço de terceiros como Caso de uso.
  8. Clique em Próxima.
  9. Opcional: adicione uma tag de descrição.
  10. Clique em Criar chave de acesso.
  11. Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para referência futura.
  12. Clique em Concluído.
  13. Selecione a guia Permissões.
  14. Clique em Adicionar permissões na seção Políticas de permissões.
  15. Selecione Adicionar permissões.
  16. Selecione Anexar políticas diretamente.
  17. Pesquise a política AmazonS3FullAccess.
  18. Selecione a política.
  19. Clique em Próxima.
  20. Clique em Adicionar permissões

Configurar a política e o papel do IAM para uploads do S3

  1. No console da AWS, acesse IAM > Políticas.
  2. Clique em Criar política > guia JSON.
  3. Insira a seguinte 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"
        }
      ]
    }
    
    • Substitua cisco-aci-logs se você tiver inserido um nome de bucket diferente.
  4. Clique em Próxima > Criar política.

  5. Acesse IAM > Funções > Criar função > Serviço da AWS > Lambda.

  6. Anexe a política recém-criada e a política gerenciada AWSLambdaBasicExecutionRole.

  7. Nomeie a função como cisco-aci-lambda-role e clique em Criar função.

Criar a função Lambda

  1. No console da AWS, acesse Lambda > Functions > Create function.
  2. Clique em Criar do zero.
  3. Informe os seguintes detalhes de configuração:

    • Nome: cisco-aci-events-collector
    • Tempo de execução: Python 3.13
    • Arquitetura: x86_64
    • Função de execução: cisco-aci-lambda-role
  4. Depois que a função for criada, abra a guia Código, exclua o stub e insira o seguinte 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. Acesse Configuração > Variáveis de ambiente.

  6. Clique em Editar > Adicionar nova variável de ambiente.

  7. Insira as variáveis de ambiente a seguir, substituindo pelos seus 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 o tamanho da paginação)
    • MAX_PAGES: 10 (opcional, limita o total de páginas buscadas por execução)
  8. Depois que a função for criada, permaneça na página dela ou abra Lambda > Functions > cisco-aci-events-collector.

  9. Selecione a guia Configuração.

  10. No painel Configuração geral, clique em Editar.

  11. Mude Tempo limite para 5 minutos (300 segundos) e clique em Salvar.

Criar uma programação do EventBridge

  1. Acesse Amazon EventBridge > Scheduler > Criar programação.
  2. Informe os seguintes detalhes de configuração:
    • Programação recorrente: Taxa (15 minutes).
    • Destino: sua função Lambda cisco-aci-events-collector.
    • Nome: cisco-aci-events-collector-15m.
  3. Clique em Criar programação.

Opcional: criar um usuário e chaves do IAM somente leitura para o Google SecOps

  1. Acesse Console da AWS > IAM > Usuários > Adicionar usuários.
  2. Clique em Add users.
  3. Informe os seguintes detalhes de configuração:
    • Usuário: insira secops-reader.
    • Tipo de acesso: selecione Chave de acesso – Acesso programático.
  4. Clique em Criar usuário.
  5. Anexe a política de leitura mínima (personalizada): Usuários > secops-reader > Permissões > Adicionar permissões > Anexar políticas diretamente > Criar política.
  6. No editor JSON, insira a seguinte 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. Defina o nome como secops-reader-policy.

  8. Acesse Criar política > pesquise/selecione > Próxima > Adicionar permissões.

  9. Acesse Credenciais de segurança > Chaves de acesso > Criar chave de acesso.

  10. Faça o download do CSV (esses valores são inseridos no feed).

Configurar um feed no Google SecOps para ingerir registros do Cisco ACI

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em + Adicionar novo feed.
  3. No campo Nome do feed, insira um nome para o feed (por exemplo, Cisco ACI JSON logs).
  4. Selecione Amazon S3 V2 como o Tipo de origem.
  5. Selecione Infraestrutura centrada em aplicativos da Cisco como o Tipo de registro.
  6. Clique em Próxima.
  7. Especifique valores para os seguintes parâmetros de entrada:
    • URI do S3: s3://cisco-aci-logs/cisco-aci-events/
    • Opções de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência.
    • Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
    • ID da chave de acesso: chave de acesso do usuário com acesso ao bucket do S3.
    • Chave de acesso secreta: chave secreta do usuário com acesso ao bucket do S3.
    • Namespace do recurso: o namespace do recurso.
    • Rótulos de ingestão: o rótulo aplicado aos eventos deste feed.
  8. Clique em Próxima.
  9. Revise a nova configuração do feed na tela Finalizar e clique em Enviar.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
@timestamp read_only_udm.metadata.event_timestamp O valor é extraído do campo de registro bruto "@timestamp" e analisado como um carimbo de data/hora.
aci_tag read_only_udm.metadata.product_log_id O valor é extraído do campo de registro bruto "aci_tag".
cisco_timestamp - Não mapeado.
DIP read_only_udm.target.ip O valor é extraído do campo de registro bruto "DIP".
DPort read_only_udm.target.port O valor é extraído do campo de registro bruto "DPort" e convertido em número inteiro.
descrição read_only_udm.security_result.description O valor é extraído do campo de registro bruto "description".
fault_cause read_only_udm.additional.fields.value.string_value O valor é extraído do campo de registro bruto "fault_cause". A chave é definida como "Causa da falha".
nome do host read_only_udm.principal.hostname O valor é extraído do campo de registro bruto "hostname".
lifecycle_state read_only_udm.metadata.product_event_type O valor é extraído do campo de registro bruto "lifecycle_state".
log.source.address - Não mapeado.
logstash.collect.host - Não mapeado.
logstash.collect.timestamp read_only_udm.metadata.collected_timestamp O valor é extraído do campo de registro bruto "logstash.collect.timestamp" e analisado como um carimbo de data/hora.
logstash.ingest.host read_only_udm.intermediary.hostname O valor é extraído do campo de registro bruto "logstash.ingest.host".
logstash.irm_environment read_only_udm.additional.fields.value.string_value O valor é extraído do campo de registro bruto "logstash.irm_environment". A chave é definida como "IRM_Environment".
logstash.irm_region read_only_udm.additional.fields.value.string_value O valor é extraído do campo de registro bruto "logstash.irm_region". A chave é definida como "IRM_Region".
logstash.irm_site read_only_udm.additional.fields.value.string_value O valor é extraído do campo de registro bruto "logstash.irm_site". A chave é definida como "IRM_Site".
logstash.process.host read_only_udm.intermediary.hostname O valor é extraído do campo de registro bruto "logstash.process.host".
mensagem - Não mapeado.
message_class - Não mapeado.
message_code - Não mapeado.
message_content - Não mapeado.
message_dn - Não mapeado.
message_type read_only_udm.metadata.product_event_type O valor é extraído do campo de registro bruto "message_type" após a remoção dos colchetes.
node_link read_only_udm.principal.process.file.full_path O valor é extraído do campo de registro bruto "node_link".
PktLen read_only_udm.network.received_bytes O valor é extraído do campo de registro bruto "PktLen" e convertido em um número inteiro sem sinal.
programa - Não mapeado.
Proto read_only_udm.network.ip_protocol O valor é extraído do campo de registro bruto "Proto", convertido em número inteiro e mapeado para o nome do protocolo IP correspondente (por exemplo, 6 -> TCP).
SIP read_only_udm.principal.ip O valor é extraído do campo de registro bruto "SIP".
SPort read_only_udm.principal.port O valor é extraído do campo de registro bruto "SPort" e convertido em número inteiro.
syslog_facility - Não mapeado.
syslog_facility_code - Não mapeado.
syslog_host read_only_udm.principal.ip, read_only_udm.observer.ip O valor é extraído do campo de registro bruto "syslog_host".
syslog_prog - Não mapeado.
syslog_severity read_only_udm.security_result.severity_details O valor é extraído do campo de registro bruto "syslog_severity".
syslog_severity_code read_only_udm.security_result.severity O valor é extraído do campo de registro bruto "syslog_severity_code" e mapeado para o nível de gravidade correspondente: 5, 6, 7 -> INFORMATIONAL; 3, 4 -> MEDIUM; 0, 1, 2 -> HIGH.
syslog5424_pri - Não mapeado.
Vlan-Id read_only_udm.principal.resource.id O valor é extraído do campo de registro bruto "Vlan-Id".
- read_only_udm.metadata.event_type Lógica: se "SIP" ou "hostname" estiver presente e "Proto" estiver presente, defina como "NETWORK_CONNECTION". Caso contrário, se "SIP", "hostname" ou "syslog_host" estiverem presentes, defina como "STATUS_UPDATE". Caso contrário, defina como "GENERIC_EVENT".
- read_only_udm.metadata.log_type Lógica: definido como "CISCO_ACI".
- read_only_udm.metadata.vendor_name Lógica: definido como "Cisco".
- read_only_udm.metadata.product_name Lógica: definida como "ACI".

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.