Coletar registros do CyberArk EPM

Compatível com:

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

Antes de começar

  • Verifique se você tem uma instância do Google Security Operations.
  • Verifique se você tem acesso privilegiado à AWS.
  • Confirme se você tem acesso privilegiado ao console de gerenciamento do servidor 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 posterior.
  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 todos os conjuntos de registros extraídos.
  6. Clique em Salvar.
  7. Opcional: estender o tempo limite da sessão:
    • Acesse Administração > Configuração da conta.
    • Defina Tempo limite para sessão inativa como 60 minutos.
    • Clique em Salvar.
  8. Acesse Política e conjuntos > selecione seu 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 Console da AWS > 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 essa opção.
  4. No painel IAM, clique em Funções.
  5. Clique em Criar papel.
  6. Informe os seguintes detalhes de configuração:
    • Entidade de confiança: Serviço da AWS > EC2 > Próxima.
    • Anexar permissão: AmazonS3FullAccess (ou uma política com escopo para seu bucket) > Próxima.
    • Nome da função: EC2-S3-EPM-Writer > Criar função.

Opcional: inicie e configure 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 essa opção.
  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 sua VPC padrão.
    • Papel do IAM: selecione o papel do IAM EC2-S3-EPM-Writer no menu.
    • Atribuir automaticamente IP público: defina como Ativar. Se você vai 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 baixado. Você vai precisar desse arquivo para se conectar à instância via 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. Crie o diretório e o 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, para 1 hora atrás):

    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 pasta do projeto:

    mkdir ~/epm-collector && cd ~/epm-collector
    
  2. Defina 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 o arquivo 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 ingerir 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 é um: selecione Diretório ou Diretório que inclui subdiretórios.
    • Opções de exclusão de fontes: 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 deste feed.
  8. Clique em Próxima.

  9. Revise a nova configuração do 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 marcador com a chave "domain_[index]" e o valor de exposedUsers.[index].domain.
exposedUsers.[].username target.user.attribute.labels Cria um marcador 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 "Publisher" e string_value do campo "publisher".
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 como o create_time da entrada de registro.
metadata.event_type Codificado como "STATUS_UPDATE".
metadata.log_type Codificado como "CYBERARK_EPM".
metadata.product_name Codificado como "EPM".
metadata.vendor_name Codificado como "CYBERARK".
security_result.alert_state Codificado como "ALERTING".
userName principal.user.userid Mapeia diretamente o campo userName.

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