Recolha registos do CyberArk EPM
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
- Crie um utilizador seguindo este guia do utilizador: criar um utilizador do IAM.
- Selecione o utilizador criado.
- Selecione o separador Credenciais de segurança.
- Clique em Criar chave de acesso na secção Chaves de acesso.
- Selecione Serviço de terceiros como o Exemplo de utilização.
- Clicar em Seguinte.
- Opcional: adicione uma etiqueta de descrição.
- Clique em Criar chave de acesso.
- Clique em Transferir ficheiro CSV para guardar a chave de acesso e a chave de acesso secreta para utilização posterior.
- Clique em Concluído.
- Selecione o separador Autorizações.
- Clique em Adicionar autorizações na secção Políticas de autorizações .
- Selecione Adicionar autorizações.
- Selecione Anexar políticas diretamente.
- Pesquise e selecione a política AmazonS3FullAccess.
- Clicar em Seguinte.
- Clique em Adicionar autorizações.
Configure o CyberArk EPM para acesso à API
- Inicie sessão na consola Web do CyberArk EPM como administrador.
- Aceda a Administração > Gestão de contas.
- Clique em + Adicionar utilizador.
- Forneça os seguintes detalhes:
- Nome de utilizador: epm_api_user
- Palavra-passe: segredo forte
- Email/Nome completo: opcional
- Em Autorizações, conceda ViewOnlySetAdmin em todos os conjuntos de registos extraídos.
- Clique em Guardar.
- 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.
- Aceda a Política e conjuntos > selecione o seu conjunto > Propriedades.
- Copie e guarde o ID do conjunto (um GUID). Vai usá-lo no script como EPM_SET_ID.
Crie um contentor do AWS S3
- Inicie sessão na AWS Management Console.
- Aceda a AWS Console > Services > S3 > Create bucket.
- 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
- Inicie sessão na AWS Management Console.
- Aceda a Serviços.
- Na barra de pesquisa, escreva
IAM
e selecione-o. - No painel de controlo do IAM, clique em Funções.
- Clique em Criar função.
- 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
- Inicie sessão na AWS Management Console.
- Aceda a Serviços.
- Na barra de pesquisa, escreva EC2 e selecione-o.
- No painel de controlo do EC2, clique em Instances.
- Clique em Iniciar instâncias.
- 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.
- Nome: introduza
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
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
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
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
Criar pasta do projeto:
mkdir ~/epm-collector && cd ~/epm-collector
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/"
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()
Torne o script executável:
chmod +x collector.py
Automatize com o Cron
Abra o crontab:
crontab -e
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
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, introduza 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 registo.
- Clicar em Seguinte.
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.
Clicar em Seguinte.
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.