Coletar registros do 1Password

Compatível com:

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

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Agentes de coleta.
  3. 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

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Perfil.
  3. Copie e salve o ID do cliente na seção Detalhes da organização.

Instalar o agente do Bindplane

Instalação do Windows

  1. Abra o Prompt de Comando ou o PowerShell como administrador.
  2. Execute este comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Instalação do Linux

  1. Abra um terminal com privilégios de root ou sudo.
  2. 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

  1. 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).
  2. 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
    
  3. Substitua a porta e o endereço IP conforme necessário na sua infraestrutura.

  4. Substitua <customer_id> pelo ID do cliente real.

  5. 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

  1. Faça login na UI da Web do 1Password.
  2. Acesse Integrações.
  3. Clique em Diretório na parte de cima da página.
  4. Digite um nome para o token e defina a expiração dele.
  5. Em Relatórios de eventos, clique em Outros.
  6. Selecione os Tipos de evento correspondentes.
  7. Clique em Emitir token para gerar a chave do token de acesso.
  8. Clique em Salvar no 1Password e selecione em qual cofre salvar o token.
  9. 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.