Coletar registros do Progress MOVEit Transfer
Neste documento, explicamos como ingerir registros do Progress MOVEit Transfer no Google Security Operations usando o Bindplane.
O Progress MOVEit Transfer é uma solução de transferência de arquivos gerenciada (MFT, na sigla em inglês) que oferece transferências de arquivos seguras e criptografadas usando protocolos como HTTPS, FTPS e SFTP. Ele oferece registros de auditoria à prova de adulteração, controles de acesso baseados em função e suporte à conformidade com regulamentações como HIPAA, PCI DSS e GDPR. O MOVEit Transfer registra todas as atividades de transferência de arquivos, eventos de autenticação de usuários e ações administrativas no banco de dados de auditoria.
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 host Linux com
systemd - Conectividade de rede entre o agente do Bindplane e o servidor do Progress MOVEit Transfer
- Se estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas de acordo com os requisitos do agente do Bindplane.
- Acesso de nível SysAdmin ao console de administração da Web do Progress MOVEit Transfer
- Porta UDP 514 (ou a porta syslog escolhida) aberta do servidor do MOVEit Transfer para o host do agente do BindPlane
Receber credenciais do Google SecOps para o agente do Bindplane
Para autenticar o agente do Bindplane no Google SecOps, escolha um dos seguintes métodos:
- Novas implantações: use a API Chronicle (opção 1).
- Implantações legadas: continue usando o arquivo de autenticação de ingestão (opção 2) até que a API Ingestion seja desativada em 20 de julho de 2027.
Opção 1: criar uma conta de serviço para a API Chronicle (recomendado)
- Faça login no console doGoogle Cloud e selecione o projeto do Google Cloud vinculado à sua instância do Google SecOps.
- Acesse IAM e administrador > Contas de serviço.
- Clique em Criar conta de serviço.
- Informe os seguintes detalhes de configuração:
- Nome da conta de serviço: insira um nome para a conta (por exemplo,
bindplane-ingest). - Descrição da conta de serviço: insira uma descrição (por exemplo,
Bindplane agent log ingestion).
- Nome da conta de serviço: insira um nome para a conta (por exemplo,
- Clique em Criar e continuar.
- Na seção Conceder a essa conta de serviço acesso ao projeto, clique em Selecionar um papel e escolha Editor do Chronicle.
- Clique em Continuar e depois em Concluído.
- Clique na conta de serviço que você criou e acesse a guia Chaves.
- Clique em Adicionar chave > Criar nova chave.
- Selecione JSON e clique em Criar. O download do arquivo de chave é feito no seu computador.
- Salve o arquivo de chave como
ingestion-auth.jsonno diretório do coletor do BindPlane (/opt/observiq-otel-collector/ingestion-auth.jsonno Linux ouC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsonno Windows) ou atualizecreds_file_pathemconfig.yamlpara corresponder ao caminho em que você o salvou. - Acesse IAM e administrador > Configurações e copie o Número do projeto. Você vai precisar dele para configurar o exportador.
Opção 2: fazer o download do arquivo de autenticação de ingestão (legado)
- Faça login no console do Google SecOps.
- Acesse Configurações > Gerenciamento de dados > Agentes de coleta. Se você estiver em uma plataforma somente SIEM, acesse Configurações > Agentes de coleta.
- Faça o download do arquivo de autenticação de ingestão.
- Salve o arquivo com segurança no sistema em que o agente do Bindplane será instalado.
Receber o ID de cliente do Google SecOps
- Faça login no console do Google SecOps.
- Acesse Configurações > Administração > Perfil. Se você estiver em uma plataforma somente SIEM, acesse Configurações > Perfil.
- Copie e salve o ID de 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 serviço precisa aparecer como RUNNING.
Instalação do Linux
- Abra um terminal com privilégios de raiz 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 serviço precisa aparecer como 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 o syslog e enviar ao Google SecOps
Localize o arquivo de configuração.
Linux:
sudo nano /opt/observiq-otel-collector/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/moveit_transfer: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip creds_file_path: '<CREDS_FILE_PATH>' customer_id: '<CUSTOMER_ID>' endpoint: chronicle.googleapis.com log_type: IPSWITCH_MOVEIT_TRANSFER raw_log_field: body ingestion_labels: log_source: moveit_transfer service: pipelines: logs/moveit_to_chronicle: receivers: - udplog exporters: - chronicle/moveit_transfer
Parâmetros de configuração
Substitua os seguintes marcadores de posição.
Configuração do exportador:
<CREDS_FILE_PATH>: caminho completo para o arquivo de chave JSON da conta de serviço (opção 1):- Linux:
/opt/observiq-otel-collector/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
<CUSTOMER_ID>: ID de cliente do Google SecOps copiado anteriormentelocation: substitua<LOCATION>pela região da sua instância do Google SecOps (por exemplo,us,europeouasia-southeast1). O exportador prefixachronicle.googleapis.comcom esse valor. Consulte Endpoints regionais para ver a lista completa.project: substitua<PROJECT_NUMBER>pelo número do projeto em IAM e administrador > Configurações.endpoint: mantenha definido comochronicle.googleapis.com.Exemplo de configuração
receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/moveit_transfer: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: 'a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6' endpoint: chronicle.googleapis.com log_type: IPSWITCH_MOVEIT_TRANSFER raw_log_field: body ingestion_labels: log_source: moveit_transfer service: pipelines: logs/moveit_to_chronicle: receivers: - udplog exporters: - chronicle/moveit_transfer
Exportador da API de ingestão legada
Se você usar o arquivo de autenticação de ingestão da Opção 2, substitua o bloco
exporterspelo seguinte. Definacreds_file_pathcomo o caminho para o arquivo de autenticação de ingestão e, se a instância estiver fora dos EUA, substituamalachiteingestion-pa.googleapis.compelo endpoint regional (por exemplo,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/moveit_transfer: compression: gzip creds_file_path: '<CREDS_FILE_PATH>' customer_id: '<CUSTOMER_ID>' endpoint: malachiteingestion-pa.googleapis.com log_type: IPSWITCH_MOVEIT_TRANSFER raw_log_field: body ingestion_labels: log_source: moveit_transfer
Salve o arquivo de configuração.
Depois de editar, salve o arquivo:
* Linux: pressione Ctrl+O, depois Enter e, em seguida, 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, faça o seguinte:
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 no Windows, faça o seguinte:
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.
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"
- Pressione
Configurar o encaminhamento de syslog do Progress MOVEit Transfer
Para configurar o MOVEit Transfer para encaminhar entradas de registro de auditoria ao agente do Bindplane via syslog:
- Faça login no console de administração da Web do MOVEit Transfer como um usuário com permissões de SysAdmin.
- Acesse CONFIGURAÇÕES > Sistema > Auditoria > Syslog. A página Configure Syslog Settings é exibida.
- Na seção Geração de registros do Syslog, selecione Ativado. Quando ativada, cada entrada de registro de auditoria é enviada ao host de syslog especificado e ao banco de dados de auditoria do MOVEit Transfer.
- No campo Syslog Host, insira o endereço IP ou o nome do host do agente do BindPlane (por exemplo,
192.168.1.100). No campo Porta do Syslog, digite
514. Se esse campo for deixado em branco, ele vai reverter para a porta padrão514.No menu suspenso Syslog Facility, selecione o recurso em que as mensagens do syslog do MOVEit Transfer vão aparecer no host do syslog remoto. O valor padrão é FTP. Os seguintes recursos padrão do syslog estão disponíveis:
- KERN
- USUÁRIO
- DAEMON
- AUTH
- SYSLOG
- LPR
- NOTÍCIAS
- UUCP
- CRON
- AUTHPRIV
- FTP (padrão)
- LOCAL0 a LOCAL7
Clique em Alterar configurações de registro de alterações para salvar a configuração.
Clique em Enviar mensagem de teste do Syslog para enviar uma mensagem de teste ao host do agente do BindPlane especificado. Como a implementação do BSD Syslog é baseada em UDP, verifique manualmente se a mensagem de teste chegou conferindo os registros do agente do BindPlane.
Verifique se a mensagem de teste foi recebida pelo agente do BindPlane:
Linux:
sudo journalctl -u observiq-otel-collector -fWindows:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Requisitos de firewall
Verifique se a seguinte regra de firewall está em vigor para permitir o tráfego de syslog do MOVEit Transfer para o agente do BindPlane:
| Direção | Protocolo | Origem | Destino | Porta |
|---|---|---|---|---|
| Saída do MOVEit Transfer | UDP | IP do servidor do MOVEit Transfer | IP do host do agente do BindPlane | 514 |
Tabela de mapeamento de UDM
| Campo de registro | mapeamento de UDM | Lógica |
|---|---|---|
| column1 | metadata.collected_timestamp | Convertido usando padrões de correspondência de data: d/M/aaaa H:mm:ss A, M/d/aaaa H:mm:ss A, MM/dd/aaaa HH:mm:ss A |
| column1 | metadata.event_timestamp | Convertido usando padrões de correspondência de data: d/M/aaaa H:mm:ss A, M/d/aaaa H:mm:ss A, MM/dd/aaaa HH:mm:ss A |
| column2 | security_result.action_details | Valor copiado diretamente |
| column3 | target.hostname, target.asset.hostname | Valor copiado diretamente da coluna 3 |
| column4 | principal.ip, principal.asset.ip | Extraído da coluna 4 usando o padrão grok para IP |
| column6 | target.file.full_path | Concatenado de folderPath e fileName se ambos estiverem presentes, caso contrário, apenas de fileName |
| column7 | target.file.full_path | |
| column15 | target.file.full_path | |
| column7 | target.user.email_addresses | Mesclado se column2 == file_sentemail |
| column10 | metadata.description | Valor copiado diretamente |
| column11 | metadata.product_event_type | Valor copiado diretamente se não for None |
| column12 | target.ip, target.asset.ip | Extraído da coluna 12 usando o padrão grok para IP |
| column16 | target.file.full_path | Concatenado de folderPath e fileName se ambos estiverem presentes, caso contrário, apenas de fileName |
| column23 | target.file.full_path | |
| column19 | target.user.user_display_name | Valor copiado diretamente se column2 == file_sentemail e column8 == sender, caso contrário, para o usuário de destino |
| event_received_time | metadata.collected_timestamp | Convertido usando padrões de correspondência de data: UNIX_MS, dd/MM/yyyy HH:mm:ss, yyyy-MM-dd HH:mm:ss, MM/dd/yyyy HH:mm:ss A, yyyy/MM/dd HH:mm:ss, RFC 3339, yyyy-MM-ddTHH:mm:ss |
| timestamp | metadata.event_timestamp | Convertido usando padrões de correspondência de data: MMM d HH:mm:ss, MMM dd HH:mm:ss, ISO8601, yyyy-MM-dd HH:mm:ss, yyyy-MM-dd HH:mm:ss Z, MM/dd/yyyy HH:mm:ss A, yy-MM-dd HH:mm:ss, RFC 3339, yyyy-MM-ddTHH:mm:ss |
| prin_ip | principal.ip, principal.asset.ip | Valor copiado diretamente |
| AgentVersion | metadata.product_version | Valor copiado diretamente |
| principal_host | principal.hostname, principal.asset.hostname | Valor copiado diretamente |
| Nome de usuário | principal.user.userid | Valor copiado diretamente |
| company_name | principal.user.company_name | Valor copiado diretamente |
| ID | target.process.pid | Valor copiado diretamente |
| InstID | metadata.product_log_id | Valor copiado diretamente |
| FileID | target.resource.attribute.labels | Mesclado como additional_id_2 com a chave FileID e o valor de FileID |
| FolderID | target.resource.attribute.labels | Mesclado como additional_id_3 com a chave FolderID e o valor de FolderID |
| FolderPath | target.file.full_path | Concatenado de FolderPath e FileName se ambos estiverem presentes, caso contrário, de FolderPath |
| FileName | target.file.full_path | |
| FileName | target.resource.attribute.labels | Mesclado como nome de arquivo com a chave FileName e o valor de FileName |
| host | principal.hostname, principal.asset.hostname | Valor copiado diretamente |
| log_level | security_result.severity | Defina como INFORMATIONAL se for INFO ou DEBUG, ERROR se for ERROR |
| source_module_name | observer.resource.attribute.labels | Mesclado como source_module_label com a chave source_module_name e o valor de source_module_name |
| source_module_type | observer.application | Valor copiado diretamente |
| log_msg | metadata.description | Valor de log_msg se http_method != GET e file_path estiver vazio, caso contrário, log_desc, caso contrário, description, caso contrário, Message |
| log_desc | metadata.description | |
| descrição | metadata.description | |
| Mensagem | metadata.description | |
| porta | principal.port | Valor copiado diretamente, convertido em número inteiro |
| tgtport | target.port | Valor copiado diretamente, convertido em número inteiro |
| pacote | principal.process.command_line | Valor copiado diretamente |
| srcip | principal.ip, principal.asset.ip | Valor copiado diretamente |
| nome de usuário | principal.user.userid | Valor copiado diretamente |
| versão | metadata.product_version | Valor copiado diretamente |
| http_method | network.http.method | Valor copiado diretamente |
| ação | security_result.action_details | Valor copiado diretamente |
| resumo | security_result.summary | Valor copiado diretamente |
| security_result | security_result | Mesclado diretamente |
| tgtip | target.ip, target.asset.ip | Valor copiado diretamente |
| application_proto | network.application_protocol | Em maiúsculas e copiado diretamente |
| url | network.http.referral_url | Valor copiado diretamente |
| status_code | network.http.response_code | Valor copiado diretamente, convertido em número inteiro |
| file_path | principal.process.file.full_path | Valor copiado diretamente |
| file_size | principal.process.file.size | Convertido para uinteger se não for 0 |
| process_id | principal.process.pid | Valor copiado diretamente |
| session_id | network.session_id | Valor copiado diretamente |
| task_id | additional.fields | Mesclado como additional_field com a chave TASK_ID e string_value de task_id |
| AgentBrand | metadata.product_event_type | Valor copiado diretamente |
| Parm1 | additional.fields | Mesclado como additional_field_3 com a chave Parm1 e string_value de Parm1 |
| Parm2 | additional.fields | Mesclado como additional_field_4 com a chave Parm2 e string_value de Parm2 |
| Erro | additional.fields | Mesclado como additional_field_5 com a chave Error e string_value de Error |
| XFerSize | target.resource.attribute.labels | Mesclado como additional_field_1 com a chave XFerSize e o valor de XFerSize |
| FolderPath | metadata.event_type | Defina como FILE_DELETION se FolderPath e action_performed corresponderem a Delete File, NETWORK_HTTP se tgtip ou host e application_proto == HTTP, USER_LOGIN se Username ou username, STATUS_UPDATE se tgtip ou host ou principal_host ou IPAddress, caso contrário, GENERIC_EVENT |
| tgtip | metadata.event_type | |
| host | metadata.event_type | |
| principal_host | metadata.event_type | |
| IPAddress | metadata.event_type | |
| Nome de usuário | metadata.event_type | |
| nome de usuário | metadata.event_type | |
| tgtip | metadata.event_type | Defina como USER_LOGIN se column2 == sec_signon e tgtip ou tar_host, USER_LOGOUT se sec_signoff e tgtip ou tar_host, FILE_UNCATEGORIZED se folder_add, FILE_CREATION se file_upload ou download e tgtip e is_tgt_file_present, FILE_DELETION se file_delete e srcip e is_tgt_file_present, FILE_MODIFICATION se file_rename, FILE_UNCATEGORIZED se file_dlhashchk, EMAIL_TRANSACTION se file_sentemail e useremail, STATUS_UPDATE se srcip, caso contrário, GENERIC_EVENT |
| tar_host | metadata.event_type | |
| srcip | metadata.event_type | |
| is_tgt_file_present | metadata.event_type | |
| column2 | metadata.event_type | |
| useremail | metadata.event_type | |
| security_result | metadata.event_type | |
| extensions.auth.type | extensions.auth.type | Defina como MACHINE para eventos de login/logout. |
| metadata.vendor_name | metadata.vendor_name | Defina como "IPS". |
| metadata.product_name | metadata.product_name | Defina como "IPSWITCH MOVEIT TRANSFER" |
target_application |
event.idm.read_only_udm.target.application |
Mapeado do registro de alterações |
product_event |
event.idm.read_only_udm.metadata.product_event_type |
Mapeado do registro de alterações |
dstip |
event.idm.read_only_udm.target.ip e event.idm.read_only_udm.target.asset.ip |
Mapeado do registro de alterações |
AdminTrust |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de alterações |
Permission |
event.idm.read_only_udm.additional.fields |
Mapeado do registro de alterações |
log_status |
event.idm.read_only_udm.security_result.action.details |
Mapeado do registro de alterações |
srcip |
event.idm.read_only_udm.principal.ip e event.idm.read_only_udm.principal.asset.ip |
Mapeado do registro de alterações |
EventReceivedTime |
event.timestamp |
Mapeado do registro de alterações |
SourceModuleName |
observer.resource.attribute.labels |
Mapeado do registro de alterações |
SourceModuleType |
observer.application |
Mapeado do registro de alterações |
SourceName |
metadata.product_event_type |
Mapeado do registro de alterações |
Severity |
security_result. |
Mapeado do registro de alterações |
Hostname |
principal.hostname |
Mapeado do registro de alterações |
Channel |
security_result.about.resource.attribute.labels |
Mapeado do registro de alterações |
AgentVersion |
metadata.version |
Mapeado do registro de alterações |
Registro de alterações
Confira o registro de alterações deste analisador
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.