Coletar registros do IAM do Ergon Informatik Airlock
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
- 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 de 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
Instale o agente do Bindplane no seu sistema operacional Windows ou Linux de acordo com as instruções a seguir.
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" /quietAguarde a conclusão da instalação.
Execute o seguinte comando para confirmar a instalação:
sc query observiq-otel-collectorO status do serviço deve ser EM EXECUÇÃO.
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.shAguarde a conclusão da instalação.
Execute o seguinte comando para confirmar a instalação:
sudo systemctl status observiq-otel-collectorO 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.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Editar o arquivo de configuração
Substitua todo o conteúdo de
config.yamlpela 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_iamSubstitua os seguintes marcadores de posição:
Configuração do receptor:
listen_address: defina como0.0.0.0:514para detectar todas as interfaces na porta 51. Para sistemas Linux executados como não raiz, use a porta1514ou 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
- Linux:
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
- EUA:
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,EntereCtrl+X. - Windows: clique em Arquivo > Salvar.
Reinicie o agente do Bindplane para aplicar as mudanças
Para reiniciar o agente do Bindplane no Linux:
Execute este comando:
sudo systemctl restart observiq-otel-collectorVerifique se o serviço está em execução:
sudo systemctl status observiq-otel-collectorVerifique se há erros nos registros:
sudo journalctl -u observiq-otel-collector -f
Para reiniciar o agente do Bindplane em Windows:
Escolha uma das seguintes opções:
Prompt de comando ou PowerShell como administrador:
net stop observiq-otel-collector && net start observiq-otel-collectorConsole de serviços:
- Pressione
Win+R, digiteservices.msce pressione Enter. - Localize o Coletor do OpenTelemetry da observIQ.
- Clique com o botão direito do mouse e selecione Reiniciar.
- Pressione
Verifique se o serviço está em execução:
sc query observiq-otel-collectorVerifique se há erros nos registros:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Configurar o encaminhamento de syslog do Airlock IAM
- Conecte-se ao servidor do Airlock IAM usando SSH ou acesso ao console.
Navegue até o diretório da instância:
cd /opt/airlock/iam/instances/<instance_name>/Edite o arquivo de configuração do Log4j para todos os módulos:
nano log4j/all-modules.xmlAdicione 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>Configure os parâmetros do appender Syslog:
- host: substitua
BINDPLANE_AGENT_IPpelo endereço IP do host do agente do Bindplane (por exemplo,192.168.1.100). - port: defina como
514(ou1514se o agente do Bindplane estiver configurado para uma porta não privilegiada) - protocol: defina como
UDP(ouTCPse você configurou o receptor tcplog no Bindplane) - format: definido como
RFC5424para formato syslog estruturado - facility: defina como
LOCAL1(ou outro código de unidade, conforme necessário:LOCAL0aLOCAL7) - Nível ThresholdFilter: defina como
INFOpara enviar registros de gravidade INFO e superior ouDEBUGpara todos os registros.
- host: substitua
Adicione a referência do appender na seção do logger
<Root>:<Loggers> <Root level="${sys:iam.log.level}"> <AppenderRef ref="SYSLOG"/> </Root> </Loggers>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>Salve o arquivo de configuração:
Pressione
Ctrl+O,EntereCtrl+X.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.
Verifique se os registros estão sendo enviados para o agente do Bindplane:
sudo journalctl -u observiq-otel-collector -fVerifique se os registros estão chegando ao Google SecOps:
- Faça login no console do Google SecOps.
- Acesse SIEM > Pesquisa.
Faça uma consulta de pesquisa:
metadata.log_type = "ERGON_INFORMATIK_AIRLOCK_IAM"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:
No arquivo
config.yamldo agente do Bindplane, mude o receptor paratcplog:receivers: tcplog: listen_address: "0.0.0.0:514"No arquivo
log4j/all-modules.xmldo Airlock IAM, mude o protocolo paraTCP:<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>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:
TRACEDEBUGINFOWARNERRORFATAL
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
Verifique se o agente do Bindplane está recebendo registros:
sudo journalctl -u observiq-otel-collector -fVerifique a conectividade de rede do Airlock IAM com o agente do Bindplane:
telnet BINDPLANE_AGENT_IP 514Verifique se a configuração do Log4j é válida:
cat /opt/airlock/iam/instances/<instance_name>/log4j/all-modules.xmlVerifique se há erros nos registros do Airlock IAM:
tail -f /opt/airlock/iam/instances/<instance_name>/logs/loginapp.log
Erros do agente do Bindplane
Verifique se há erros nos registros do agente do Bindplane:
sudo journalctl -u observiq-otel-collector -n 100Verifique se a sintaxe de
config.yamlestá correta. O YAML é sensível ao recuo.Verifique se o caminho do arquivo de autenticação de ingestão está correto e se o arquivo existe.
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 |
| 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.