Coletar registros do IAM do Ergon Informatik Airlock

Compatível com:

Este documento explica como ingerir registros do IAM do Ergon Informatik Airlock no Google Security Operations usando o agente do Bindplane.

O Airlock IAM é uma solução de gerenciamento de identidade e acesso que oferece recursos de autenticação, autorização e autoatendimento do usuário. Ele gera registros JSON estruturados para eventos de autenticação, atividades de rastreamento do usuário, registros de auditoria e ações administrativas nos módulos Loginapp, Adminapp, aprovação de transações, contêiner de serviço e serviço de política de API.

Antes de começar

Verifique se você tem os pré-requisitos a seguir:

  • Uma instância do Google SecOps
  • Windows Server 2016 ou mais recente ou um host Linux com systemd
  • Conectividade de rede entre o agente do Bindplane e o servidor do Airlock IAM
  • Se você estiver executando um proxy, verifique se as portas do firewall estão abertas de acordo com os requisitos do agente do Bindplane.
  • Acesso administrativo à instância do IAM do Airlock
  • Acesso por SSH ou console ao servidor IAM do Airlock para editar arquivos de configuração

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 de 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

Instale o agente do Bindplane no seu sistema operacional Windows ou Linux de acordo com as instruções a seguir.

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
    
  3. Aguarde a conclusão da instalação.

  4. Execute o seguinte comando para confirmar a instalação:

    sc query observiq-otel-collector
    

    O status do serviço deve ser EM EXECUÇÃO.

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
    
  3. Aguarde a conclusão da instalação.

  4. Execute o seguinte comando para confirmar a instalação:

    sudo systemctl status observiq-otel-collector
    

    O status do serviço precisa ser active (running).

Outros recursos de instalação

Para mais opções de instalação e solução de problemas, consulte o guia de instalação do agente do Bindplane.

Configurar o agente do Bindplane para ingerir syslog e enviar ao Google SecOps

Localizar o arquivo de configuração

  • Linux:

    sudo nano /etc/bindplane-agent/config.yaml
    
  • Windows:

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

Editar o arquivo de configuração

  1. Substitua todo o conteúdo de config.yaml pela seguinte configuração:

    receivers:
        udplog:
            listen_address: "0.0.0.0:514"
    
    exporters:
        chronicle/airlock_iam:
            compression: gzip
            creds_file_path: '/etc/bindplane-agent/ingestion-auth.json'
            customer_id: 'YOUR_CUSTOMER_ID'
            endpoint: malachiteingestion-pa.googleapis.com
            log_type: ERGON_INFORMATIK_AIRLOCK_IAM
            raw_log_field: body
            ingestion_labels:
                env: production
                source: airlock_iam
    
    service:
        pipelines:
            logs/airlock_to_chronicle:
                receivers:
                    - udplog
                exporters:
                    - chronicle/airlock_iam
    
  2. Substitua os seguintes marcadores de posição:

    • Configuração do receptor:

      • listen_address: defina como 0.0.0.0:514 para detectar todas as interfaces na porta 51. Para sistemas Linux executados como não raiz, use a porta 1514 ou superior.
    • Configuração do exportador:

      • creds_file_path: caminho completo para o arquivo de autenticação de ingestão:

        • Linux: /etc/bindplane-agent/ingestion-auth.json
        • Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
      • YOUR_CUSTOMER_ID: substitua pelo ID do cliente do Google SecOps da etapa anterior.

      • endpoint: URL do endpoint regional:

        • EUA: malachiteingestion-pa.googleapis.com
        • Europa: europe-malachiteingestion-pa.googleapis.com
        • Ásia: asia-southeast1-malachiteingestion-pa.googleapis.com
      • ingestion_labels: rótulos opcionais para categorizar registros (modifique conforme necessário)

Exemplo de configuração para Windows

  • receivers:
        udplog:
            listen_address: "0.0.0.0:514"
    
    exporters:
        chronicle/airlock_iam:
            compression: gzip
            creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json'
            customer_id: 'a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6'
            endpoint: malachiteingestion-pa.googleapis.com
            log_type: ERGON_INFORMATIK_AIRLOCK_IAM
            raw_log_field: body
            ingestion_labels:
                env: production
                source: airlock_iam
    
    service:
        pipelines:
            logs/airlock_to_chronicle:
                receivers:
                    - udplog
                exporters:
                    - chronicle/airlock_iam
    

Salve o arquivo de configuração.

Depois de editar, salve o arquivo:

  • Linux: pressione Ctrl+O, Enter e Ctrl+X.
  • Windows: clique em Arquivo > Salvar.

Reinicie o agente do Bindplane para aplicar as mudanças

  • Para reiniciar o agente do Bindplane no Linux:

    1. Execute este comando:

      sudo systemctl restart observiq-otel-collector
      
    2. Verifique se o serviço está em execução:

      sudo systemctl status observiq-otel-collector
      
    3. Verifique se há erros nos registros:

      sudo journalctl -u observiq-otel-collector -f
      
  • Para reiniciar o agente do Bindplane em Windows:

    1. Escolha uma das seguintes opções:

      • Prompt de comando ou PowerShell como administrador:

        net stop observiq-otel-collector && net start observiq-otel-collector
        
      • Console de serviços:

        1. Pressione Win+R, digite services.msc e pressione Enter.
        2. Localize o Coletor do OpenTelemetry da observIQ.
        3. Clique com o botão direito do mouse e selecione Reiniciar.
    2. Verifique se o serviço está em execução:

      sc query observiq-otel-collector
      
    3. Verifique se há erros nos registros:

      type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
      

Configurar o encaminhamento de syslog do Airlock IAM

  1. Conecte-se ao servidor do Airlock IAM usando SSH ou acesso ao console.
  2. Navegue até o diretório da instância:

    cd /opt/airlock/iam/instances/<instance_name>/
    
  3. Edite o arquivo de configuração do Log4j para todos os módulos:

    nano log4j/all-modules.xml
    
  4. Adicione a configuração do appender Syslog na seção <Appenders>:

    <Syslog name="SYSLOG" 
            facility="LOCAL1" 
            host="BINDPLANE_AGENT_IP" 
            port="514" 
            protocol="UDP" 
            format="RFC5424" 
            includeMDC="true" 
            mdcId="mdc" 
            newLine="true">
        <ExceptionPattern>%ex{full}</ExceptionPattern>
        <ThresholdFilter level="INFO"/>
    </Syslog>
    
  5. Configure os parâmetros do appender Syslog:

    • host: substitua BINDPLANE_AGENT_IP pelo endereço IP do host do agente do Bindplane (por exemplo, 192.168.1.100).
    • port: defina como 514 (ou 1514 se o agente do Bindplane estiver configurado para uma porta não privilegiada)
    • protocol: defina como UDP (ou TCP se você configurou o receptor tcplog no Bindplane)
    • format: definido como RFC5424 para formato syslog estruturado
    • facility: defina como LOCAL1 (ou outro código de unidade, conforme necessário: LOCAL0 a LOCAL7)
    • Nível ThresholdFilter: defina como INFO para enviar registros de gravidade INFO e superior ou DEBUG para todos os registros.
  6. Adicione a referência do appender na seção do logger <Root>:

    <Loggers>
      <Root level="${sys:iam.log.level}">
        <AppenderRef ref="SYSLOG"/>
      </Root>
    </Loggers>
    
  7. Exemplo de configuração completa:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration name="Custom Log4j 2 Configuration for All IAM Modules">
      <Appenders>
        <Syslog name="SYSLOG" 
                facility="LOCAL1" 
                host="192.168.1.100" 
                port="514" 
                protocol="UDP" 
                format="RFC5424" 
                includeMDC="true" 
                mdcId="mdc" 
                newLine="true">
          <ExceptionPattern>%ex{full}</ExceptionPattern>
          <ThresholdFilter level="INFO"/>
        </Syslog>
      </Appenders>
      <Loggers>
        <Root level="${sys:iam.log.level}">
          <AppenderRef ref="SYSLOG"/>
        </Root>
      </Loggers>
    </Configuration>
    
  8. Salve o arquivo de configuração:

    Pressione Ctrl+O, Enter e Ctrl+X.

  9. Por padrão, a configuração do Log4j é monitorada a cada 60 segundos em busca de mudanças. O novo encaminhamento de syslog será ativado automaticamente sem precisar de reinicialização.

  10. Verifique se os registros estão sendo enviados para o agente do Bindplane:

    sudo journalctl -u observiq-otel-collector -f
    
  11. Verifique se os registros estão chegando ao Google SecOps:

    1. Faça login no console do Google SecOps.
    2. Acesse SIEM > Pesquisa.
    3. Faça uma consulta de pesquisa:

      metadata.log_type = "ERGON_INFORMATIK_AIRLOCK_IAM"
      
    4. Verifique se os registros do Airlock IAM aparecem nos resultados da pesquisa.

Outras opções de configuração

Configurar o syslog TCP em vez do UDP

Se você preferir a entrega TCP em vez de UDP:

  1. No arquivo config.yaml do agente do Bindplane, mude o receptor para tcplog:

    receivers:
      tcplog:
        listen_address: "0.0.0.0:514"
    
  2. No arquivo log4j/all-modules.xml do Airlock IAM, mude o protocolo para TCP:

    <Syslog name="SYSLOG" 
            facility="LOCAL1" 
            host="192.168.1.100" 
            port="514" 
            protocol="TCP" 
            format="RFC5424" 
            includeMDC="true" 
            mdcId="mdc" 
            newLine="true">
      <ExceptionPattern>%ex{full}</ExceptionPattern>
      <ThresholdFilter level="INFO"/>
    </Syslog>
    
  3. Reinicie o agente do Bindplane para aplicar a mudança do receptor.

Configurar diferentes níveis de registro

  • Para enviar apenas registros de gravidade "AVISO" e superior:

    <ThresholdFilter level="WARN"/>
    
  • Para enviar todos os registros, incluindo DEBUG:

    <ThresholdFilter level="DEBUG"/>
    

Níveis de registro disponíveis, do menor para o maior nível de gravidade:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

Configurar várias instâncias do Airlock IAM

  • Se você tiver várias instâncias do Airlock IAM enviando para o mesmo agente do Bindplane, use rótulos de ingestão para diferenciá-las:

    exporters:
        chronicle/airlock_iam_prod:
            compression: gzip
            creds_file_path: '/etc/bindplane-agent/ingestion-auth.json'
            customer_id: 'YOUR_CUSTOMER_ID'
            endpoint: malachiteingestion-pa.googleapis.com
            log_type: ERGON_INFORMATIK_AIRLOCK_IAM
            raw_log_field: body
            ingestion_labels:
                env: production
                instance: prod-iam-01
    
        chronicle/airlock_iam_dev:
            compression: gzip
            creds_file_path: '/etc/bindplane-agent/ingestion-auth.json'
            customer_id: 'YOUR_CUSTOMER_ID'
            endpoint: malachiteingestion-pa.googleapis.com
            log_type: ERGON_INFORMATIK_AIRLOCK_IAM
            raw_log_field: body
            ingestion_labels:
                env: development
                instance: dev-iam-01
    
    service:
        pipelines:
            logs/airlock_prod:
                receivers:
                    - udplog
                exporters:
                    - chronicle/airlock_iam_prod
    
            logs/airlock_dev:
                receivers:
                    - udplog
                exporters:
                    - chronicle/airlock_iam_dev
    

Solução de problemas

Os registros não aparecem no Google SecOps

  1. Verifique se o agente do Bindplane está recebendo registros:

    sudo journalctl -u observiq-otel-collector -f
    
  2. Verifique a conectividade de rede do Airlock IAM com o agente do Bindplane:

    telnet BINDPLANE_AGENT_IP 514
    
  3. Verifique se a configuração do Log4j é válida:

    cat /opt/airlock/iam/instances/<instance_name>/log4j/all-modules.xml
    
  4. Verifique se há erros nos registros do Airlock IAM:

    tail -f /opt/airlock/iam/instances/<instance_name>/logs/loginapp.log
    

Erros do agente do Bindplane

  1. Verifique se há erros nos registros do agente do Bindplane:

    sudo journalctl -u observiq-otel-collector -n 100
    
  2. Verifique se a sintaxe de config.yaml está correta. O YAML é sensível ao recuo.

  3. Verifique se o caminho do arquivo de autenticação de ingestão está correto e se o arquivo existe.

  4. Teste a conectividade de rede com o endpoint do Google SecOps:

    curl -v https://malachiteingestion-pa.googleapis.com
    

Configuração do firewall

Verifique se as seguintes regras de firewall estão configuradas:

Entrada para o agente do Bindplane:

  • Protocolo: UDP (ou TCP se estiver usando tcplog)
  • Porta: 514 (ou a porta configurada)
  • Origem: endereço IP do servidor Airlock IAM

Saída do agente do Bindplane:

  • Protocolo: HTTPS (TCP 443)
  • Destino: endpoint regional do Google SecOps
  • Finalidade: entrega de registros ao Google SecOps.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
expire_time additional.fields Unido como rótulo com a chave "expire_time" se não estiver vazio
dispositivo móvel additional.fields Unido como rótulo com a chave "mobile" se não estiver vazio
sn additional.fields Unido como rótulo com a chave "sn" se não estiver vazio
CONFIG_CONTEXT additional.fields Unido como rótulo com a chave "CONFIG_CONTEXT" se não estiver vazio
departamento additional.fields Unido como rótulo com a chave "department" se não estiver vazio
ctxData additional.fields Unido como rótulo com a chave "ctxData" se não estiver vazio
displayLanguage additional.fields Unido como rótulo com a chave "displayLanguage" se não estiver vazio
nrPwdTrialsForUserDeletion additional.fields Mesclado como rótulo com a chave "nrPwdTrialsForUserDeletion" se não estiver vazio
authInstant additional.fields Unido como rótulo com a chave "authInstant" se não estiver vazio
auditToken additional.fields Mesclado como rótulo com a chave "auditToken" se não estiver vazio
authPlugin additional.fields Unido como rótulo com a chave "authPlugin" se não estiver vazio
latestIdPropagation additional.fields Unido como rótulo com a chave "latestIdPropagation" se não estiver vazio
serviço additional.fields Unido como rótulo com a chave "service" se não estiver vazio
ldap_type additional.fields Unido como rótulo com a chave "ldap_type" se não estiver vazio
report_message additional.fields Unido como rótulo com a chave "report_message" se não estiver vazio
authenteeProvidedId additional.fields Unido como rótulo com a chave "authenteeProvidedId" se não estiver vazio
representerId additional.fields Unido como rótulo com a chave "representerId" se não estiver vazio
de consulta additional.fields Unido como rótulo com a chave "engine" se não estiver vazio
canal additional.fields Unido como rótulo com a chave "channel" se não estiver vazio
authnFactor additional.fields Unido como rótulo com a chave "authnFactor" se não estiver vazio
authnFactorDetail additional.fields Unido como rótulo com a chave "authnFactorDetail" se não estiver vazio
required_roles additional.fields Unido como rótulo com a chave "required_roles" se não estiver vazio
target_pattern additional.fields Unido como rótulo com a chave "target_pattern" se não estiver vazio
nameid additional.fields Mesclado como rótulo com a chave "nameid" se não estiver vazio
plugin_name additional.fields Unido como rótulo com a chave "plugin_name" se não estiver vazio
mecanismo additional.fields Unido como rótulo com a chave "mechanism" se não estiver vazio
new_session_id additional.fields Unido como rótulo com a chave "new_session_id" se não estiver vazio
former_session_id additional.fields Unido como rótulo com a chave "former_session_id" se não estiver vazio
req_id additional.fields Unido como rótulo com a chave "req_id" se não estiver vazio
auth_method additional.fields Mesclado como rótulo com a chave "auth_method" se não estiver vazio
otp additional.fields Unido como rótulo com a chave "otp" se não estiver vazio
mob_num additional.fields Unido como rótulo com a chave "mob_num" se não estiver vazio
jsessionid additional.fields Mesclado como rótulo com a chave "jsessionid" se não estiver vazio
creationDate additional.fields Unido como rótulo com a chave "creationDate" se não estiver vazio
lastLogin additional.fields Unido como rótulo com a chave "lastLogin" se não estiver vazio
accountStatus additional.fields Unido como rótulo com a chave "accountStatus" se não estiver vazio
companyAdministrator additional.fields Unido como rótulo com a chave "companyAdministrator" se não estiver vazio
companyCustomer additional.fields Unido como rótulo com a chave "companyCustomer" se não estiver vazio
privateCustomer additional.fields Unido como rótulo com a chave "privateCustomer" se não estiver vazio
otpNotifyChannel additional.fields Unido como rótulo com a chave "otpNotifyChannel" se não estiver vazio
nas_identifier additional.fields Unido como rótulo com a chave "nas_identifier" se não estiver vazio
session_id additional.fields Unido como rótulo com a chave "session_id" se não estiver vazio
authPluginClassName extensions.auth.auth_details Valor copiado diretamente, se presente
authenticator_type extensions.auth.auth_details O valor será copiado diretamente se estiver presente e authPluginClassName estiver vazio.
logon_type extensions.auth.mechanism Valor copiado diretamente
N/A intermediário Mesclado de um objeto intermediário
FORWARD_LOCATION intermediary.url Valor copiado diretamente
metadata_description metadata.description Valor copiado diretamente
N/A metadata.event_type Definido com base no contexto do evento e determinado pela lógica do analisador.
REQUEST_ID metadata.product_log_id Valor copiado diretamente
airlock_version metadata.product_version Valor copiado diretamente
método network.http.method Valor copiado diretamente
user_agent network.http.user_agent Valor copiado diretamente
packet_size network.received_packets Valor convertido em número inteiro
GSID network.session_id Valor copiado diretamente
host principal.hostname Valor copiado diretamente
CLIENT_IP principal.ip Valor copiado diretamente
UID principal.user.userid Valor copiado diretamente
role_name role.name Valor copiado diretamente
authenteeType role.type Valor copiado diretamente
N/A security_result Combinado do objeto security_result
ação security_result.action_details Valor copiado diretamente, se presente
authMethodShortDesc security_result.action_details Valor mesclado se presente
action_detail security_result.action_details Valor mesclado se presente
category_value security_result.category Valor copiado diretamente
actionGroup security_result.category_details Valor copiado diretamente
result_description security_result.description Valor copiado diretamente
exception security_result.summary Valor copiado diretamente, se presente
STATLOG security_result.summary O valor é copiado diretamente se estiver presente e a exceção estiver vazia.
mob_num src.asset.type Valor copiado diretamente
carta src.email Valor copiado diretamente, se presente
e-mail src.email O valor é copiado diretamente se estiver presente e o e-mail estiver vazio
src_ip src.ip Valor copiado diretamente
src_port src.port Valor convertido em número inteiro
papel src.user.attribute.roles Valor copiado diretamente
empresa src.user.company_name Valor copiado diretamente
firstName src.user.first_name Valor copiado diretamente
lastName src.user.last_name Valor copiado diretamente
status src.user.user_authentication_status Valor copiado diretamente
displayName src.user.user_display_name Valor copiado diretamente, se presente
nome de usuário src.user.user_display_name O valor é copiado diretamente se estiver presente e displayName estiver vazio.
src_user src.user.user_display_name O valor é copiado diretamente se estiver presente e displayName/username estiverem vazios
authenteeId src.user.userid Valor copiado diretamente, se presente
src_userid src.user.userid O valor será copiado diretamente se estiver presente e o authenteeId estiver vazio.
UID src.user.userid O valor será copiado diretamente se estiver presente e authenteeId/src_userid estiverem vazios
file_path target.file.full_path Valor copiado diretamente
target_hostname target.hostname Valor copiado diretamente
target_port target.port Valor convertido em número inteiro
task_name target.resource.name Valor copiado diretamente
target_url target.url Valor copiado diretamente
N/A metadata.product_name Definido como "Ergon Informatik Airlock IAM".
N/A metadata.vendor_name Definido como "Ergon Informatik"

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