Recoger registros de CrowdStrike FileVantage

Disponible en:

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)

  1. Inicia sesión en la consola de CrowdStrike Falcon.
  2. Vaya a Asistencia y recursos > Clientes y claves de API.
  3. Haz clic en Añadir nuevo cliente de API.
  4. 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.
  5. Haz clic en Añadir para completar el proceso.
  6. 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

  1. Crea un segmento de Amazon S3 siguiendo esta guía de usuario: Crear un segmento.
  2. Guarda el nombre y la región del segmento para consultarlos más adelante (por ejemplo, crowdstrike-filevantage-logs).
  3. Crea un usuario siguiendo esta guía: Crear un usuario de gestión de identidades y accesos.
  4. Selecciona el Usuario creado.
  5. Selecciona la pestaña Credenciales de seguridad.
  6. En la sección Claves de acceso, haz clic en Crear clave de acceso.
  7. Selecciona Servicio de terceros en Caso práctico.
  8. Haz clic en Siguiente.
  9. Opcional: añade una etiqueta de descripción.
  10. Haz clic en Crear clave de acceso.
  11. Haz clic en Descargar archivo .CSV para guardar la clave de acceso y la clave de acceso secreta para futuras consultas.
  12. Haz clic en Listo.
  13. Selecciona la pestaña Permisos.
  14. En la sección Políticas de permisos, haz clic en Añadir permisos.
  15. Selecciona Añadir permisos.
  16. Seleccione Adjuntar políticas directamente.
  17. Busca la política AmazonS3FullAccess.
  18. Selecciona la política.
  19. Haz clic en Siguiente.
  20. 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

  1. En la consola de AWS, ve a IAM > Políticas.
  2. Haz clic en Crear política > pestaña JSON.
  3. Copia y pega la siguiente política.
  4. 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"
        }
      ]
    }
    
  5. Haz clic en Siguiente > Crear política.

  6. Ve a IAM > Roles > Crear rol > Servicio de AWS > Lambda.

  7. Adjunte la política que acaba de crear.

  8. Dale el nombre CrowdStrikeFileVantageRole al rol y haz clic en Crear rol.

Crear la función Lambda

  1. En la consola de AWS, ve a Lambda > Funciones > Crear función.
  2. Haz clic en Crear desde cero.
  3. 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
  4. 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}")
    
  5. Vaya a Configuración > Variables de entorno.

  6. Haz clic en Editar > Añadir nueva variable de entorno.

  7. 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)
  8. Una vez creada la función, permanece en su página (o abre Lambda > Funciones > tu-función).

  9. Seleccione la pestaña Configuración.

  10. En el panel Configuración general, haz clic en Editar.

  11. Cambia Tiempo de espera a 5 minutos (300 segundos) y haz clic en Guardar.

Crear una programación de EventBridge

  1. Ve a Amazon EventBridge > Scheduler > Create schedule (Amazon EventBridge > Programador > Crear programación).
  2. 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.
  3. Haz clic en Crear programación.

(Opcional) Crear un usuario y claves de IAM de solo lectura para Google SecOps

  1. Ve a Consola de AWS > IAM > Usuarios.
  2. Haz clic en Add users (Añadir usuarios).
  3. Proporcione los siguientes detalles de configuración:
    • Usuario: introduce secops-reader.
    • Tipo de acceso: selecciona Clave de acceso – Acceso programático.
  4. Haz clic en Crear usuario.
  5. Asigna una política de lectura mínima (personalizada): Usuarios > secops-reader > Permisos > Añadir permisos > Asignar políticas directamente > Crear política.
  6. 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"
        }
      ]
    }
    
  7. Nombre = secops-reader-policy.

  8. Haz clic en Crear política > busca o selecciona > Siguiente > Añadir permisos.

  9. Crea una clave de acceso para secops-reader: Credenciales de seguridad > Claves de acceso.

  10. Haz clic en Crear clave de acceso.

  11. Descarga la .CSV. (Estos valores se pegarán en el feed).

Configurar un feed en Google SecOps para ingerir registros de CrowdStrike FileVantage

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en + Añadir nuevo feed.
  3. En el campo Nombre del feed, introduce un nombre para el feed (por ejemplo, CrowdStrike FileVantage logs).
  4. Selecciona Amazon S3 V2 como Tipo de fuente.
  5. Seleccione CrowdStrike Filevantage como Tipo de registro.
  6. Haz clic en Siguiente.
  7. 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.
  8. Haz clic en Siguiente.
  9. 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.