Coletar registros do CyberArk EPM
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
- Crie um usuário seguindo este guia: Como criar um usuário do IAM.
- Selecione o Usuário criado.
- Selecione a guia Credenciais de segurança.
- Clique em Criar chave de acesso na seção Chaves de acesso.
- Selecione Serviço de terceiros como o caso de uso.
- Clique em Próxima.
- Opcional: adicione uma tag de descrição.
- Clique em Criar chave de acesso.
- Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para uso futuro.
- Clique em Concluído.
- Selecione a guia Permissões.
- Clique em Adicionar permissões na seção Políticas de permissões .
- Selecione Adicionar permissões.
- Selecione Anexar políticas diretamente.
- Pesquise e selecione a política AmazonS3FullAccess.
- Clique em Próxima.
- Clique em Adicionar permissões
Configurar o CyberArk EPM para acesso à API
- Faça login no console da Web do CyberArk EPM como administrador.
- Acesse Administração > Gerenciamento de conta.
- Clique em + Adicionar usuário.
- Forneça os seguintes detalhes:
- Nome de usuário: epm_api_user
- Senha: segredo forte
- E-mail/nome completo: opcional
- Em Permissões, conceda ViewOnlySetAdmin em cada Set de registros extraídos.
- Clique em Salvar.
- 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.
- Acesse Políticas e conjuntos > selecione o conjunto > Propriedades.
- 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
- Faça login no Console de Gerenciamento da AWS.
- Acesse AWS Console > Serviços > S3 > Criar bucket.
- 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
- Faça login no Console de Gerenciamento da AWS.
- Acesse Serviços.
- Na barra de pesquisa, digite
IAM
e selecione. - No painel IAM, clique em Funções.
- Clique em Criar papel.
- 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
- Faça login no console de Gerenciamento da AWS.
- Acesse Serviços.
- Na barra de pesquisa, digite EC2 e selecione.
- No painel do EC2, clique em Instâncias.
- Clique em Iniciar instâncias.
- 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.
- Nome: insira
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
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
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
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
Criar uma pasta para o projeto:
mkdir ~/epm-collector && cd ~/epm-collector
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/"
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()
Torne o script executável:
chmod +x collector.py
Automatizar com o Cron
Abra crontab:
crontab -e
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
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Cyberark EPM Logs
). - Selecione Amazon S3 como o Tipo de origem.
- Selecione Cyberark EPM como o Tipo de registro.
- Clique em Próxima.
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.
Clique em Próxima.
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.