Coletar registros do 1Password
Este documento explica como ingerir registros do 1Password no Google Security Operations usando o Bindplane. O analisador transforma dados de registro brutos formatados em JSON em um formato estruturado compatível com o modelo de dados unificado (UDM) do Google SecOps. Ele se concentra especificamente na normalização e no enriquecimento de eventos relacionados a tentativas de login do usuário, extraindo detalhes sobre o usuário, a localização dele, informações do cliente e o resultado da tentativa.
Antes de começar
Verifique se você atende aos seguintes pré-requisitos:
- Instância do Google SecOps
- Host Windows 2016 ou mais recente ou Linux com systemd
- Se estiver executando por trás de um proxy, as portas do firewall estarão abertas.
- Acesso privilegiado ao 1Password
Receber o arquivo de autenticação de ingestão do Google SecOps
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Agentes de coleta.
- Baixe o arquivo de autenticação de ingestão. Salve o arquivo de forma segura no sistema em que o Bindplane será instalado.
Receber o ID do cliente do Google SecOps
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Perfil.
- Copie e salve o ID do cliente na seção Detalhes da organização.
Instalar o agente do Bindplane
Instalação do Windows
- Abra o Prompt de Comando ou o PowerShell como administrador.
Execute este comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Instalação do Linux
- Abra um terminal com privilégios de root ou sudo.
Execute este comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Outros recursos de instalação
Para mais opções de instalação, consulte o guia de instalação.
Configurar o agente do Bindplane para ingerir o Syslog e enviar ao Google SecOps
- Acesse o arquivo de configuração:
- Localize o arquivo
config.yaml
. Normalmente, ele fica no diretório/etc/bindplane-agent/
no Linux ou no diretório de instalação no Windows. - Abra o arquivo usando um editor de texto (por exemplo,
nano
,vi
ou Bloco de Notas).
- Localize o arquivo
Edite o arquivo
config.yaml
da seguinte forma:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: 'ONEPASSWORD' raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Substitua a porta e o endereço IP conforme necessário na sua infraestrutura.
Substitua
<customer_id>
pelo ID do cliente real.Atualize
/path/to/ingestion-authentication-file.json
para o caminho em que o arquivo de autenticação foi salvo na seção Receber arquivo de autenticação de ingestão do Google SecOps.
Reinicie o agente do Bindplane para aplicar as mudanças
Para reiniciar o agente do Bindplane no Linux, execute o seguinte comando:
sudo systemctl restart bindplane-agent
Para reiniciar o agente do Bindplane no Windows, use o console Serviços ou insira o seguinte comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Gerar o token da API do 1Password
- Faça login na UI da Web do 1Password.
- Acesse Integrações.
- Clique em Diretório na parte de cima da página.
- Digite um nome para o token e defina a expiração dele.
- Em Relatórios de eventos, clique em Outros.
- Selecione os Tipos de evento correspondentes.
- Clique em Emitir token para gerar a chave do token de acesso.
- Clique em Salvar no 1Password e selecione em qual cofre salvar o token.
- Clique em Ver detalhes da integração para conferir o token.
Configure um host Linux para executar o seguinte:
Execute este comando:
import datetime import requests import os import socket import json # For more information, check out the support page: https://support.1password.com/events-reporting api_token = os.environ.get('EVENTS_API_TOKEN') url = "https://events.1password.com" if not api_token: print("Please set the EVENTS_API_TOKEN environment variable.") exit(1) start_time = datetime.datetime.now() - datetime.timedelta(hours=24) # Define the bindplane agent details syslog_server_ip = <ip-address> # Replace with your Bindplane IP syslog_server_port = <port-number> # Replace with your Bindplane port headers = { "Content-Type": "application/json", "Authorization": f"Bearer {api_token}" payload = { "limit": 20, "start_time": start_time.astimezone().replace(microsecond=0).isoformat() # Alternatively, use the cursor returned from previous responses to get any new events # payload = { "cursor": cursor } try: r = requests.post(f"{url}/api/v1/signinattempts", headers=headers, json=payload) r.raise_for_status() # Raise an exception if the request fails if r.status_code == requests.codes.ok: # Send the response to the bindplane server syslog_message = f"{json.dumps(r.json())}" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.connect((syslog_server_ip, syslog_server_port)) sock.sendall(f"{syslog_message}\n".encode()) else: print(f"Error getting sign-in attempts: status code {r.status_code}") except requests.exceptions.RequestException as e: print(f"Request error: {e}") except Exception as e: print(f"Error during syslog logging: {e}")
Tabela de mapeamento da UDM
Campo de registro | Mapeamento da UDM | Lógica |
---|---|---|
categoria | security_result.category_details | O valor é extraído do campo category no registro bruto. |
client.app_name | principal.application | O valor é extraído do campo client.app_name no registro bruto. |
client.app_version | metadata.product_version | O valor é extraído do campo client.app_version no registro bruto. |
client.ip_address | principal.ip | O valor é extraído do campo client.ip_address no registro bruto. |
client.os_name | principal.platform | O valor é extraído do campo client.os_name no registro bruto e mapeado para o valor correspondente da plataforma UDM (LINUX, WINDOWS, MAC). |
client.os_version | principal.platform_version | O valor é extraído do campo client.os_version no registro bruto. |
client.platform_name | principal.resource.attribute.labels.key: platform_name , principal.resource.attribute.labels.value: Chrome |
O valor é extraído do campo client.platform_name no registro bruto. |
client.platform_version | principal.asset.platform_software.platform_version | O valor é extraído do campo client.platform_version no registro bruto. |
país | principal.location.country_or_region | O valor é extraído do campo country no registro bruto se location.country não estiver presente. |
item_uuid | security_result.about.resource.attribute.labels.key: item_uuid , security_result.about.resource.attribute.labels.value: nx4f2lhmafhhfkvgid6ff2fyh4 |
O valor é extraído do campo item_uuid no registro bruto. |
location.city | principal.location.city | O valor é extraído do campo location.city no registro bruto. |
location.country | principal.location.country_or_region | O valor é extraído do campo location.country no registro bruto. |
location.latitude | principal.location.region_latitude | O valor é extraído do campo location.latitude no registro bruto. |
location.longitude | principal.location.region_longitude | O valor é extraído do campo location.longitude no registro bruto. |
location.region | principal.location.name | O valor é extraído do campo location.region no registro bruto. |
session.ip | principal.ip | O valor é extraído do campo session.ip no registro bruto. |
session_uuid | network.session_id | O valor é extraído do campo session_uuid no registro bruto. |
target_user.email | target.user.email_addresses | O valor é extraído do campo target_user.email no registro bruto. |
target_user.uuid | target.user.userid | O valor é extraído do campo target_user.uuid no registro bruto. |
timestamp | metadata.event_timestamp.seconds, metadata.event_timestamp.nanos | O valor é extraído do campo timestamp no registro bruto e convertido em segundos e nanossegundos. |
tipo | additional.fields.key: type , additional.fields.value.string_value: mfa_ok |
O valor é extraído do campo type no registro bruto. |
user.email | principal.user.email_addresses | O valor é extraído do campo user.email no registro bruto. |
user.name | principal.user.user_display_name | O valor é extraído do campo user.name no registro bruto. |
used_version | additional.fields.key: used_version , additional.fields.value.string_value: 1 |
O valor é extraído do campo used_version no registro bruto. |
uuid | principal.resource.attribute.labels.key: uuid , principal.resource.attribute.labels.value: EPNGUJLHFVHCXMJL5LJQGXTENA |
O valor é extraído do campo uuid no registro bruto. |
vault_uuid | security_result.about.resource.attribute.labels.key: vault_uuid , security_result.about.resource.attribute.labels.value: lddjidoxtrxteclqhubbo3pkyq |
O valor é extraído do campo vault_uuid no registro bruto. |
N/A | extensions.auth | Um objeto vazio é criado para esse campo. |
N/A | metadata.event_type | O valor é definido como USER_LOGIN se category for success ou firewall_reported_success , STATUS_UPDATE se não houver informações do usuário e USER_UNCATEGORIZED caso contrário. |
N/A | metadata.log_type | O valor é definido como ONEPASSWORD . |
N/A | metadata.product_name | O valor é definido como ONEPASSWORD . |
N/A | metadata.vendor_name | O valor é definido como ONEPASSWORD . |
N/A | security_result.action | O valor é definido como ALLOW se category for success ou firewall_reported_success , BLOCK se category for credentials_failed , mfa_failed , modern_version_failed ou firewall_failed , e fica vazio caso contrário. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.