Recopilar registros de Elastic Auditbeat
En este documento se explica cómo ingerir registros de Elastic Auditbeat en Google Security Operations mediante Amazon S3. El analizador extrae campos de los registros JSON, los normaliza en el modelo de datos unificado (UDM) y enriquece los datos con contexto adicional, como información del host, detalles de la red y clasificaciones de resultados de seguridad. Gestiona varios tipos de eventos asignando event1.action
y otros campos a tipos de eventos de metadatos de UDM específicos. De forma predeterminada, se asignan a GENERIC_EVENT
o a categorías más específicas cuando es posible.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Una instancia de Google SecOps.
- Acceso privilegiado al servidor Elastic Auditbeat.
- Acceso privilegiado al servidor Logstash.
- Acceso privilegiado a AWS (S3, gestión de identidades y accesos [IAM]).
Requisitos previos de Elastic Auditbeat
- Asegúrate de que Elastic Auditbeat esté instalado y configurado en tus servidores.
- Instala Logstash en un servidor dedicado o junto con Auditbeat.
- Anota la ubicación del archivo de configuración de Auditbeat (normalmente,
/etc/auditbeat/auditbeat.yml
).
Configurar un segmento de AWS S3 y IAM para Google SecOps
- Crea un segmento de Amazon S3 siguiendo esta guía de usuario: Crear un segmento.
- Guarda el nombre y la región del segmento para consultarlos más adelante (por ejemplo,
elastic-auditbeat-logs
). - Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
- Selecciona el Usuario creado.
- Selecciona la pestaña Credenciales de seguridad.
- En la sección Claves de acceso, haz clic en Crear clave de acceso.
- Selecciona Servicio de terceros en Caso práctico.
- Haz clic en Siguiente.
- Opcional: añade una etiqueta de descripción.
- Haz clic en Crear clave de acceso.
- Haz clic en Descargar archivo .CSV para guardar la clave de acceso y la clave de acceso secreta para futuras consultas.
- Haz clic en Listo.
- Selecciona la pestaña Permisos.
- En la sección Políticas de permisos, haz clic en Añadir permisos.
- Selecciona Añadir permisos.
- Seleccione Adjuntar políticas directamente.
- Busca la política AmazonS3FullAccess.
- Selecciona la política.
- Haz clic en Siguiente.
- Haz clic en Añadir permisos.
Configurar Auditbeat para enviar datos a Logstash
- Edita el archivo de configuración de Auditbeat
/etc/auditbeat/auditbeat.yml
. - Comenta cualquier configuración de salida que ya tengas (Elasticsearch, etc.).
Añade la configuración de salida de 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"]
Reinicia Auditbeat para aplicar los cambios:
sudo systemctl restart auditbeat
Configurar la canalización de Logstash
Crea un archivo de configuración de canalización de 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 # } }
- Sustituye
YOUR_AWS_ACCESS_KEY_ID
yYOUR_AWS_SECRET_ACCESS_KEY
por tus credenciales de AWS. - Actualice los valores de
region
ybucket
para que coincidan con su configuración de S3. - Inicia o reinicia Logstash:
sudo systemctl restart logstash
- Sustituye
(Opcional) Crear un usuario y claves de IAM de solo lectura para Google SecOps
- Ve a Consola de AWS > IAM > Usuarios.
- Haz clic en Add users (Añadir usuarios).
- Proporcione los siguientes detalles de configuración:
- Usuario: introduce
secops-reader
. - Tipo de acceso: selecciona Clave de acceso – Acceso programático.
- Usuario: introduce
- Haz clic en Crear usuario.
- Asigna una política de lectura mínima (personalizada): Usuarios > secops-reader > Permisos > Añadir permisos > Asignar políticas directamente > Crear 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" } ] }
Nombre =
secops-reader-policy
.Haz clic en Crear política > busca o selecciona > Siguiente > Añadir permisos.
Crea una clave de acceso para
secops-reader
: Credenciales de seguridad > Claves de acceso.Haz clic en Crear clave de acceso.
Descarga la
.CSV
. (Estos valores se pegarán en el feed).
Configurar un feed en Google SecOps para ingerir registros de Elastic Auditbeat
- Ve a Configuración de SIEM > Feeds.
- Haz clic en + Añadir nuevo feed.
- En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo,
Elastic Auditbeat Logs
). - Selecciona Amazon S3 V2 como Tipo de fuente.
- Seleccione Elastic Audit Beats como Tipo de registro.
- Haz clic en Siguiente.
- Especifique los valores de los siguientes parámetros de entrada:
- URI de S3:
s3://elastic-auditbeat-logs/auditbeat/
- Opciones de eliminación de la fuente: selecciona la opción de eliminación que prefieras.
- Antigüedad máxima del archivo: incluye los archivos modificados en los últimos días. El valor predeterminado es 180 días.
- ID de clave de acceso: clave de acceso de usuario con acceso al bucket de S3.
- Clave de acceso secreta: clave secreta del usuario con acceso al bucket de S3.
- Espacio de nombres de recursos: el espacio de nombres de recursos.
- Etiquetas de ingestión: la etiqueta aplicada a los eventos de este feed.
- URI de S3:
- Haz clic en Siguiente.
- Revise la configuración de la nueva fuente en la pantalla Finalizar y, a continuación, haga clic en Enviar.
Tabla de asignación de UDM
Campo de registro | Asignación de UDM | Lógica |
---|---|---|
@timestamp |
metadata.event_timestamp |
La marca de tiempo del evento se analiza a partir del campo @timestamp . |
agent.id |
observer.asset_id |
Prefijado con "agent_id: ". |
agent.type |
observer.application |
La aplicación observadora se define como el tipo de agente. |
agent.version |
observer.platform_version |
La versión de la plataforma del observador se establece en la versión del agente. |
client.bytes |
principal.labels |
Se ha añadido como etiqueta con la clave "Bytes". Se ha convertido en una cadena. |
client.ip |
principal.ip |
La IP principal se define como la IP del cliente. |
client.packets |
principal.labels |
Se ha añadido como etiqueta con la clave "Paquetes". Se ha convertido en una cadena. |
client.port |
principal.port |
El puerto principal se define como el puerto del cliente. Se ha convertido en un número entero. |
cloud.availability_zone |
principal.cloud.availability_zone |
La zona de disponibilidad de la nube principal se define como la zona de disponibilidad de la nube. |
cloud.instance.id |
principal.resource.id |
El ID de recurso principal se define como el ID de instancia de la nube. |
cloud.machine.type |
principal.resource.resource_subtype |
El subtipo de recurso principal se define como el tipo de máquina en la nube. |
cloud.region |
principal.cloud.availability_zone |
Si se indica una región en la nube, se anula la zona de disponibilidad. |
destination.bytes |
target.labels |
Se ha añadido como etiqueta con la clave "Bytes". Se ha convertido en una cadena. |
destination.ip |
target.ip |
La IP de destino se asigna a la IP de destino. |
destination.packets |
target.labels |
Se ha añadido como etiqueta con la clave "Paquetes". Se ha convertido en una cadena. |
destination.port |
target.port |
El puerto de destino se define como el puerto de destino. Se ha convertido en un número entero. |
ecs.version |
metadata.product_version |
Si está presente, anula el valor de jsonPayload.@metadata.version . |
event1.category |
security_result.category_details |
Todos los valores se añaden a category_details. |
event1.duration |
network.session_duration.seconds |
Se ha convertido en un número entero. |
event1.id |
metadata.product_log_id |
El ID de registro del producto de metadatos se define como el ID de evento. |
event1.outcome |
extensions.auth.auth_details |
Los detalles de autenticación se asignan al resultado del evento. |
file.extension |
target.file.mime_type |
El tipo MIME del archivo de destino se define en la extensión del archivo. |
file.hash.sha1 |
target.file.sha1 |
El SHA-1 del archivo de destino se establece en el hash SHA-1 del archivo. |
file.path |
target.file.full_path |
La ruta completa del archivo de destino se define como la ruta. |
file.size |
target.file.size |
Convertida a uinteger. |
group.id |
principal.group.product_object_id |
El ID del objeto de producto del grupo principal se define como el ID del grupo. |
group.name |
principal.group.group_display_name |
El nombre visible del grupo principal se asigna al nombre del grupo. |
host.architecture |
principal.asset.hardware.cpu_platform |
Se almacena en la variable temporal hardware.cpu_platform y, a continuación, se combina con principal.asset.hardware . |
host.hostname |
principal.hostname |
El nombre de host principal se define como el nombre de host del host. |
host.id |
principal.asset.asset_id |
Tiene el prefijo "ID de host: ". |
host.ip |
principal.asset.ip |
Todos los valores se añaden a las IPs del recurso principal. |
host.mac |
principal.mac |
Los guiones se sustituyen por dos puntos. |
host.name |
principal.hostname , observer.hostname |
Si está presente, anula el valor de host.hostname . |
host.os.kernel |
principal.platform_patch_level |
El nivel de parche de la plataforma principal se establece en el kernel del sistema operativo host. |
host.os.version |
principal.platform_version |
La versión principal de la plataforma se establece en la versión del SO del host. Se almacena en la variable temporal host_os_version . |
httpRequest.remoteIp |
target.ip |
Si está presente y no se ha definido ninguna otra IP de destino, se usará este valor. |
httpRequest.requestMethod |
network.http.method |
El método HTTP de la red se define como el método de solicitud HTTP. |
httpRequest.requestSize |
network.sent_bytes |
Convertida a uinteger. |
httpRequest.requestUrl |
network.http.referral_url |
La URL referente HTTP de la red se define como la URL de la solicitud HTTP. |
httpRequest.responseSize |
network.received_bytes |
Convertida a uinteger. |
httpRequest.serverIp |
principal.ip |
Si está presente y no se ha definido ninguna otra IP principal, se usa este valor. |
httpRequest.status |
network.http.response_code |
Se ha convertido en un número entero. |
httpRequest.userAgent |
network.http.user_agent |
El user-agent HTTP de la red se define como el user-agent de la solicitud HTTP. |
insertId |
network.session_id |
El ID de sesión de la red se define como el ID de inserción. |
jsonPayload.@metadata.beat |
metadata.product_event_type |
El tipo de evento de producto de metadatos se define como el latido de los metadatos. |
jsonPayload.@metadata.version |
metadata.product_version |
La versión del producto de metadatos se establece en la versión de los metadatos. |
jsonPayload.destination.ip |
target.ip |
Si está presente y no se ha definido ninguna otra IP de destino, se usará este valor. |
jsonPayload.destination.port |
target.port |
Si está presente y no se ha definido ningún otro puerto de destino, se usa este valor. Se ha convertido en un número entero. |
jsonPayload.event1.category |
security_result.category_details |
Todos los valores se añaden a category_details. |
jsonPayload.file.path |
target.file.full_path |
Si está presente y no se ha definido ninguna otra ruta de destino, se usa este valor. |
jsonPayload.process.executable |
principal.process.file.full_path , target.process.file.full_path |
Se usa para definir la ruta completa del proceso principal y del proceso de destino si no hay ningún otro valor. |
jsonPayload.process.name |
principal.application |
Si está presente y no se ha definido ninguna otra aplicación principal, se usa este valor. |
jsonPayload.process.parent.pid |
principal.process.pid |
Si está presente y no se ha definido ningún otro PID de proceso principal, se usa este valor. Se ha convertido en una cadena. |
jsonPayload.process.parent.ppid |
principal.process.parent_process.pid |
Si está presente y no se ha definido ningún otro PID de proceso principal, se usa este valor. Se ha convertido en una cadena. |
jsonPayload.process.parent.process.executable |
principal.process.file.full_path |
Si está presente y no se ha definido ninguna otra ruta completa del proceso principal, se usa este valor. |
jsonPayload.process.parent.process.exe |
principal.process.file.full_path |
Si está presente y no se ha definido ninguna otra ruta completa del proceso principal, se usa este valor. |
jsonPayload.process.parent.process.title |
principal.process.command_line |
Si está presente y no se ha definido ninguna otra línea de comandos del proceso principal, se usa este valor. |
jsonPayload.process.pid |
target.process.pid |
El PID del proceso de destino se establece como el PID del proceso de la carga útil JSON. |
jsonPayload.process.title |
target.process.command_line |
La línea de comandos del proceso de destino se define como el título del proceso de la carga útil de JSON. |
jsonPayload.user.id |
target.user.userid |
Si está presente y no se ha definido ningún otro ID de usuario de destino, se usa este valor. Se ha convertido en una cadena. |
jsonPayload.user.name |
target.user.user_display_name |
Si está presente y no se ha definido ningún otro nombre visible de usuario de destino, se usará este valor. |
msg |
metadata.description |
La descripción de los metadatos se asigna al mensaje. |
network.bytes |
network.sent_bytes |
Convertida a uinteger. |
network.community_id |
network.community_id |
El ID de comunidad de la red se define como el ID de comunidad de la red. |
network.transport |
network.ip_protocol |
Se ha convertido a mayúsculas. |
package.description |
security_result.description |
La descripción del resultado de seguridad se corresponde con la descripción del paquete. |
package.name |
security_result.rule_name |
El nombre de la regla de resultados de seguridad es el nombre del paquete. |
package.reference |
security_result.about.url |
La URL del resultado de seguridad se establece en la referencia del paquete. |
package.size |
security_result.about.file.size |
Convertida a uinteger. |
package.type |
security_result.about.file.mime_type , security_result.rule_type |
El tipo de MIME del resultado de seguridad y el tipo de regla se definen como el tipo de paquete. |
process.created |
principal.asset.creation_time |
Si está presente, se usa este valor. Se analiza como ISO8601. |
process.entity_id |
principal.process.product_specific_process_id |
Empieza por "Process:". |
process.executable |
principal.process.file.full_path , target.process.file.full_path |
Se usa para definir la ruta completa del proceso principal y del proceso de destino si no hay ningún otro valor. |
process.hash.sha1 |
principal.process.file.sha1 |
El SHA-1 principal se define como el hash SHA-1 del proceso. |
process.name |
principal.application |
Si está presente y no se ha definido ninguna otra aplicación principal, se usa este valor. |
process.pid |
principal.process.pid |
Si está presente y no se ha definido ningún otro PID de proceso principal, se usa este valor. Se ha convertido en una cadena. |
process.ppid |
principal.process.parent_process.pid |
Si está presente y no se ha definido ningún otro PID de proceso principal, se usa este valor. Se ha convertido en una cadena. |
process.start |
principal.asset.creation_time |
Si process.created no está presente y este campo sí, se usa este valor. Se analiza como ISO8601. |
resource.labels.backend_service_name |
target.resource.name |
El nombre del recurso de destino se asigna al nombre del servicio backend del recurso. |
resource.labels.forwarding_rule_name |
target.resource.attribute.labels |
Se ha añadido como etiqueta con la clave "Forwarding rule name". |
resource.labels.project_id |
target.resource.product_object_id |
El ID de objeto de producto del recurso de destino se establece como el ID de proyecto del recurso. |
resource.labels.target_proxy_name |
target.resource.attribute.labels |
Se ha añadido como etiqueta con la clave "Target proxy name". |
resource.labels.url_map_name |
target.resource.attribute.labels |
Se ha añadido como etiqueta con la clave "URL map name". |
server.bytes |
intermediary.labels |
Se ha añadido como etiqueta con la clave "Bytes". Se ha convertido en una cadena. |
server.ip |
intermediary.ip |
La IP intermediaria se establece como la IP del servidor. |
server.packets |
intermediary.labels |
Se ha añadido como etiqueta con la clave "Paquetes". Se ha convertido en una cadena. |
server.port |
intermediary.port |
El puerto intermediario se define como el puerto del servidor. Se ha convertido en un número entero. |
service.type |
target.application |
La aplicación de destino se define como el tipo de servicio. |
source.bytes |
src.labels |
Se ha añadido como etiqueta con la clave "Bytes". Se ha convertido en una cadena. |
source.ip |
src.ip |
La IP de origen se define como la IP de origen. |
source.packets |
src.labels |
Se ha añadido como etiqueta con la clave "Paquetes". Se ha convertido en una cadena. |
source.port |
src.port |
El puerto de origen se define como el puerto de origen. Se ha convertido en un número entero. |
system.audit.host.boottime |
about.asset.last_boot_time |
Se analiza como ISO8601. |
system.audit.host.hostname |
about.hostname |
El nombre de host de about se define como el nombre de host de auditoría del sistema. |
system.audit.host.id |
principal.user.userid |
El ID de usuario principal se asigna al ID de host de auditoría del sistema. |
system.audit.host.mac.0 |
about.mac |
La dirección MAC de información se define como la primera dirección MAC del host de auditoría del sistema. |
trace |
target.process.file.full_path |
Si está presente y no se ha definido ninguna otra ruta completa del proceso de destino, se usa este valor. |
user.effective.id |
target.user.userid |
Si está presente y no se ha definido ningún otro ID de usuario de destino, se usa este valor. |
user.effective.name |
target.user.user_display_name |
Si está presente y no se ha definido ningún otro nombre visible de usuario de destino, se usará este valor. |
user.id |
target.user.userid |
Si está presente y no se ha definido ningún otro ID de usuario de destino, se usa este valor. Se ha convertido en una cadena. |
user.name |
target.user.user_display_name |
Si está presente y no se ha definido ningún otro nombre visible de usuario de destino, se usará este valor. |
N/A | metadata.event_type |
Se define como "GENERIC_EVENT" inicialmente. Se ha cambiado en función de la lógica descrita en los comentarios del código del analizador. |
N/A | metadata.log_type |
Se ha definido como "ELASTIC_AUDITBEAT". |
N/A | metadata.product_name |
Selecciona "Auditbeat". |
N/A | metadata.vendor_name |
Selecciona "Elástico". |
N/A | extensions.auth.type |
Se asigna el valor "AUTHTYPE_UNSPECIFIED" a los eventos USER_LOGIN y USER_LOGOUT. |
auditd.data.syscall |
metadata.product_event_type |
El tipo de evento de producto de metadatos se define como la llamada al sistema auditd. |
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.