Coletar registros do Elastic Auditbeat

Compatível com:

Este documento explica como ingerir registros do Elastic Auditbeat no Google Security Operations usando o Amazon S3. O analisador extrai campos dos registros JSON, normaliza-os no modelo de dados unificado (UDM) e enriquece os dados com contexto adicional, como informações do host, detalhes da rede e classificações de resultados de segurança. Ele processa vários tipos de eventos mapeando event1.action e outros campos para tipos de eventos de metadados específicos da UDM, usando GENERIC_EVENT ou categorias mais específicas quando possível.

Antes de começar

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

  • Uma instância do Google SecOps.
  • Acesso privilegiado ao servidor Elastic Auditbeat.
  • Acesso privilegiado ao servidor Logstash.
  • Acesso privilegiado à AWS (S3, Identity and Access Management [IAM]).

Conferir os pré-requisitos do Elastic Auditbeat

  1. Confira se o Elastic Auditbeat está instalado e configurado nos seus servidores.
  2. Instale o Logstash em um servidor dedicado ou junto com o Auditbeat.
  3. Anote o local do arquivo de configuração do Auditbeat (normalmente /etc/auditbeat/auditbeat.yml).

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, elastic-auditbeat-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 o Auditbeat para enviar ao Logstash

  1. Edite o arquivo de configuração do Auditbeat /etc/auditbeat/auditbeat.yml.
  2. Comente qualquer configuração de saída atual (Elasticsearch etc.).
  3. Adicione a configuração de saída do Logstash:

    # ==================== Outputs ====================
    output.logstash:
      hosts: ["localhost:5044"]
      # If Logstash is on a different server, use its IP/hostname
      # hosts: ["logstash-server:5044"]
    
      # Optional: Enable load balancing if using multiple Logstash instances
      loadbalance: true
    
      # Optional: Configure bulk settings (default is 2048)
      bulk_max_size: 2048
    
      # Optional: Configure SSL if needed
      # ssl.enabled: true
      # ssl.certificate_authorities: ["/path/to/ca.crt"]
    
  4. Reinicie o Auditbeat para aplicar as mudanças:

    sudo systemctl restart auditbeat
    

Configurar o pipeline do Logstash

  1. Crie um arquivo de configuração de pipeline do Logstash /etc/logstash/conf.d/auditbeat-to-s3.conf:

    input {
      beats {
        port => 5044
        # Optional: Configure SSL
        # ssl => true
        # ssl_certificate => "/path/to/server.crt"
        # ssl_key => "/path/to/server.key"
      }
    }
    
    filter {
      # Add any necessary transformations here
      # The data should remain in raw JSON format for Chronicle parsing
    
      # Optional: Add metadata for debugging
      mutate {
        add_field => { "[@metadata][pipeline]" => "auditbeat-to-s3" }
      }
    }
    
    output {
      s3 {
        # AWS credentials
        access_key_id => "YOUR_AWS_ACCESS_KEY_ID"
        secret_access_key => "YOUR_AWS_SECRET_ACCESS_KEY"
    
        # S3 bucket configuration
        region => "us-east-1"  # Replace with your bucket region
        bucket => "elastic-auditbeat-logs"  # Replace with your bucket name
    
        # Organize logs by date using Logstash timestamp interpolation
        prefix => "auditbeat/%{+YYYY}/%{+MM}/%{+dd}/"
    
        # File rotation settings
        size_file => 10485760  # 10MB files
        time_file => 5  # Rotate every 5 minutes
    
        # Compression for cost optimization
        encoding => "gzip"
    
        # Output format - keep as JSON for Chronicle
        codec => "json_lines"
    
        # Optional: Server-side encryption
        # server_side_encryption => true
        # server_side_encryption_algorithm => "AES256"
      }
    
      # Optional: Keep a local copy for debugging
      # stdout { 
      #   codec => rubydebug 
      # }
    }
    
    • Substitua YOUR_AWS_ACCESS_KEY_ID e YOUR_AWS_SECRET_ACCESS_KEY pelas suas credenciais da AWS.
    • Atualize os valores de region e bucket para corresponder à sua configuração do S3.
    • Inicie ou reinicie o Logstash:
    sudo systemctl restart logstash
    

(Opcional) Criar um usuário e chaves do IAM somente leitura para o Google SecOps

  1. Acesse Console da AWS > IAM > 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. JSON:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject"],
          "Resource": "arn:aws:s3:::elastic-auditbeat-logs/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::elastic-auditbeat-logs"
        }
      ]
    }
    
  7. Name = secops-reader-policy.

  8. Clique em Criar política > pesquisar/selecionar > Próxima > Adicionar permissões.

  9. Crie uma chave de acesso para secops-reader: Credenciais de segurança > Chaves de acesso.

  10. Clique em Criar chave de acesso.

  11. Faça o download do .CSV. Cole esses valores no feed.

Configurar um feed no Google SecOps para ingerir registros do Elastic Auditbeat

  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, Elastic Auditbeat Logs).
  4. Selecione Amazon S3 V2 como o Tipo de origem.
  5. Selecione Beats de auditoria do Elastic como o Tipo de registro.
  6. Clique em Próxima.
  7. Especifique valores para os seguintes parâmetros de entrada:
    • URI do S3: s3://elastic-auditbeat-logs/auditbeat/
    • Opções de exclusão de fontes: 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 metadata.event_timestamp O carimbo de data/hora do evento é analisado no campo @timestamp.
agent.id observer.asset_id Com o prefixo "agent_id: ".
agent.type observer.application O aplicativo observador é definido como o tipo de agente.
agent.version observer.platform_version A versão da plataforma do observador é definida como a versão do agente.
client.bytes principal.labels Adicionado como um rótulo com a chave "Bytes". Convertido em string.
client.ip principal.ip O IP principal é definido como o IP do cliente.
client.packets principal.labels Adicionado como um rótulo com a chave "Pacotes". Convertido em string.
client.port principal.port A porta principal é definida como a porta do cliente. Convertido em número inteiro.
cloud.availability_zone principal.cloud.availability_zone A zona de disponibilidade da nuvem principal é definida como a zona de disponibilidade da nuvem.
cloud.instance.id principal.resource.id O ID do recurso principal é definido como o ID da instância da nuvem.
cloud.machine.type principal.resource.resource_subtype O subtipo de recurso principal é definido como o tipo de máquina da nuvem.
cloud.region principal.cloud.availability_zone Se a região da nuvem estiver presente, ela vai substituir a zona de disponibilidade.
destination.bytes target.labels Adicionado como um rótulo com a chave "Bytes". Convertido em string.
destination.ip target.ip O IP de destino é definido como o IP de destino.
destination.packets target.labels Adicionado como um rótulo com a chave "Pacotes". Convertido em string.
destination.port target.port A porta de destino é definida como a porta de destino. Convertido em número inteiro.
ecs.version metadata.product_version Se presente, substitui o valor de jsonPayload.@metadata.version.
event1.category security_result.category_details Todos os valores são adicionados a "category_details".
event1.duration network.session_duration.seconds Convertido em número inteiro.
event1.id metadata.product_log_id O ID do registro do produto de metadados é definido como o ID do evento.
event1.outcome extensions.auth.auth_details Os detalhes de autenticação são definidos como o resultado do evento.
file.extension target.file.mime_type O tipo MIME do arquivo de destino é definido como a extensão do arquivo.
file.hash.sha1 target.file.sha1 O SHA-1 do arquivo de destino é definido como o hash SHA-1 do arquivo.
file.path target.file.full_path O caminho completo do arquivo de destino é definido como o caminho.
file.size target.file.size Convertido para uinteger.
group.id principal.group.product_object_id O ID do objeto do produto do grupo principal é definido como o ID do grupo.
group.name principal.group.group_display_name O nome de exibição do grupo principal é definido como o nome do grupo.
host.architecture principal.asset.hardware.cpu_platform Armazenado na variável temporária hardware.cpu_platform e mesclado em principal.asset.hardware.
host.hostname principal.hostname O nome do host principal é definido como o nome do host.
host.id principal.asset.asset_id Com o prefixo "ID do host: ".
host.ip principal.asset.ip Todos os valores são adicionados aos IPs do recurso principal.
host.mac principal.mac Os traços são substituídos por dois-pontos.
host.name principal.hostname, observer.hostname Se presente, substitui o valor de host.hostname.
host.os.kernel principal.platform_patch_level O nível principal de patch da plataforma é definido como o kernel do SO host.
host.os.version principal.platform_version A versão principal da plataforma é definida como a versão do SO do host. Armazenado na variável temporária host_os_version.
httpRequest.remoteIp target.ip Se estiver presente e nenhum outro IP de destino estiver definido, esse valor será usado.
httpRequest.requestMethod network.http.method O método HTTP de rede é definido como o método de solicitação HTTP.
httpRequest.requestSize network.sent_bytes Convertido para uinteger.
httpRequest.requestUrl network.http.referral_url O URL de encaminhamento HTTP da rede é definido como o URL da solicitação HTTP.
httpRequest.responseSize network.received_bytes Convertido para uinteger.
httpRequest.serverIp principal.ip Se estiver presente e nenhum outro IP principal estiver definido, esse valor será usado.
httpRequest.status network.http.response_code Convertido em número inteiro.
httpRequest.userAgent network.http.user_agent O user agent HTTP da rede é definido como o user agent HTTP da solicitação.
insertId network.session_id O ID da sessão de rede é definido como o ID de inserção.
jsonPayload.@metadata.beat metadata.product_event_type O tipo de evento do produto de metadados é definido como o beat de metadados.
jsonPayload.@metadata.version metadata.product_version A versão do produto de metadados é definida como a versão de metadados.
jsonPayload.destination.ip target.ip Se estiver presente e nenhum outro IP de destino estiver definido, esse valor será usado.
jsonPayload.destination.port target.port Se estiver presente e nenhuma outra porta de destino estiver definida, esse valor será usado. Convertido em número inteiro.
jsonPayload.event1.category security_result.category_details Todos os valores são adicionados a "category_details".
jsonPayload.file.path target.file.full_path Se estiver presente e nenhum outro caminho de destino estiver definido, esse valor será usado.
jsonPayload.process.executable principal.process.file.full_path, target.process.file.full_path Usado para definir o caminho completo do processo principal e de destino se nenhum outro valor estiver presente.
jsonPayload.process.name principal.application Se estiver presente e nenhum outro aplicativo principal estiver definido, esse valor será usado.
jsonPayload.process.parent.pid principal.process.pid Se estiver presente e nenhum outro PID do processo principal estiver definido, esse valor será usado. Convertido em string.
jsonPayload.process.parent.ppid principal.process.parent_process.pid Se estiver presente e nenhum outro PID do processo principal for definido, esse valor será usado. Convertido em string.
jsonPayload.process.parent.process.executable principal.process.file.full_path Se estiver presente e nenhum outro caminho completo do processo principal estiver definido, esse valor será usado.
jsonPayload.process.parent.process.exe principal.process.file.full_path Se estiver presente e nenhum outro caminho completo do processo principal estiver definido, esse valor será usado.
jsonPayload.process.parent.process.title principal.process.command_line Se estiver presente e nenhuma outra linha de comando do processo principal estiver definida, esse valor será usado.
jsonPayload.process.pid target.process.pid O PID do processo de destino é definido como o PID do processo de payload JSON.
jsonPayload.process.title target.process.command_line A linha de comando do processo de destino é definida como o título do processo de payload JSON.
jsonPayload.user.id target.user.userid Se estiver presente e nenhum outro ID de usuário de destino estiver definido, esse valor será usado. Convertido em string.
jsonPayload.user.name target.user.user_display_name Se estiver presente e nenhum outro nome de exibição do usuário de destino estiver definido, esse valor será usado.
msg metadata.description A descrição dos metadados é definida como a mensagem.
network.bytes network.sent_bytes Convertido para uinteger.
network.community_id network.community_id O ID da comunidade de rede é definido como o ID da comunidade de rede.
network.transport network.ip_protocol Convertido para maiúsculas.
package.description security_result.description A descrição do resultado de segurança é definida como a descrição do pacote.
package.name security_result.rule_name O nome da regra de resultado de segurança é definido como o nome do pacote.
package.reference security_result.about.url O URL do resultado de segurança é definido como a referência do pacote.
package.size security_result.about.file.size Convertido para uinteger.
package.type security_result.about.file.mime_type, security_result.rule_type O tipo MIME do resultado de segurança e o tipo de regra são definidos como o tipo de pacote.
process.created principal.asset.creation_time Se presente, esse valor será usado. Analisado como ISO8601.
process.entity_id principal.process.product_specific_process_id Prefixo "Processo:".
process.executable principal.process.file.full_path, target.process.file.full_path Usado para definir o caminho completo do processo principal e de destino se nenhum outro valor estiver presente.
process.hash.sha1 principal.process.file.sha1 O SHA-1 principal do processo é definido como o hash SHA-1 do processo.
process.name principal.application Se estiver presente e nenhum outro aplicativo principal estiver definido, esse valor será usado.
process.pid principal.process.pid Se estiver presente e nenhum outro PID do processo principal estiver definido, esse valor será usado. Convertido em string.
process.ppid principal.process.parent_process.pid Se estiver presente e nenhum outro PID do processo principal for definido, esse valor será usado. Convertido em string.
process.start principal.asset.creation_time Se process.created não estiver presente, mas este campo estiver, esse valor será usado. Analisado como ISO8601.
resource.labels.backend_service_name target.resource.name O nome do recurso de destino é definido como o nome do serviço de back-end do recurso.
resource.labels.forwarding_rule_name target.resource.attribute.labels Adicionado como um marcador com a chave "Nome da regra de encaminhamento".
resource.labels.project_id target.resource.product_object_id O ID do objeto do produto do recurso de destino é definido como o ID do projeto do recurso.
resource.labels.target_proxy_name target.resource.attribute.labels Adicionado como um rótulo com a chave "Nome do proxy de destino".
resource.labels.url_map_name target.resource.attribute.labels Adicionado como um rótulo com a chave "Nome do mapa de URL".
server.bytes intermediary.labels Adicionado como um rótulo com a chave "Bytes". Convertido em string.
server.ip intermediary.ip O IP intermediário é definido como o IP do servidor.
server.packets intermediary.labels Adicionado como um rótulo com a chave "Pacotes". Convertido em string.
server.port intermediary.port A porta intermediária é definida como a porta do servidor. Convertido em número inteiro.
service.type target.application O aplicativo de destino é definido como o tipo de serviço.
source.bytes src.labels Adicionado como um rótulo com a chave "Bytes". Convertido em string.
source.ip src.ip O IP de origem é definido como o IP de origem.
source.packets src.labels Adicionado como um rótulo com a chave "Pacotes". Convertido em string.
source.port src.port A porta de origem é definida como a porta de origem. Convertido em número inteiro.
system.audit.host.boottime about.asset.last_boot_time Analisado como ISO8601.
system.audit.host.hostname about.hostname O nome do host "about" é definido como o nome do host de auditoria do sistema.
system.audit.host.id principal.user.userid O ID do usuário principal é definido como o ID do host de auditoria do sistema.
system.audit.host.mac.0 about.mac O endereço MAC sobre é definido como o primeiro endereço MAC do host de auditoria do sistema.
trace target.process.file.full_path Se estiver presente e nenhum outro caminho completo do processo de destino estiver definido, esse valor será usado.
user.effective.id target.user.userid Se estiver presente e nenhum outro ID de usuário de destino estiver definido, esse valor será usado.
user.effective.name target.user.user_display_name Se estiver presente e nenhum outro nome de exibição do usuário de destino estiver definido, esse valor será usado.
user.id target.user.userid Se estiver presente e nenhum outro ID de usuário de destino estiver definido, esse valor será usado. Convertido em string.
user.name target.user.user_display_name Se estiver presente e nenhum outro nome de exibição do usuário de destino estiver definido, esse valor será usado.
N/A metadata.event_type Defina como "GENERIC_EVENT" inicialmente. Mudou com base na lógica descrita nos comentários do código do analisador.
N/A metadata.log_type Defina como "ELASTIC_AUDITBEAT".
N/A metadata.product_name Defina como "Auditbeat".
N/A metadata.vendor_name Defina como "Elástico".
N/A extensions.auth.type Definido como "AUTHTYPE_UNSPECIFIED" para eventos USER_LOGIN e USER_LOGOUT.
auditd.data.syscall metadata.product_event_type O tipo de evento de produto de metadados é definido como a chamada de sistema auditd.

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