Coletar registros do CASB do Symantec CloudSOC
Este documento explica como ingerir registros do Symantec CloudSOC no
Google Security Operations usando o Bindplane. O analisador extrai registros do syslog ou de mensagens formatadas em JSON. Ele realiza várias operações importantes: analisar o campo de mensagem, converter a mensagem para JSON, se necessário, extrair campos, mapeá-los para o Modelo de Dados Unificado (UDM) e enriquecer o evento com contexto adicional, como carimbos de data/hora e detalhes do resultado de segurança. O analisador também processa vários formatos de registro e realiza ações específicas com base no campo activity_type
para categorizar o evento corretamente.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Instância do Google SecOps
- Windows 2016 ou mais recente ou um host Linux com
systemd
- Se estiver executando por trás de um proxy, as portas do firewall estarão abertas.
- Acesso privilegiado ao Symantec CloudSOC
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: 'SYMANTEC_CASB' 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
Configurar o Syslog no CASB da Symantec
- Faça login no host do Symantec CloudSOC.
Execute o comando a seguir para identificar qual registrador o sistema usa:
ls –d /etc/*syslog*
Acesse a seção correspondente, de acordo com a resposta do comando anterior:
- syslog.conf: Syslog legado.
- syslog-ng.conf: Syslog-ng.
Configuração legada do Syslog
Abra o arquivo
syslogd
, normalmente localizado no diretório/etc/default
, usando o editorvi
.vi /etc/default/syslogd
Verifique se o valor
SYSLOGD
contém a flag-r
.SYSLOGD="-r"
Salve o arquivo e saia do editor:
- Mude para o modo de comando pressionando a tecla Esc.
- Pressione
:
(dois-pontos) para abrir a barra de comandos. - Digite
wq
depois dos dois-pontos e pressione Enter.
Abra o arquivo
services
, geralmente localizado no diretório/etc
, usando o editorvi
.vi /etc/services
Edite o valor da porta do serviço syslog:
syslog 514/udp
Salve o arquivo e saia do editor:
- Mude para o modo de comando pressionando a tecla Esc.
- Pressione
:
(dois-pontos) para abrir a barra de comandos. - Digite
wq
depois dos dois-pontos e pressione Enter.
Abra o arquivo
syslog.conf
, geralmente localizado no diretório/etc
, usando o editorvi
.vi /etc/syslog.conf
Atualize a configuração para encaminhar todos os registros ao Google SecOps.
*.* @bindplane_agent_host
Salve o arquivo e saia do editor:
- Mude para o modo de comando pressionando a tecla Esc.
- Pressione
:
(dois-pontos) para abrir a barra de comandos. - Digite
wq
depois dos dois-pontos e pressione Enter.
Abra o arquivo
hosts
, geralmente localizado no diretório/etc
, usando o editorvi
.vi /etc/hosts
Crie uma entrada DNS local para
bindplane_agent_host
.0.0.0.0 bindplane_agent_host
Salve o arquivo e saia do editor:
- Mude para o modo de comando pressionando a tecla Esc.
- Pressione
:
(dois-pontos) para abrir a barra de comandos. - Digite
wq
depois dos dois-pontos e pressione Enter.
Reinicie o serviço de daemon syslog.
Configuração do Syslog-ng
Abra o arquivo
syslog-ng.conf
, geralmente localizado no diretório/etc
, usando o editorvi
.vi /etc/syslog-ng.conf
Adicione o seguinte código ao final do arquivo:
destination d____ { udp("bindplane_agent_host" port(514));}; log {source(s_src); destination(d____);};
Abra o arquivo
hosts
, geralmente localizado no diretório/etc
, usando o editorvi
.vi /etc/hosts
Crie uma entrada DNS local para
bindplane_agent_host
.0.0.0.0 bindplane_agent_host
Salve o arquivo e saia do editor:
- Mude para o modo de comando pressionando a tecla Esc.
- Pressione
:
(dois-pontos) para abrir a barra de comandos. - Digite
wq
depois dos dois-pontos e pressione Enter.
Reinicie o serviço de daemon syslog-ng.
Tabela de mapeamento da UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
_domain |
target.hostname |
O valor do campo _domain |
_domain |
target.asset.hostname |
O valor do campo _domain |
_id |
metadata.product_log_id |
O valor do campo _id |
actions_taken |
security_result.detection_fields[].value |
O valor do campo actions_taken . A chave é gerada dinamicamente como Action_ + índice. |
activity_type |
metadata.product_event_type |
O valor do campo activity_type se product_data.activity_type estiver vazio ou o valor de product_data.activity_type se não estiver vazio. |
collector_device_ip |
principal.ip |
O valor do campo collector_device_ip , se não for Unknown IP . |
collector_device_ip |
principal.asset.ip |
O valor do campo collector_device_ip , se não for Unknown IP . |
collector_device_name |
principal.hostname |
O valor do campo collector_device_name . |
collector_device_name |
principal.asset.hostname |
O valor do campo collector_device_name . |
content_checks.dlp.raw_response.contentdetails[].contentBlockId |
security_result.detection_fields[].value |
O valor de content_checks.dlp.raw_response.contentdetails[].contentBlockId . A chave é gerada dinamicamente como contentBlockId_ + índice. |
content_checks.dlp.raw_response.contentdetails[].topLevelFileType |
security_result.detection_fields[].value |
O valor de content_checks.dlp.raw_response.contentdetails[].topLevelFileType . A chave é gerada dinamicamente como topLevelFileType_ + índice. |
content_checks.dlp.raw_response.requestid |
security_result.detection_fields[].value |
O valor de content_checks.dlp.raw_response.requestid . A chave é Request ID . |
content_checks.dlp.raw_response.responseaction |
security_result.detection_fields[].value |
O valor de content_checks.dlp.raw_response.responseaction . A chave é Response Action . |
content_checks.dlp.raw_response.violation[].name |
security_result.detection_fields[].value |
O valor de content_checks.dlp.raw_response.violation[].name . A chave é gerada dinamicamente como Violation_Policy_Name_ + índice. |
content_checks.dlp.raw_response.violation[].policyId |
security_result.detection_fields[].value |
O valor de content_checks.dlp.raw_response.violation[].policyId . A chave é gerada dinamicamente como Violation_Policy_ID_ + índice. |
content_checks.dlp.updated_timestamp |
additional.fields[].value.string_value |
O valor de content_checks.dlp.updated_timestamp . A chave é Updated TimeStamp . |
content_checks.filename |
target.file.full_path |
O valor de content_checks.filename . |
content_checks.mimetype |
target.file.mime_type |
O valor de content_checks.mimetype . |
content_checks.risktype_list[] |
security_result.detection_fields[].value |
O valor de content_checks.risktype_list[] . A chave é gerada dinamicamente como RiskType_ + índice. |
content_checks.vba_macros.expressions[].values[].key |
security_result.detection_fields[].key |
O valor de content_checks.vba_macros.expressions[].values[].key concatenado com índices. |
content_checks.vba_macros.expressions[].values[].value |
security_result.detection_fields[].value |
O valor de content_checks.vba_macros.expressions[].values[].value . |
content_checks.vk_content_iq_violations[] |
security_result.detection_fields[].value |
O valor de content_checks.vk_content_iq_violations[] . A chave é gerada dinamicamente como content_violation_ + índice. |
content_checks.vk_dlp_policy_violations[] |
security_result.detection_fields[].value |
O valor de content_checks.vk_dlp_policy_violations[] . A chave é gerada dinamicamente como dlp_policy_violation_ + índice. |
content_checks.vk_encryption |
security_result.detection_fields[].value |
O valor de content_checks.vk_encryption . A chave é vk_encryption . |
content_checks.vk_glba |
security_result.detection_fields[].value |
O valor de content_checks.vk_glba . A chave é vk_glba . |
content_checks.vk_hipaa |
security_result.detection_fields[].value |
O valor de content_checks.vk_hipaa . A chave é vk_hipaa . |
content_checks.vk_pci |
security_result.detection_fields[].value |
O valor de content_checks.vk_pci . A chave é vk_pci . |
content_checks.vk_pii |
security_result.detection_fields[].value |
O valor de content_checks.vk_pii . A chave é vk_pii . |
content_checks.vk_source_code |
security_result.detection_fields[].value |
O valor de content_checks.vk_source_code . A chave é vk_source_code . |
content_checks.vk_vba_macros |
security_result.detection_fields[].value |
O valor de content_checks.vk_vba_macros . A chave é vk_vba_macros . |
content_checks.vk_virus |
security_result.detection_fields[].value |
O valor de content_checks.vk_virus . A chave é vk_virus . |
content_checks.violations |
security_result.detection_fields[].value |
O valor de content_checks.violations . A chave é violations . |
created_timestamp |
additional.fields[].value.string_value |
O valor de created_timestamp . A chave é Created TimeStamp . |
date |
metadata.event_timestamp.seconds |
Segundos da época extraídos do campo date . |
device_ip |
target.ip |
O valor do campo device_ip , se não for Unknown IP . |
device_ip |
target.asset.ip |
O valor do campo device_ip , se não for Unknown IP . |
file_size |
target.file.size |
O valor de file_size ou product_data.file_size se o primeiro estiver vazio. Convertido para número inteiro sem sinal. |
file_url |
target.file.full_path |
O valor de product_data.file_url . |
group_name |
target.group.group_display_name |
O nome de exibição extraído do campo group_name . |
hosts[] |
principal.ip |
Os valores do campo hosts , separados por vírgula. |
inserted_timestamp |
additional.fields[].value.string_value |
O valor de inserted_timestamp . A chave é Inserted TimeStamp . |
instance |
principal.hostname |
O primeiro valor do campo instance se for uma matriz ou o valor do campo instance se for uma string. |
instance |
principal.asset.hostname |
O primeiro valor do campo instance se for uma matriz ou o valor do campo instance se for uma string. |
ioi_code |
security_result.summary |
O valor do campo ioi_code . |
_latency |
security_result.detection_fields[].value |
O valor do campo _latency . A chave é Latency . |
locations |
security_result.detection_fields[].value |
O valor do campo locations . A chave é Locations . |
log_name |
intermediary.asset.asset_id |
O ID do registro extraído do campo log_name , com o prefixo logid: . |
mailbox_owner |
target.user.userid |
O valor de product_data.mailbox owner . |
metadata.log_type |
metadata.log_type |
Fixado no código como SYMANTEC_CASB . |
metadata.product_name |
metadata.product_name |
Fixado no código como SYMANTEC_CASB . |
metadata.vendor_name |
metadata.vendor_name |
Fixado no código como SYMANTEC . |
msg |
metadata.description |
O valor do campo msg ou do campo message se msg não estiver presente. |
name |
security_result.detection_fields[].value |
O valor do campo name . A chave é Name . |
object_name |
security_result.detection_fields[].value |
O valor do campo object_name . A chave é Object Name . |
object_type |
target.resource.name |
O valor do campo object_type . |
org_unit |
security_result.detection_fields[].value |
O valor do campo org_unit . A chave é org_unit ID . |
policy_action |
security_result.action_details |
O valor do campo policy_action . |
policy_type |
security_result.detection_fields[].value |
O valor do campo policy_type . A chave é policy_type . |
policy_violated |
security_result.detection_fields[].value |
O valor do campo policy_violated . A chave é policy_violated . |
product_data._domain |
target.hostname |
O valor de product_data._domain . |
product_data._domain |
target.asset.hostname |
O valor de product_data._domain . |
product_data.activity_type |
metadata.product_event_type |
O valor de product_data.activity_type . |
product_data.file url |
target.file.full_path |
O valor de product_data.file url . |
product_data.file_size |
target.file.size |
O valor de product_data.file_size . |
product_data.group |
target.group.group_display_name |
O valor de product_data.group . |
product_data.location |
principal.location.country_or_region |
O valor de product_data.location . |
product_data.logon error |
security_result.summary |
O valor de product_data.logon error . |
product_data.mailbox owner |
target.user.userid |
O valor de product_data.mailbox owner . |
product_data.name |
target.file.full_path |
O valor de product_data.name . |
product_data.object_name |
target.file.full_path |
O valor de product_data.object_name . |
product_data.originatingserver product_data.service |
target.application |
O valor de product_data.service . |
product_data.site url |
target.url |
O valor de product_data.site url . |
product_data.target |
target.user.userid |
O valor de product_data.target . |
product_data.useragent |
network.http.user_agent |
O valor de product_data.useragent . |
product_name |
intermediary.application |
O valor do campo product_name . |
product_uid |
metadata.product_name |
O valor do campo product_uid . |
responsible_logs |
additional.fields[].value.string_value |
O valor do campo responsible_logs . A chave é responsible_logs . |
resource_id |
target.resource.product_object_id |
O valor do campo resource_id . |
risks |
security_result.detection_fields[].value |
O valor do campo risks . A chave é Risks . |
security_result.action |
security_result.action |
Derivado de product_data.logon error . Defina como BLOCK se product_data.logon error for BlockedByConditionalAccess . |
security_result.severity |
security_result.severity |
O valor em maiúsculas do campo severity , se for um dos níveis de gravidade aceitos. |
security_result.severity_details |
security_result.severity_details |
O valor do campo severity , se não for um dos níveis de gravidade aceitos. |
security_result.summary |
security_result.summary |
O valor do campo ioi_code ou product_data.logon error se ioi_code não estiver presente. |
service |
target.application |
O valor do campo service se product_data.service estiver vazio. |
site_url |
target.url |
O valor de product_data.site url . |
source |
principal.resource.attribute.labels[].value |
O valor do campo source . A chave é Source . |
sub_feature |
additional.fields[].value.string_value |
O valor do campo sub_feature . A chave é Sub Feature . |
target.application |
target.application |
Derivada com base em product_data.activity_type e na presença da conta principal e do destino. |
target.resource.name |
target.resource.name |
Derivada com base em product_data.activity_type e na presença da conta principal e do destino. |
threat_score |
security_result.detection_fields[].value |
O valor do campo threat_score . A chave é Threat Score . |
transaction_id |
security_result.detection_fields[].value |
O valor do campo transaction_id . A chave é Transaction ID . |
updated_timestamp |
additional.fields[].value.string_value |
O valor de updated_timestamp ou content_checks.dlp.updated_timestamp se o primeiro estiver vazio. A chave é Updated TimeStamp . |
user |
principal.user.userid |
O valor do campo user . |
user_email |
target.user.userid |
O valor do campo user_email . |
user_mail |
target.user.userid |
O valor do campo user_mail extraído do campo msg . |
user_name |
principal.user.user_display_name |
O valor do campo user_name . |
user_uid |
principal.user.userid ou target.user.userid |
O valor do campo user_uid . Mapeado para principal.user.userid se product_data.activity_type não for InvalidLogin ou Login . Caso contrário, será mapeado para target.user.userid . |
uuid |
intermediary.asset.product_object_id |
O valor do campo uuid . |
version |
metadata.product_version |
O valor do campo version . |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.