Recolha registos do CyberArk EPM

Compatível com:

Este documento explica como carregar registos do CyberArk EPM para o Google Security Operations através do AWS S3. O analisador transforma os dados de registo do CyberArk EPM num modelo de dados unificado (UDM). Itera cada evento no registo, mapeia os campos relevantes para os respetivos campos da UDM, processa estruturas de dados específicas, como exposedUsers, e enriquece o resultado com informações estáticas do fornecedor e do produto.

Antes de começar

  • Certifique-se de que tem uma instância do Google Security Operations.
  • Certifique-se de que tem acesso privilegiado à AWS.
  • Certifique-se de que tem acesso privilegiado à consola de gestão do servidor EPM.

Configure o AWS IAM para a carregamento do Google SecOps

  1. Crie um utilizador seguindo este guia do utilizador: criar um utilizador do IAM.
  2. Selecione o utilizador criado.
  3. Selecione o separador Credenciais de segurança.
  4. Clique em Criar chave de acesso na secção Chaves de acesso.
  5. Selecione Serviço de terceiros como o Exemplo de utilização.
  6. Clicar em Seguinte.
  7. Opcional: adicione uma etiqueta de descrição.
  8. Clique em Criar chave de acesso.
  9. Clique em Transferir ficheiro CSV para guardar a chave de acesso e a chave de acesso secreta para utilização posterior.
  10. Clique em Concluído.
  11. Selecione o separador Autorizações.
  12. Clique em Adicionar autorizações na secção Políticas de autorizações .
  13. Selecione Adicionar autorizações.
  14. Selecione Anexar políticas diretamente.
  15. Pesquise e selecione a política AmazonS3FullAccess.
  16. Clicar em Seguinte.
  17. Clique em Adicionar autorizações.

Configure o CyberArk EPM para acesso à API

  1. Inicie sessão na consola Web do CyberArk EPM como administrador.
  2. Aceda a Administração > Gestão de contas.
  3. Clique em + Adicionar utilizador.
  4. Forneça os seguintes detalhes:
    • Nome de utilizador: epm_api_user
    • Palavra-passe: segredo forte
    • Email/Nome completo: opcional
  5. Em Autorizações, conceda ViewOnlySetAdmin em todos os conjuntos de registos extraídos.
  6. Clique em Guardar.
  7. Opcional: prolongue o limite de tempo da sessão:
    • Aceda a Administração > Configuração da conta.
    • Defina Limite de tempo para sessão inativa para 60 minutos.
    • Clique em Guardar.
  8. Aceda a Política e conjuntos > selecione o seu conjunto > Propriedades.
  9. Copie e guarde o ID do conjunto (um GUID). Vai usá-lo no script como EPM_SET_ID.

Crie um contentor do AWS S3

  1. Inicie sessão na AWS Management Console.
  2. Aceda a AWS Console > Services > S3 > Create bucket.
  3. Indique os seguintes detalhes de configuração:
    • Nome do contentor: my-cyberark-epm-logs
    • Região: a sua escolha > Criar

Crie uma função do IAM para o EC2

  1. Inicie sessão na AWS Management Console.
  2. Aceda a Serviços.
  3. Na barra de pesquisa, escreva IAM e selecione-o.
  4. No painel de controlo do IAM, clique em Funções.
  5. Clique em Criar função.
  6. Indique os seguintes detalhes de configuração:
    • Entidade fidedigna: serviço AWS > EC2 > Seguinte.
    • Anexe a autorização: AmazonS3FullAccess (ou uma política com âmbito para o seu contentor) > Seguinte.
    • Nome da função: EC2-S3-EPM-Writer > Criar função.

Opcional: inicie e configure a VM do coletor do EC2

  1. Inicie sessão na AWS Management Console.
  2. Aceda a Serviços.
  3. Na barra de pesquisa, escreva EC2 e selecione-o.
  4. No painel de controlo do EC2, clique em Instances.
  5. Clique em Iniciar instâncias.
  6. Indique os seguintes detalhes de configuração:
    • Nome: introduza EPM-Log-Collector.
    • AMI: selecione Ubuntu Server 22.04 LTS.
    • Tipo de instância: escolha t3.micro (ou superior) e, de seguida, clique em Seguinte
    • Rede: certifique-se de que a definição de rede está definida para a sua VPC predefinida.
    • Função do IAM: selecione a função do IAM EC2-S3-EPM-Writer no menu.
    • Atribuir automaticamente IP público: defina esta opção como Ativar. Se se for ligar através de uma VPN, pode deixar esta opção desativada.
    • Adicionar armazenamento: deixe a configuração de armazenamento predefinida (8 GiB) e, de seguida, clique em Seguinte.
    • Selecione Criar um novo grupo de segurança.
    • Regra de entrada: clique em Adicionar regra.
    • Tipo: selecione SSH.
    • Porta: 22.
    • Origem: o seu IP
    • Clique em Rever e iniciar.
    • Selecione ou crie um par de chaves.
    • Clique em Transferir par de chaves.
    • Guarde o ficheiro PEM transferido. Precisa deste ficheiro para estabelecer ligação à sua instância através de SSH.
  7. Estabeleça ligação à sua máquina virtual (VM) através do SSH:

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

Instale os pré-requisitos do Collector

  1. Atualize o sistema operativo:

    # 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 ficheiro 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á 1 hora):

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

Implemente 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 ficheiro 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
    

Automatize com o Cron

  1. Abra o crontab:

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

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

Configure um feed no Google SecOps para carregar registos do Cyberark EPM

  1. Aceda a Definições do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, introduza 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 registo.
  6. Clicar em Seguinte.
  7. Especifique valores para os seguintes parâmetros de entrada:

    • Região: a região onde o contentor do Amazon S3 está localizado.
    • URI do S3: o URI do contentor (o formato deve ser: s3://your-log-bucket-name/). Substitua o seguinte:
      • your-log-bucket-name: o nome do segmento.
    • O URI é um: selecione Diretório ou Diretório que inclui subdiretórios.
    • Opções de eliminação de origens: selecione a opção de eliminação de acordo com a sua preferência.
    • ID da chave de acesso: a chave de acesso do utilizador com acesso ao contentor do S3.
    • Chave de acesso secreta: a 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 a aplicar 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.

Tabela de mapeamento da UDM

Campo de registo Mapeamento de 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 uma etiqueta com a chave "accountName_[index]" e o valor de exposedUsers.[index].accountName.
exposedUsers.[].domain target.user.attribute.labels Cria uma etiqueta com a chave "domain_[index]" e o valor de exposedUsers.[index].domain.
exposedUsers.[].username target.user.attribute.labels Cria uma etiqueta com a chave "username_[index]" e o valor de exposedUsers.[index].username.
filePath target.file.full_path Mapeia diretamente o campo filePath.
hash 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.
editora additional.fields Cria um campo com a chave "Publisher" e string_value a partir do campo do publicador.
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 a partir do campo sourceProcessSigner.
threatProtectionAction security_result.action_details Mapeia diretamente o campo threatProtectionAction.
metadata.event_timestamp Define a data/hora do evento para a hora de criação da entrada do registo.
metadata.event_type Codificado de forma rígida para "STATUS_UPDATE".
metadata.log_type Codificado de forma rígida para "CYBERARK_EPM".
metadata.product_name Codificado de forma rígida para "EPM".
metadata.vendor_name Codificado de forma rígida para "CYBERARK".
security_result.alert_state Codificado de forma rígida como "ALERTING".
userName principal.user.userid Mapeia diretamente o campo userName.

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