Coletar registros do Elastic Auditbeat
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
- Confira se o Elastic Auditbeat está instalado e configurado nos seus servidores.
- Instale o Logstash em um servidor dedicado ou junto com o Auditbeat.
- 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
- Crie um bucket do Amazon S3 seguindo este guia do usuário: Como criar um bucket
- Salve o Nome e a Região do bucket para referência futura (por exemplo,
elastic-auditbeat-logs
). - Crie um usuário seguindo este guia: Como criar um usuário do IAM.
- Selecione o usuário criado.
- Selecione a guia Credenciais de segurança.
- Clique em Criar chave de acesso na seção Chaves de acesso.
- Selecione Serviço de terceiros como Caso de uso.
- Clique em Próxima.
- Opcional: adicione uma tag de descrição.
- Clique em Criar chave de acesso.
- Clique em Fazer o download do arquivo .CSV para salvar a chave de acesso e a chave de acesso secreta para referência futura.
- Clique em Concluído.
- Selecione a guia Permissões.
- Clique em Adicionar permissões na seção Políticas de permissões.
- Selecione Adicionar permissões.
- Selecione Anexar políticas diretamente.
- Pesquise a política AmazonS3FullAccess.
- Selecione a política.
- Clique em Próxima.
- Clique em Adicionar permissões
Configurar o Auditbeat para enviar ao Logstash
- Edite o arquivo de configuração do Auditbeat
/etc/auditbeat/auditbeat.yml
. - Comente qualquer configuração de saída atual (Elasticsearch etc.).
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"]
Reinicie o Auditbeat para aplicar as mudanças:
sudo systemctl restart auditbeat
Configurar o pipeline do Logstash
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
eYOUR_AWS_SECRET_ACCESS_KEY
pelas suas credenciais da AWS. - Atualize os valores de
region
ebucket
para corresponder à sua configuração do S3. - Inicie ou reinicie o Logstash:
sudo systemctl restart logstash
- Substitua
(Opcional) Criar um usuário e chaves do IAM somente leitura para o Google SecOps
- Acesse Console da AWS > IAM > Usuários.
- Clique em Add users.
- Informe os seguintes detalhes de configuração:
- Usuário: insira
secops-reader
. - Tipo de acesso: selecione Chave de acesso – Acesso programático.
- Usuário: insira
- Clique em Criar usuário.
- 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.
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" } ] }
Name =
secops-reader-policy
.Clique em Criar política > pesquisar/selecionar > Próxima > Adicionar permissões.
Crie uma chave de acesso para
secops-reader
: Credenciais de segurança > Chaves de acesso.Clique em Criar chave de acesso.
Faça o download do
.CSV
. Cole esses valores no feed.
Configurar um feed no Google SecOps para ingerir registros do Elastic Auditbeat
- Acesse Configurações do SIEM > Feeds.
- Clique em + Adicionar novo feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Elastic Auditbeat Logs
). - Selecione Amazon S3 V2 como o Tipo de origem.
- Selecione Beats de auditoria do Elastic como o Tipo de registro.
- Clique em Próxima.
- 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.
- URI do S3:
- Clique em Próxima.
- 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.