Coletar registros do CyberArk EPM

Compatível com:

Este documento explica como transferir os registros do EPM do CyberArk para o Google Security Operations usando o AWS S3. O analisador transforma os dados de registro do CyberArk EPM em um modelo de dados unificado (UDM). Ele itera cada evento no registro, mapeia campos relevantes para os campos correspondentes do UDM, processa estruturas de dados específicas, como exposedUsers, e enriquece a saída com informações estáticas de fornecedores e produtos.

Antes de começar

  • Verifique se você tem uma instância do Google Security Operations.
  • Verifique se você tem acesso privilegiado à AWS.
  • Verifique se você tem acesso privilegiado ao console de gerenciamento do servidor do EPM.

Configurar o IAM da AWS para a ingestão do Google SecOps

  1. Crie um usuário seguindo este guia: Como criar um usuário do IAM.
  2. Selecione o Usuário criado.
  3. Selecione a guia Credenciais de segurança.
  4. Clique em Criar chave de acesso na seção Chaves de acesso.
  5. Selecione Serviço de terceiros como o caso de uso.
  6. Clique em Próxima.
  7. Opcional: adicione uma tag de descrição.
  8. Clique em Criar chave de acesso.
  9. Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para uso futuro.
  10. Clique em Concluído.
  11. Selecione a guia Permissões.
  12. Clique em Adicionar permissões na seção Políticas de permissões .
  13. Selecione Adicionar permissões.
  14. Selecione Anexar políticas diretamente.
  15. Pesquise e selecione a política AmazonS3FullAccess.
  16. Clique em Próxima.
  17. Clique em Adicionar permissões

Configurar o CyberArk EPM para acesso à API

  1. Faça login no console da Web do CyberArk EPM como administrador.
  2. Acesse Administração > Gerenciamento de conta.
  3. Clique em + Adicionar usuário.
  4. Forneça os seguintes detalhes:
    • Nome de usuário: epm_api_user
    • Senha: segredo forte
    • E-mail/nome completo: opcional
  5. Em Permissões, conceda ViewOnlySetAdmin em cada Set de registros extraídos.
  6. Clique em Salvar.
  7. Opcional: ampliar o tempo limite da sessão:
    • Acesse Administração > Configuração da conta.
    • Defina o Tempo limite para sessão inativa como 60 minutos.
    • Clique em Salvar.
  8. Acesse Políticas e conjuntos > selecione o conjunto > Propriedades.
  9. Copie e salve o ID do conjunto (um GUID). Você vai usá-lo no script como EPM_SET_ID.

Criar um bucket do AWS S3

  1. Faça login no Console de Gerenciamento da AWS.
  2. Acesse AWS Console > Serviços > S3 > Criar bucket.
  3. Informe os seguintes detalhes de configuração:
    • Nome do bucket: my-cyberark-epm-logs
    • Região: sua escolha > Criar

Criar um papel do IAM para o EC2

  1. Faça login no Console de Gerenciamento da AWS.
  2. Acesse Serviços.
  3. Na barra de pesquisa, digite IAM e selecione.
  4. No painel IAM, clique em Funções.
  5. Clique em Criar papel.
  6. Informe os seguintes detalhes de configuração:
    • Entidade confiável: Serviço da AWS > EC2 > Próxima.
    • Anexar permissão: AmazonS3FullAccess (ou uma política de escopo ao seu bucket) > Próxima.
    • Nome da função: EC2-S3-EPM-Writer > Criar função.

Opcional: iniciar e configurar a VM do coletor do EC2

  1. Faça login no console de Gerenciamento da AWS.
  2. Acesse Serviços.
  3. Na barra de pesquisa, digite EC2 e selecione.
  4. No painel do EC2, clique em Instâncias.
  5. Clique em Iniciar instâncias.
  6. Informe os seguintes detalhes de configuração:
    • Nome: insira EPM-Log-Collector.
    • AMI: selecione Ubuntu Server 22.04 LTS.
    • Tipo de instância: escolha t3.micro (ou maior) e clique em Próxima.
    • Rede: verifique se a configuração de rede está definida como a VPC padrão.
    • Função do IAM: selecione a função do IAM EC2-S3-EPM-Writer no menu.
    • Atribuir IP público automaticamente: defina como Ativar. Se você for se conectar por uma VPN, deixe essa opção desativada.
    • Adicionar armazenamento: deixe a configuração de armazenamento padrão (8 GiB) e clique em Próxima.
    • Selecione Criar um novo grupo de segurança.
    • Regra de entrada: clique em Adicionar regra.
    • Tipo: selecione SSH.
    • Porta: 22.
    • Origem: seu IP
    • Clique em Revisar e iniciar.
    • Selecione ou crie um par de chaves.
    • Clique em Fazer o download do par de chaves.
    • Salve o arquivo PEM salvo. Você vai precisar desse arquivo para se conectar à instância por SSH.
  7. Conecte-se à sua máquina virtual (VM) usando SSH:

    chmod 400 ~/Downloads/your-key.pem
    ssh -i ~/Downloads/your-key.pem ubuntu@<EC2_PUBLIC_IP>
    

Instalar os pré-requisitos do coletor

  1. Atualize o sistema operacional:

    # Update OS
    sudo apt update && sudo apt upgrade -y
    
    # Install Python, Git
    sudo apt install -y python3 python3-venv python3-pip git
    
    # Create & activate virtualenv
    python3 -m venv ~/epm-venv
    source ~/epm-venv/bin/activate
    
    # Install libraries
    pip install requests boto3
    
  2. Criar diretório e arquivo de estado:

    sudo mkdir -p /var/lib/epm-collector
    sudo touch /var/lib/epm-collector/last_run.txt
    sudo chown ubuntu:ubuntu /var/lib/epm-collector/last_run.txt
    
  3. Inicialize-o (por exemplo, há uma hora):

    echo "$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ)" > /var/lib/epm-collector/last_run.txt
    

Implantar o script do coletor

  1. Criar uma pasta para o projeto:

    mkdir ~/epm-collector && cd ~/epm-collector
    
  2. Defina as variáveis de ambiente (por exemplo, em ~/.bashrc):

    export EPM_URL="https://epm.mycompany.com"
    export EPM_USER="epm_api_user"
    export EPM_PASS="YourPasswordHere"
    export EPM_SET_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    export S3_BUCKET="my-cyberark-epm-logs"
    export S3_PREFIX="epm/"
    
  3. Crie collector.py e cole o seguinte:

    #!/usr/bin/env python3
    import os
    import sys
    import json
    import boto3
    import requests
    from datetime import datetime, timezone, timedelta
    
    # ── LOAD CONFIG FROM ENV ───────────────────────────────────────────────────────
    def must_env(var):
        v = os.getenv(var)
        if not v:
            print(f"ERROR: environment variable {var} is required", file=sys.stderr)
            sys.exit(1)
        return v
    
    EPM_URL    = must_env("EPM_URL")        # for example, https://epm.mycompany.com
    USERNAME   = must_env("EPM_USER")       # API username
    PASSWORD   = must_env("EPM_PASS")       # API password
    SET_ID     = must_env("EPM_SET_ID")     # GUID of the Set to pull
    S3_BUCKET  = must_env("S3_BUCKET")      # for example, my-cyberark-epm-logs
    S3_PREFIX  = os.getenv("S3_PREFIX", "") # optional, for example "epm/"
    STATE_FILE = os.getenv("STATE_FILE", "/var/lib/epm-collector/last_run.txt")
    PAGE_SIZE  = int(os.getenv("PAGE_SIZE", "100"))
    # ── END CONFIG ────────────────────────────────────────────────────────────────
    
    def read_last_run():
        try:
            ts = open(STATE_FILE).read().strip()
            return datetime.fromisoformat(ts.replace("Z","+00:00"))
        except:
            # default to 1 hour ago
            return datetime.now(timezone.utc) - timedelta(hours=1)
    
    def write_last_run(dt):
        with open(STATE_FILE, "w") as f:
            f.write(dt.strftime("%Y-%m-%dT%H:%M:%SZ"))
    
    def logon():
        r = requests.post(
            f"{EPM_URL}/REST/EPMService.svc/Logon",
            json={"username": USERNAME, "password": PASSWORD},
            headers={"Content-Type": "application/json"}
        )
        r.raise_for_status()
        return r.json().get("SessionToken")
    
    def logoff(token):
        requests.post(
            f"{EPM_URL}/REST/EPMService.svc/Logoff",
            headers={"Authorization": f"Bearer {token}"}
        )
    
    def fetch_raw_events(token, start, end):
        headers = {"Authorization": f"Bearer {token}"}
        page = 1
        while True:
            params = {
                "setId":     SET_ID,
                "startDate": start,
                "endDate":   end,
                "pageSize":  PAGE_SIZE,
                "pageNumber": page
            }
            resp = requests.get(
                f"{EPM_URL}/REST/EPMService.svc/GetRawEvents",
                headers=headers, params=params
            )
            resp.raise_for_status()
            events = resp.json().get("RawEvents", [])
            if not events:
                break
            yield from events
            page += 1
    
    def upload_to_s3(obj, key):
        boto3.client("s3").put_object(
            Bucket=S3_BUCKET,
            Key=key,
            Body=json.dumps(obj).encode("utf-8")
        )
    
    def main():
        # determine time window
        start_dt = read_last_run()
        end_dt   = datetime.now(timezone.utc)
        START = start_dt.strftime("%Y-%m-%dT%H:%M:%SZ")
        END   = end_dt.strftime("%Y-%m-%dT%H:%M:%SZ")
    
        token = logon()
        try:
            for idx, raw_evt in enumerate(fetch_raw_events(token, START, END), start=1):
                key = f"{S3_PREFIX}{end_dt.strftime('%Y/%m/%d')}/raw_{int(end_dt.timestamp())}_{idx}.json"
                upload_to_s3(raw_evt, key)
                print(f"Uploaded raw event to {key}")
        finally:
            logoff(token)
    
        # persist for next run
        write_last_run(end_dt)
    
    if __name__ == "__main__":
        main()
    
  4. Torne o script executável:

    chmod +x collector.py
    

Automatizar com o Cron

  1. Abra crontab:

    crontab -e
    
  2. Adicione o job diário:

    0 0 * * * cd ~/epm-collector && source ~/epm-venv/bin/activate && python collector.py >> ~/epm-collector/epm.log 2>&1
    

Configurar um feed no Google SecOps para processar registros do Cyberark EPM

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, insira um nome para o feed (por exemplo, Cyberark EPM Logs).
  4. Selecione Amazon S3 como o Tipo de origem.
  5. Selecione Cyberark EPM como o Tipo de registro.
  6. Clique em Próxima.
  7. Especifique valores para os seguintes parâmetros de entrada:

    • Região: a região em que o bucket do Amazon S3 está localizado.
    • URI do S3: o URI do bucket (o formato precisa ser s3://your-log-bucket-name/). Substitua o seguinte:
      • your-log-bucket-name: o nome do bucket
    • O URI é: selecione Diretório ou Diretório que inclui subdiretórios.
    • Opções de exclusão da origem: selecione a opção de exclusão de acordo com sua preferência.
    • ID da chave de acesso: a chave de acesso do usuário com acesso ao bucket do S3.
    • Chave de acesso secreta: a chave secreta do usuário com acesso ao bucket do S3.
    • Namespace do recurso: o namespace do recurso.
    • Rótulos de ingestão: o rótulo a ser aplicado aos eventos desse feed.
  8. Clique em Próxima.

  9. Revise a configuração do novo feed na tela Finalizar e clique em Enviar.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
agentId principal.asset.asset_id Concatena "agentId:" com o valor do campo "agentId".
computerName principal.hostname Mapeia diretamente o campo computerName.
displayName metadata.description Mapeia diretamente o campo displayName.
eventType metadata.product_event_type Mapeia diretamente o campo eventType.
exposedUsers.[].accountName target.user.attribute.labels Cria um rótulo com a chave "accountName_[index]" e o valor de exposedUsers.[index].accountName.
exposedUsers.[].domain target.user.attribute.labels Cria um rótulo com a chave "domain_[index]" e o valor de exposedUsers.[index].domain.
exposedUsers.[].username target.user.attribute.labels Cria um rótulo com a chave "username_[index]" e o valor de exposedUsers.[index].username.
filePath target.file.full_path Mapeia diretamente o campo filePath.
jogo da velha target.file.sha1 Mapeia diretamente o campo de hash.
operatingSystemType principal.platform Mapeia "Windows" para "WINDOWS" se o campo "operatingSystemType" for "Windows".
policyName security_result.rule_name Mapeia diretamente o campo policyName.
processCommandLine target.process.command_line Mapeia diretamente o campo processCommandLine.
editor additional.fields Cria um campo com a chave "Editor" e string_value do campo do editor.
sourceProcessCommandLine target.process.parent_process.command_line Mapeia diretamente o campo sourceProcessCommandLine.
sourceProcessHash target.process.parent_process.file.sha1 Mapeia diretamente o campo sourceProcessHash.
sourceProcessSigner additional.fields Cria um campo com a chave "sourceProcessSigner" e string_value do campo sourceProcessSigner.
threatProtectionAction security_result.action_details Mapeia diretamente o campo threatProtectionAction.
metadata.event_timestamp Define o carimbo de data/hora do evento para o create_time da entrada de registro.
metadata.event_type Fixado em "STATUS_UPDATE".
metadata.log_type Fixado em "CYBERARK_EPM".
metadata.product_name Fixado em "EPM".
metadata.vendor_name Fixado em "CYBERARK".
security_result.alert_state Fixado em "ALERTING".
userName principal.user.userid Mapeia diretamente o campo userName.

Alterações

2023-08-22

  • Parser recém-criado

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.