Recolha registos do CrowdStrike FileVantage
Este documento explica como ingerir registos do CrowdStrike FileVantage no Google Security Operations através do Amazon S3.
Antes de começar
Certifique-se de que cumpre os seguintes pré-requisitos:
- Uma instância do Google SecOps.
- Acesso privilegiado à CrowdStrike Falcon Console.
- Acesso privilegiado à AWS (S3, Identity and Access Management [IAM], Lambda e EventBridge).
Recolha os pré-requisitos do CrowdStrike FileVantage (credenciais da API)
- Inicie sessão na CrowdStrike Falcon Console.
- Aceda a Apoio técnico e recursos > Clientes e chaves da API.
- Clique em Adicionar novo cliente de API.
- Indique os seguintes detalhes de configuração:
- Nome do cliente: introduza um nome descritivo (por exemplo,
Google SecOps FileVantage Integration
). - Descrição: introduza uma breve descrição da finalidade da integração.
- Âmbitos da API: selecione Falcon FileVantage:read.
- Nome do cliente: introduza um nome descritivo (por exemplo,
- Clique em Adicionar para concluir o processo.
- Copie e guarde numa localização segura os seguintes detalhes:
- ID de cliente
- Segredo do cliente
- URL base (determina a sua região da nuvem)
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,
crowdstrike-filevantage-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 uma 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 a política e a função de IAM para carregamentos do S3
- Na consola da AWS, aceda a IAM > Políticas.
- Clique em Criar política > separador JSON.
- Copie e cole a seguinte política.
JSON da política (substitua
crowdstrike-filevantage-logs
se tiver introduzido um nome de contentor diferente):{ "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" } ] }
Clique em Seguinte > Criar política.
Aceda a IAM > Funções > Criar função > Serviço AWS > Lambda.
Anexe a política criada recentemente.
Dê o nome
CrowdStrikeFileVantageRole
à função e clique em Criar função.
Crie a função Lambda
- Na consola da AWS, aceda a Lambda > Functions > Create function.
- Clique em Criar do zero.
Faculte os seguintes detalhes de configuração:
Definição Valor Nome crowdstrike-filevantage-logs
Runtime Python 3.13 Arquitetura x86_64 Função de execução CrowdStrikeFileVantageRole
Depois de criar a função, abra o separador Código, elimine o stub e cole o seguinte 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}")
Aceda a Configuração > Variáveis de ambiente.
Clique em Editar > Adicionar nova variável de ambiente.
Introduza as variáveis de ambiente fornecidas na tabela seguinte, substituindo os valores de exemplo pelos seus valores.
Variáveis de ambiente
Chave Valor de exemplo 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
(US-1) /https://api.us-2.crowdstrike.com
(US-2) /https://api.eu-1.crowdstrike.com
(EU-1)Depois de criar a função, permaneça na respetiva página (ou abra Lambda > Functions > a sua função).
Selecione o separador Configuração.
No painel Configuração geral, clique em Editar.
Altere Tempo limite para 5 minutos (300 segundos) e clique em Guardar.
Crie um horário do EventBridge
- Aceda a Amazon EventBridge > Scheduler > Create schedule.
- Indique os seguintes detalhes de configuração:
- Agenda recorrente: Taxa (
1 hour
). - Alvo: a sua função Lambda
crowdstrike-filevantage-logs
. - Nome:
crowdstrike-filevantage-logs-1h
.
- Agenda recorrente: Taxa (
- Clique em Criar programação.
(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:::crowdstrike-filevantage-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::crowdstrike-filevantage-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 CrowdStrike FileVantage
- 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,
CrowdStrike FileVantage logs
). - Selecione Amazon S3 V2 como o Tipo de origem.
- Selecione CrowdStrike Filevantage como o Tipo de registo.
- Clicar em Seguinte.
- Especifique valores para os seguintes parâmetros de entrada:
- URI do S3:
s3://crowdstrike-filevantage-logs/filevantage/
- 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.
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.