Recoger registros de CrowdStrike FileVantage
En este documento se explica cómo ingerir registros de CrowdStrike FileVantage en Google Security Operations mediante Amazon S3.
Antes de empezar
Asegúrate de que cumples los siguientes requisitos previos:
- Una instancia de Google SecOps.
- Acceso con privilegios a la consola de CrowdStrike Falcon.
- Acceso privilegiado a AWS (S3, Gestión de Identidades y Accesos [IAM], Lambda y EventBridge).
Recoger los requisitos previos de CrowdStrike FileVantage (credenciales de API)
- Inicia sesión en la consola de CrowdStrike Falcon.
- Vaya a Asistencia y recursos > Clientes y claves de API.
- Haz clic en Añadir nuevo cliente de API.
- Proporcione los siguientes detalles de configuración:
- Nombre del cliente: introduce un nombre descriptivo (por ejemplo,
Google SecOps FileVantage Integration
). - Description (Descripción): escriba una breve descripción del objetivo de la integración.
- Permisos de la API: selecciona Falcon FileVantage:read.
- Nombre del cliente: introduce un nombre descriptivo (por ejemplo,
- Haz clic en Añadir para completar el proceso.
- Copia y guarda en un lugar seguro los siguientes detalles:
- ID de cliente
- Secreto de cliente
- URL base (determina tu región de la nube)
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,
crowdstrike-filevantage-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 la política y el rol de gestión de identidades y accesos para las subidas de S3
- En la consola de AWS, ve a IAM > Políticas.
- Haz clic en Crear política > pestaña JSON.
- Copia y pega la siguiente política.
JSON de la política (sustituye
crowdstrike-filevantage-logs
si has introducido otro nombre de contenedor):{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::crowdstrike-filevantage-logs/*" }, { "Sid": "AllowGetStateObject", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::crowdstrike-filevantage-logs/filevantage/state.json" } ] }
Haz clic en Siguiente > Crear política.
Ve a IAM > Roles > Crear rol > Servicio de AWS > Lambda.
Adjunte la política que acaba de crear.
Dale el nombre
CrowdStrikeFileVantageRole
al rol y haz clic en Crear rol.
Crear la función Lambda
- En la consola de AWS, ve a Lambda > Funciones > Crear función.
- Haz clic en Crear desde cero.
Proporciona los siguientes detalles de configuración:
Ajuste Valor Nombre crowdstrike-filevantage-logs
Tiempo de ejecución Python 3.13 Arquitectura x86_64 Rol de ejecución CrowdStrikeFileVantageRole
Una vez creada la función, abra la pestaña Código, elimine el stub y pegue el siguiente código (
crowdstrike-filevantage-logs.py
).import os import json import boto3 import urllib3 from datetime import datetime, timezone from urllib.parse import urlencode def lambda_handler(event, context): """ Lambda function to fetch CrowdStrike FileVantage logs and store them in S3 """ # Environment variables s3_bucket = os.environ['S3_BUCKET'] s3_prefix = os.environ['S3_PREFIX'] state_key = os.environ['STATE_KEY'] client_id = os.environ['FALCON_CLIENT_ID'] client_secret = os.environ['FALCON_CLIENT_SECRET'] base_url = os.environ['FALCON_BASE_URL'] # Initialize clients s3_client = boto3.client('s3') http = urllib3.PoolManager() try: # Get OAuth token token_url = f"{base_url}/oauth2/token" token_headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json' } token_data = urlencode({ 'client_id': client_id, 'client_secret': client_secret, 'grant_type': 'client_credentials' }) token_response = http.request('POST', token_url, body=token_data, headers=token_headers) if token_response.status != 200: print(f"Failed to get OAuth token: {token_response.status}") return {'statusCode': 500, 'body': 'Authentication failed'} token_data = json.loads(token_response.data.decode('utf-8')) access_token = token_data['access_token'] # Get last checkpoint last_timestamp = get_last_checkpoint(s3_client, s3_bucket, state_key) # Fetch file changes changes_url = f"{base_url}/filevantage/queries/changes/v1" headers = { 'Authorization': f'Bearer {access_token}', 'Accept': 'application/json' } # Build query parameters params = { 'limit': 500, 'sort': 'action_timestamp.asc' } if last_timestamp: params['filter'] = f"action_timestamp:>'{last_timestamp}'" query_url = f"{changes_url}?{urlencode(params)}" response = http.request('GET', query_url, headers=headers) if response.status != 200: print(f"Failed to query changes: {response.status}") return {'statusCode': 500, 'body': 'Failed to fetch changes'} response_data = json.loads(response.data.decode('utf-8')) change_ids = response_data.get('resources', []) if not change_ids: print("No new changes found") return {'statusCode': 200, 'body': 'No new changes'} # Get detailed change information details_url = f"{base_url}/filevantage/entities/changes/v1" batch_size = 100 all_changes = [] latest_timestamp = last_timestamp for i in range(0, len(change_ids), batch_size): batch_ids = change_ids[i:i + batch_size] details_params = {'ids': batch_ids} details_query_url = f"{details_url}?{urlencode(details_params, doseq=True)}" details_response = http.request('GET', details_query_url, headers=headers) if details_response.status == 200: details_data = json.loads(details_response.data.decode('utf-8')) changes = details_data.get('resources', []) all_changes.extend(changes) # Track latest timestamp for change in changes: change_time = change.get('action_timestamp') if change_time and (not latest_timestamp or change_time > latest_timestamp): latest_timestamp = change_time if all_changes: # Store logs in S3 timestamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S') s3_key = f"{s3_prefix}filevantage_changes_{timestamp}.json" s3_client.put_object( Bucket=s3_bucket, Key=s3_key, Body='\n'.join(json.dumps(change) for change in all_changes), ContentType='application/json' ) # Update checkpoint save_checkpoint(s3_client, s3_bucket, state_key, latest_timestamp) print(f"Stored {len(all_changes)} changes in S3: {s3_key}") return { 'statusCode': 200, 'body': f'Processed {len(all_changes)} changes' } except Exception as e: print(f"Error: {str(e)}") return {'statusCode': 500, 'body': f'Error: {str(e)}'} def get_last_checkpoint(s3_client, bucket, key): """Get the last processed timestamp from S3 state file""" try: response = s3_client.get_object(Bucket=bucket, Key=key) state = json.loads(response['Body'].read().decode('utf-8')) return state.get('last_timestamp') except s3_client.exceptions.NoSuchKey: return None except Exception as e: print(f"Error reading checkpoint: {e}") return None def save_checkpoint(s3_client, bucket, key, timestamp): """Save the last processed timestamp to S3 state file""" try: state = { 'last_timestamp': timestamp, 'updated_at': datetime.now(timezone.utc).isoformat() } s3_client.put_object( Bucket=bucket, Key=key, Body=json.dumps(state), ContentType='application/json' ) except Exception as e: print(f"Error saving checkpoint: {e}")
Vaya a Configuración > Variables de entorno.
Haz clic en Editar > Añadir nueva variable de entorno.
Introduce las variables de entorno que se indican en la siguiente tabla y sustituye los valores de ejemplo por los tuyos.
Variables de entorno
Clave Valor de ejemplo S3_BUCKET
crowdstrike-filevantage-logs
S3_PREFIX
filevantage/
STATE_KEY
filevantage/state.json
FALCON_CLIENT_ID
<your-client-id>
FALCON_CLIENT_SECRET
<your-client-secret>
FALCON_BASE_URL
https://api.crowdstrike.com
(EE. UU. 1) /https://api.us-2.crowdstrike.com
(EE. UU. 2) /https://api.eu-1.crowdstrike.com
(UE 1)Una vez creada la función, permanece en su página (o abre Lambda > Funciones > tu-función).
Seleccione la pestaña Configuración.
En el panel Configuración general, haz clic en Editar.
Cambia Tiempo de espera a 5 minutos (300 segundos) y haz clic en Guardar.
Crear una programación de EventBridge
- Ve a Amazon EventBridge > Scheduler > Create schedule (Amazon EventBridge > Programador > Crear programación).
- Proporcione los siguientes detalles de configuración:
- Programación periódica: Precio (
1 hour
). - Destino: tu función Lambda
crowdstrike-filevantage-logs
. - Nombre:
crowdstrike-filevantage-logs-1h
.
- Programación periódica: Precio (
- Haz clic en Crear programación.
(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:::crowdstrike-filevantage-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::crowdstrike-filevantage-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 CrowdStrike FileVantage
- 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,
CrowdStrike FileVantage logs
). - Selecciona Amazon S3 V2 como Tipo de fuente.
- Seleccione CrowdStrike Filevantage como Tipo de registro.
- Haz clic en Siguiente.
- Especifique los valores de los siguientes parámetros de entrada:
- URI de S3:
s3://crowdstrike-filevantage-logs/filevantage/
- 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.
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.