Recolha registos dos serviços de IdP do CrowdStrike

Compatível com:

Este documento explica como carregar registos dos serviços de proteção de identidade (IDP) da CrowdStrike para o Google Security Operations através do Amazon S3. A integração usa a API CrowdStrike Unified Alerts para recolher eventos de proteção de identidade e armazená-los no formato NDJSON para processamento pelo analisador CS_IDP incorporado.

Antes de começar

Certifique-se de que cumpre os seguintes pré-requisitos:

  • Uma instância do Google SecOps.
  • Acesso privilegiado à CrowdStrike Falcon Console e à gestão de chaves de API.
  • Acesso privilegiado à AWS (S3, Identity and Access Management [IAM], Lambda e EventBridge).

Obtenha os pré-requisitos do CrowdStrike Identity Protection

  1. Inicie sessão na CrowdStrike Falcon Console.
  2. Aceda a Apoio técnico e recursos > Clientes e chaves da API.
  3. Clique em Adicionar novo cliente da API.
  4. Indique os seguintes detalhes de configuração:
    • Nome do cliente: introduza Google SecOps IDP Integration.
    • Descrição: introduza API client for Google SecOps integration.
    • Âmbitos: selecione o âmbito Alertas: LEITURA (alerts:read) (inclui alertas de proteção de identidade).
  5. Clique em Adicionar.
  6. Copie e guarde numa localização segura os seguintes detalhes:
    • ID de cliente
    • Segredo do cliente (só é apresentado uma vez)
    • URL de base (exemplos: api.crowdstrike.com para US-1, api.us-2.crowdstrike.com para US-2, api.eu-1.crowdstrike.com para EU-1)

Configure o contentor do AWS S3 e o IAM para o Google SecOps

  1. Crie um contentor do Amazon S3 seguindo este guia do utilizador: Criar um contentor
  2. Guarde o nome e a região do contentor para referência futura (por exemplo, crowdstrike-idp-logs-bucket).
  3. Crie um utilizador seguindo este guia do utilizador: criar um utilizador do IAM.
  4. Selecione o utilizador criado.
  5. Selecione o separador Credenciais de segurança.
  6. Clique em Criar chave de acesso na secção Chaves de acesso.
  7. Selecione Serviço de terceiros como Exemplo de utilização.
  8. Clicar em Seguinte.
  9. Opcional: adicione a etiqueta de descrição.
  10. Clique em Criar chave de acesso.
  11. Clique em Transferir ficheiro .CSV para guardar a chave de acesso e a chave de acesso secreta para referência futura.
  12. Clique em Concluído.
  13. Selecione o separador Autorizações.
  14. Clique em Adicionar autorizações na secção Políticas de autorizações.
  15. Selecione Adicionar autorizações.
  16. Selecione Anexar políticas diretamente.
  17. Pesquise a política AmazonS3FullAccess.
  18. Selecione a política.
  19. Clicar em Seguinte.
  20. Clique em Adicionar autorizações.

Configure a política e a função de IAM para carregamentos do S3

  1. Na consola da AWS, aceda a IAM > Políticas.
  2. Clique em Criar política > separador JSON.
  3. Copie e cole a seguinte política.
  4. JSON da política (substitua crowdstrike-idp-logs-bucket 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-idp-logs-bucket/*"
        },
        {
          "Sid": "AllowGetStateObject",
          "Effect": "Allow",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::crowdstrike-idp-logs-bucket/crowdstrike-idp/state.json"
        }
      ]
    }
    
  5. Clique em Seguinte > Criar política.

  6. Aceda a IAM > Funções > Criar função > Serviço AWS > Lambda.

  7. Anexe a política criada recentemente.

  8. Dê o nome CrowdStrike-IDP-Lambda-Role à função e clique em Criar função.

Crie a função Lambda

  1. Na consola da AWS, aceda a Lambda > Functions > Create function.
  2. Clique em Criar do zero.
  3. Faculte os seguintes detalhes de configuração:

    Definição Valor
    Nome CrowdStrike-IDP-Collector
    Runtime Python 3.13
    Arquitetura x86_64
    Função de execução CrowdStrike-IDP-Lambda-Role
  4. Depois de criar a função, abra o separador Código, elimine o stub e cole o seguinte código:

    import json
    import boto3
    import urllib3
    import os
    from datetime import datetime, timezone
    from urllib.parse import urlencode
    
    HTTP = urllib3.PoolManager()
    
    def lambda_handler(event, context):
        """
        Fetch CrowdStrike Identity Protection alerts (Unified Alerts API)
        and store RAW JSON (NDJSON) to S3 for the CS_IDP parser.
        No transformation is performed.
        """
        # Environment variables
        s3_bucket = os.environ['S3_BUCKET']
        s3_prefix = os.environ['S3_PREFIX']
        state_key = os.environ['STATE_KEY']
        client_id = os.environ['CROWDSTRIKE_CLIENT_ID']
        client_secret = os.environ['CROWDSTRIKE_CLIENT_SECRET']
        api_base = os.environ['API_BASE']
    
        s3 = boto3.client('s3')
    
        token = get_token(client_id, client_secret, api_base)
        last_ts = get_last_timestamp(s3, s3_bucket, state_key)
    
        # FQL filter for Identity Protection alerts only, newer than checkpoint
        fql_filter = f"product:'idp'+updated_timestamp:>'{last_ts}'"
        sort = 'updated_timestamp.asc'
    
        # Step 1: Get list of alert IDs
        all_ids = []
        per_page = int(os.environ.get('ALERTS_LIMIT', '1000'))  # up to 10000 per SDK docs
        offset = 0
        while True:
            page_ids = query_alert_ids(api_base, token, fql_filter, sort, per_page, offset)
            if not page_ids:
                break
            all_ids.extend(page_ids)
            if len(page_ids) < per_page:
                break
            offset += per_page
    
        if not all_ids:
            return {'statusCode': 200, 'body': 'No new Identity Protection alerts.'}
    
        # Step 2: Get alert details in batches (max 1000 IDs per request)
        details = []
        max_batch = 1000
        for i in range(0, len(all_ids), max_batch):
            batch = all_ids[i:i+max_batch]
            details.extend(fetch_alert_details(api_base, token, batch))
    
        if details:
            details.sort(key=lambda d: d.get('updated_timestamp', d.get('created_timestamp', '')))
            latest = details[-1].get('updated_timestamp') or details[-1].get('created_timestamp')
    
            key = f"{s3_prefix}cs_idp_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json"
            body = '\n'.join(json.dumps(d, separators=(',', ':')) for d in details)
    
            s3.put_object(
                Bucket=s3_bucket,
                Key=key,
                Body=body.encode('utf-8'),
                ContentType='application/x-ndjson'
            )
    
            update_state(s3, s3_bucket, state_key, latest)
    
        return {'statusCode': 200, 'body': f'Wrote {len(details)} alerts to S3.'}
    
    def get_token(client_id, client_secret, api_base):
        """Get OAuth2 token from CrowdStrike API"""
        url = f"https://{api_base}/oauth2/token"
        data = f"client_id={client_id}&client_secret={client_secret}&grant_type=client_credentials"
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        r = HTTP.request('POST', url, body=data, headers=headers)
        if r.status != 200:
            raise Exception(f'Auth failed: {r.status} {r.data}')
        return json.loads(r.data.decode('utf-8'))['access_token']
    
    def query_alert_ids(api_base, token, fql_filter, sort, limit, offset):
        """Query alert IDs using filters"""
        url = f"https://{api_base}/alerts/queries/alerts/v2"
        params = {'filter': fql_filter, 'sort': sort, 'limit': str(limit), 'offset': str(offset)}
        qs = urlencode(params)
        r = HTTP.request('GET', f"{url}?{qs}", headers={'Authorization': f'Bearer {token}'})
        if r.status != 200:
            raise Exception(f'Query alerts failed: {r.status} {r.data}')
        resp = json.loads(r.data.decode('utf-8'))
        return resp.get('resources', [])
    
    def fetch_alert_details(api_base, token, composite_ids):
        """Fetch detailed alert data by composite IDs"""
        url = f"https://{api_base}/alerts/entities/alerts/v2"
        body = {'composite_ids': composite_ids}
        headers = {'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'}
        r = HTTP.request('POST', url, body=json.dumps(body).encode('utf-8'), headers=headers)
        if r.status != 200:
            raise Exception(f'Fetch alert details failed: {r.status} {r.data}')
        resp = json.loads(r.data.decode('utf-8'))
        return resp.get('resources', [])
    
    def get_last_timestamp(s3, bucket, key, default='2023-01-01T00:00:00Z'):
        """Get last processed timestamp from S3 state file"""
        try:
            obj = s3.get_object(Bucket=bucket, Key=key)
            state = json.loads(obj['Body'].read().decode('utf-8'))
            return state.get('last_timestamp', default)
        except s3.exceptions.NoSuchKey:
            return default
    
    def update_state(s3, bucket, key, ts):
        """Update last processed timestamp in S3 state file"""
        state = {'last_timestamp': ts, 'updated': datetime.now(timezone.utc).isoformat()}
        s3.put_object(Bucket=bucket, Key=key, Body=json.dumps(state).encode('utf-8'), ContentType='application/json')
    
  5. Aceda a Configuração > Variáveis de ambiente.

  6. Clique em Editar > Adicionar nova variável de ambiente.

  7. 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-idp-logs-bucket
    S3_PREFIX crowdstrike-idp/
    STATE_KEY crowdstrike-idp/state.json
    CROWDSTRIKE_CLIENT_ID <your-client-id>
    CROWDSTRIKE_CLIENT_SECRET <your-client-secret>
    API_BASE api.crowdstrike.com (US-1), api.us-2.crowdstrike.com (US-2), api.eu-1.crowdstrike.com (EU-1)
    ALERTS_LIMIT 1000 (opcional, máximo de 10 000 por página)
  8. Depois de criar a função, permaneça na respetiva página (ou abra Lambda > Functions > a sua função).

  9. Selecione o separador Configuração.

  10. No painel Configuração geral, clique em Editar.

  11. Altere Tempo limite para 5 minutos (300 segundos) e clique em Guardar.

Crie um horário do EventBridge

  1. Aceda a Amazon EventBridge > Scheduler > Create schedule.
  2. Indique os seguintes detalhes de configuração:
    • Agenda recorrente: Taxa (15 minutes).
    • Alvo: a sua função Lambda CrowdStrike-IDP-Collector.
    • Nome: CrowdStrike-IDP-Collector-15m.
  3. Clique em Criar programação.

(Opcional) Crie um utilizador e chaves da IAM só de leitura para o Google SecOps

  1. Aceda a AWS Console > IAM > Users.
  2. Clique em Adicionar utilizadores.
  3. Indique os seguintes detalhes de configuração:
    • Utilizador: introduza secops-reader.
    • Tipo de acesso: selecione Chave de acesso – Acesso programático.
  4. Clique em Criar utilizador.
  5. Anexe a política de leitura mínima (personalizada): Users > secops-reader > Permissions > Add permissions > Attach policies directly > Create policy.
  6. JSON:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject"],
          "Resource": "arn:aws:s3:::crowdstrike-idp-logs-bucket/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::crowdstrike-idp-logs-bucket"
        }
      ]
    }
    
  7. Nome = secops-reader-policy.

  8. Clique em Criar política > procure/selecione > Seguinte > Adicionar autorizações.

  9. Crie uma chave de acesso para secops-reader: Credenciais de segurança > Chaves de acesso.

  10. Clique em Criar chave de acesso.

  11. Transfira o .CSV. (Vai colar estes valores no feed).

Configure um feed no Google SecOps para carregar registos dos serviços de proteção de identidade do CrowdStrike

  1. Aceda a Definições do SIEM > Feeds.
  2. Clique em + Adicionar novo feed.
  3. No campo Nome do feed, introduza um nome para o feed (por exemplo, CrowdStrike Identity Protection Services logs).
  4. Selecione Amazon S3 V2 como o Tipo de origem.
  5. Selecione Serviços de proteção de identidade da Crowdstrike como o Tipo de registo.
  6. Clicar em Seguinte.
  7. Especifique valores para os seguintes parâmetros de entrada:
    • URI do S3: s3://crowdstrike-idp-logs-bucket/crowdstrike-idp/
    • 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.
  8. Clicar em Seguinte.
  9. 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.