Recolha registos do Elastic Auditbeat
Este documento explica como ingerir registos do Elastic Auditbeat no Google Security Operations através do Amazon S3. O analisador extrai campos dos registos JSON, normaliza-os no modelo de dados unificado (UDM) e enriquece os dados com contexto adicional, como informações do anfitrião, detalhes da rede e classificações de resultados de segurança. Processa vários tipos de eventos ao mapear event1.action
e outros campos para tipos de eventos de metadados da UDM específicos, usando por predefinição GENERIC_EVENT
ou categorias mais específicas quando possível.
Antes de começar
Certifique-se de que cumpre os seguintes pré-requisitos:
- 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]).
Obtenha os pré-requisitos do Elastic Auditbeat
- Certifique-se de que o Elastic Auditbeat está instalado e configurado nos seus servidores.
- Instale o Logstash num servidor dedicado ou juntamente com o Auditbeat.
- Tome nota da localização do ficheiro de configuração do Auditbeat (normalmente,
/etc/auditbeat/auditbeat.yml
).
Configure o contentor do AWS S3 e o IAM para o Google SecOps
- Crie um contentor do Amazon S3 seguindo este guia do utilizador: Criar um contentor
- Guarde o nome e a região do contentor para referência futura (por exemplo,
elastic-auditbeat-logs
). - Crie um utilizador seguindo este guia do utilizador: criar um utilizador do IAM.
- Selecione o utilizador criado.
- Selecione o separador Credenciais de segurança.
- Clique em Criar chave de acesso na secção Chaves de acesso.
- Selecione Serviço de terceiros como Exemplo de utilização.
- Clicar em Seguinte.
- Opcional: adicione a etiqueta de descrição.
- Clique em Criar chave de acesso.
- Clique em Transferir ficheiro .CSV para guardar a chave de acesso e a chave de acesso secreta para referência futura.
- Clique em Concluído.
- Selecione o separador Autorizações.
- Clique em Adicionar autorizações na secção Políticas de autorizações.
- Selecione Adicionar autorizações.
- Selecione Anexar políticas diretamente.
- Pesquise a política AmazonS3FullAccess.
- Selecione a política.
- Clicar em Seguinte.
- Clique em Adicionar autorizações.
Configure o Auditbeat para enviar para o Logstash
- Edite o ficheiro de configuração do Auditbeat
/etc/auditbeat/auditbeat.yml
. - Comente qualquer configuração de saída existente (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 alterações:
sudo systemctl restart auditbeat
Configure o pipeline do Logstash
Crie um novo ficheiro de configuração do 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 reais da AWS. - Atualize os valores
region
ebucket
para corresponderem à sua configuração do S3. - Inicie ou reinicie o Logstash:
sudo systemctl restart logstash
- Substitua
(Opcional) Crie um utilizador e chaves da IAM só de leitura para o Google SecOps
- Aceda a AWS Console > IAM > Users.
- Clique em Adicionar utilizadores.
- Indique os seguintes detalhes de configuração:
- Utilizador: introduza
secops-reader
. - Tipo de acesso: selecione Chave de acesso – Acesso programático.
- Utilizador: introduza
- Clique em Criar utilizador.
- Anexe a política de leitura mínima (personalizada): Users > secops-reader > Permissions > Add permissions > Attach policies directly > Create policy.
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" } ] }
Nome =
secops-reader-policy
.Clique em Criar política > procure/selecione > Seguinte > Adicionar autorizações.
Crie uma chave de acesso para
secops-reader
: Credenciais de segurança > Chaves de acesso.Clique em Criar chave de acesso.
Transfira o
.CSV
. (Vai colar estes valores no feed).
Configure um feed no Google SecOps para carregar registos do Elastic Auditbeat
- Aceda a Definições do SIEM > Feeds.
- Clique em + Adicionar novo feed.
- No campo Nome do feed, introduza um nome para o feed (por exemplo,
Elastic Auditbeat Logs
). - Selecione Amazon S3 V2 como o Tipo de origem.
- Selecione Elastic Audit Beats como o Tipo de registo.
- Clicar em Seguinte.
- Especifique valores para os seguintes parâmetros de entrada:
- URI do S3:
s3://elastic-auditbeat-logs/auditbeat/
- Opções de eliminação de origens: selecione a opção de eliminação de acordo com a sua preferência.
- Idade máxima do ficheiro: inclua ficheiros modificados no último número de dias. A predefinição é 180 dias.
- ID da chave de acesso: chave de acesso do utilizador com acesso ao contentor do S3.
- Chave de acesso secreta: chave secreta do utilizador com acesso ao contentor do S3.
- Espaço de nomes do recurso: o espaço de nomes do recurso.
- Etiquetas de carregamento: a etiqueta aplicada aos eventos deste feed.
- URI do S3:
- Clicar em Seguinte.
- Reveja a nova configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
Tabela de mapeamento do UDM
Campo de registo | Mapeamento do UDM | Lógica |
---|---|---|
@timestamp |
metadata.event_timestamp |
A data/hora do evento é analisada a partir do campo @timestamp . |
agent.id |
observer.asset_id |
Com o prefixo "agent_id: ". |
agent.type |
observer.application |
A aplicação observadora está definida para o tipo de agente. |
agent.version |
observer.platform_version |
A versão da plataforma do observador está definida para a versão do agente. |
client.bytes |
principal.labels |
Adicionado como uma etiqueta com a chave "Bytes". Convertido em string. |
client.ip |
principal.ip |
O IP principal está definido como o IP do cliente. |
client.packets |
principal.labels |
Adicionado como uma etiqueta com a chave "Packets". Convertido em string. |
client.port |
principal.port |
A porta principal está definida para a porta do cliente. Convertido em número inteiro. |
cloud.availability_zone |
principal.cloud.availability_zone |
A zona de disponibilidade da nuvem principal está definida para 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 está definido como o tipo de máquina da nuvem. |
cloud.region |
principal.cloud.availability_zone |
Se a região da nuvem estiver presente, substitui a zona de disponibilidade. |
destination.bytes |
target.labels |
Adicionado como uma etiqueta 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 uma etiqueta com a chave "Packets". Convertido em string. |
destination.port |
target.port |
A porta de destino está definida como a porta de destino. Convertido em número inteiro. |
ecs.version |
metadata.product_version |
Se estiver 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 registo do produto de metadados está definido como o ID do evento. |
event1.outcome |
extensions.auth.auth_details |
Os detalhes de autorização estão definidos para o resultado do evento. |
file.extension |
target.file.mime_type |
O tipo MIME do ficheiro de destino está definido para a extensão do ficheiro. |
file.hash.sha1 |
target.file.sha1 |
O SHA-1 do ficheiro de destino é definido como o hash SHA-1 do ficheiro. |
file.path |
target.file.full_path |
O caminho completo do ficheiro de destino está definido para o caminho. |
file.size |
target.file.size |
Convertido em uinteger. |
group.id |
principal.group.product_object_id |
O ID do objeto do produto do grupo principal está definido como o ID do grupo. |
group.name |
principal.group.group_display_name |
O nome a apresentar 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, em seguida, unido em principal.asset.hardware . |
host.hostname |
principal.hostname |
O nome do anfitrião principal está definido como o nome do anfitrião do anfitrião. |
host.id |
principal.asset.asset_id |
Com o prefixo "Host Id: ". |
host.ip |
principal.asset.ip |
Todos os valores são adicionados aos IPs do recurso principal. |
host.mac |
principal.mac |
Os travessões são substituídos por dois pontos. |
host.name |
principal.hostname , observer.hostname |
Se estiver presente, substitui o valor de host.hostname . |
host.os.kernel |
principal.platform_patch_level |
O nível de patch da plataforma principal está definido para o kernel do SO do anfitrião. |
host.os.version |
principal.platform_version |
A versão principal da plataforma está definida como a versão do SO do anfitrião. Armazenado na variável temporária host_os_version . |
httpRequest.remoteIp |
target.ip |
Se estiver presente e não estiver definido nenhum outro IP de destino, é usado este valor. |
httpRequest.requestMethod |
network.http.method |
O método HTTP de rede está definido para o método de pedido HTTP. |
httpRequest.requestSize |
network.sent_bytes |
Convertido em uinteger. |
httpRequest.requestUrl |
network.http.referral_url |
O URL de referência HTTP da rede está definido para o URL do pedido HTTP. |
httpRequest.responseSize |
network.received_bytes |
Convertido em uinteger. |
httpRequest.serverIp |
principal.ip |
Se estiver presente e não estiver definido nenhum outro IP principal, este valor é usado. |
httpRequest.status |
network.http.response_code |
Convertido em número inteiro. |
httpRequest.userAgent |
network.http.user_agent |
O agente do utilizador HTTP de rede está definido para o agente do utilizador do pedido HTTP. |
insertId |
network.session_id |
O ID da sessão de rede é definido com o ID de inserção. |
jsonPayload.@metadata.beat |
metadata.product_event_type |
O tipo de evento do produto de metadados está definido como o beat de metadados. |
jsonPayload.@metadata.version |
metadata.product_version |
A versão do produto de metadados está definida para a versão dos metadados. |
jsonPayload.destination.ip |
target.ip |
Se estiver presente e não estiver definido nenhum outro IP de destino, é usado este valor. |
jsonPayload.destination.port |
target.port |
Se estiver presente e não estiver definida nenhuma outra porta de destino, é usado este valor. 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 não estiver definido nenhum outro caminho de destino, este valor é 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 não estiver presente nenhum outro valor. |
jsonPayload.process.name |
principal.application |
Se estiver presente e não estiver definida nenhuma outra aplicação principal, este valor é usado. |
jsonPayload.process.parent.pid |
principal.process.pid |
Se estiver presente e não estiver definido nenhum outro PID do processo principal, este valor é usado. Convertido em string. |
jsonPayload.process.parent.ppid |
principal.process.parent_process.pid |
Se estiver presente e não estiver definido nenhum outro PID do processo principal, este valor é usado. Convertido em string. |
jsonPayload.process.parent.process.executable |
principal.process.file.full_path |
Se estiver presente e não estiver definido nenhum outro caminho completo do processo principal, este valor é usado. |
jsonPayload.process.parent.process.exe |
principal.process.file.full_path |
Se estiver presente e não estiver definido nenhum outro caminho completo do processo principal, este valor é usado. |
jsonPayload.process.parent.process.title |
principal.process.command_line |
Se estiver presente e não estiver definida nenhuma outra linha de comandos do processo principal, este valor é usado. |
jsonPayload.process.pid |
target.process.pid |
O PID do processo de destino está definido como o PID do processo de carga útil JSON. |
jsonPayload.process.title |
target.process.command_line |
A linha de comandos do processo de destino está definida para o título do processo do payload JSON. |
jsonPayload.user.id |
target.user.userid |
Se estiver presente e não estiver definido nenhum outro ID do utilizador de destino, este valor é usado. Convertido em string. |
jsonPayload.user.name |
target.user.user_display_name |
Se estiver presente e não estiver definido nenhum outro nome a apresentar do utilizador de destino, este valor é usado. |
msg |
metadata.description |
A descrição dos metadados é definida para a mensagem. |
network.bytes |
network.sent_bytes |
Convertido em uinteger. |
network.community_id |
network.community_id |
O ID da comunidade da rede é definido como o ID da comunidade da rede. |
network.transport |
network.ip_protocol |
Convertido em maiúsculas. |
package.description |
security_result.description |
A descrição do resultado de segurança está definida como a descrição do pacote. |
package.name |
security_result.rule_name |
O nome da regra do resultado de segurança está definido como o nome do pacote. |
package.reference |
security_result.about.url |
O URL do resultado de segurança está definido como a referência do pacote. |
package.size |
security_result.about.file.size |
Convertido em 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 estão definidos como o tipo de pacote. |
process.created |
principal.asset.creation_time |
Se estiver presente, este valor é usado. Analisado como ISO8601. |
process.entity_id |
principal.process.product_specific_process_id |
Com o 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 não estiver presente nenhum outro valor. |
process.hash.sha1 |
principal.process.file.sha1 |
O SHA-1 principal está definido para o hash SHA-1 do processo. |
process.name |
principal.application |
Se estiver presente e não estiver definida nenhuma outra aplicação principal, este valor é usado. |
process.pid |
principal.process.pid |
Se estiver presente e não estiver definido nenhum outro PID do processo principal, este valor é usado. Convertido em string. |
process.ppid |
principal.process.parent_process.pid |
Se estiver presente e não estiver definido nenhum outro PID do processo principal, este valor é usado. Convertido em string. |
process.start |
principal.asset.creation_time |
Se process.created não estiver presente e este campo estiver presente, é usado este valor. 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 uma etiqueta 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 uma etiqueta com a chave "Nome do proxy de destino". |
resource.labels.url_map_name |
target.resource.attribute.labels |
Adicionado como uma etiqueta com a chave "URL map name". |
server.bytes |
intermediary.labels |
Adicionado como uma etiqueta com a chave "Bytes". Convertido em string. |
server.ip |
intermediary.ip |
O IP intermediário está definido para o IP do servidor. |
server.packets |
intermediary.labels |
Adicionado como uma etiqueta com a chave "Packets". Convertido em string. |
server.port |
intermediary.port |
A porta intermediária está definida como a porta do servidor. Convertido em número inteiro. |
service.type |
target.application |
A aplicação de destino está definida para o tipo de serviço. |
source.bytes |
src.labels |
Adicionado como uma etiqueta 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 uma etiqueta com a chave "Packets". Convertido em string. |
source.port |
src.port |
A porta de origem está definida para 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 anfitrião about está definido para o nome do anfitrião de auditoria do sistema. |
system.audit.host.id |
principal.user.userid |
O ID do utilizador principal está definido como o ID do anfitrião de auditoria do sistema. |
system.audit.host.mac.0 |
about.mac |
O endereço MAC acerca de está definido como o primeiro endereço MAC do anfitrião de auditoria do sistema. |
trace |
target.process.file.full_path |
Se estiver presente e não estiver definido nenhum outro caminho completo do processo de destino, este valor é usado. |
user.effective.id |
target.user.userid |
Se estiver presente e não estiver definido nenhum outro ID do utilizador de destino, este valor é usado. |
user.effective.name |
target.user.user_display_name |
Se estiver presente e não estiver definido nenhum outro nome a apresentar do utilizador de destino, este valor é usado. |
user.id |
target.user.userid |
Se estiver presente e não estiver definido nenhum outro ID do utilizador de destino, este valor é usado. Convertido em string. |
user.name |
target.user.user_display_name |
Se estiver presente e não estiver definido nenhum outro nome a apresentar do utilizador de destino, este valor é usado. |
N/A | metadata.event_type |
Inicialmente, é definido como "GENERIC_EVENT". Alterado com base na lógica descrita nos comentários do código do analisador. |
N/A | metadata.log_type |
Definido como "ELASTIC_AUDITBEAT". |
N/A | metadata.product_name |
Definido 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 do produto de metadados está definido como a chamada do sistema auditd. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.