A integração do Miro com Splunk permite que os clientes Enterprise exportem dois tipos de dados de log para o Splunk para monitoramento avançado de segurança, relatórios de conformidade e análise operacional em toda a organização. Esta integração oferece suporte a:
- Logs de auditoria: capturam atividades de usuários e a nível de sistema em toda a sua organização, como acesso de usuários, compartilhamento de boards, mudanças de permissões, instalações de aplicativos, logins e ações administrativas.
-
Registros de conteúdo (complemento Enterprise Guard): captura atividade detalhada em nível de conteúdo dentro dos boards da Miro, como criação, edição e exclusão de objetos do board (widgets, notas adesivas, imagens, texto, quadros), bem como atividade de comentários.
Práticas recomendadas
- Use índices separados para logs de auditoria e logs de conteúdo.
- Planeje períodos de retenção com base nas necessidades de conformidade.
- Revise ambos os tipos de log juntos para um monitoramento abrangente das atividades.
Pré-requisitos
- assinatura do plano Enterprise
- O complemento Enterprise Guard é necessário para habilitar os Logs de Conteúdo.
- Acesso de admin a ambos:
- Console de admin da Miro (para habilitar SIEM e gerar tokens)
- Instância Splunk (para configurar entradas de dados)
Gerando tokens de acesso na Miro
Tanto os tokens de log de auditoria quanto os de log de conteúdo podem ser gerados a partir do mesmo local na Miro:
- Navegue até Integrações Enterprise → Apps e Integrações no seu Console de Admin.
- Logs de auditoria: Habilitar a opção SIEM.
Para logs de conteúdo: Habilite a opção eDiscovery.
Como alternativa, gere tokens registrando um aplicativo personalizado da Miro com os escopos: auditlogs:read, contentlogs:export.
⚠️ Logs de auditoria e logs de conteúdo usam tokens separados. Selecione o token correto para cada tipo de entrada.
Você também precisará do seu ID da Organização — isso pode ser copiado do URL do seu Console de Admin:https://miro.com/app/org/{organization_id}/...
Como instalar e configurar o aplicativo Splunk para Miro
- Instale o app Miro Splunk do Splunkbase.
- Na sua instância Splunk, vá para App da Miro → Inputs.
- Clique em Criar novo input.
- Selecione o tipo de entrada desejado: Logs de Auditoria ou Logs de Conteúdo (para clientes do Enterprise Guard).
- Forneça as seguintes informações:
- Token — selecione o token apropriado com base no tipo de entrada.
- ID da organização.
- Intervalo de tempo — determina com que frequência o Splunk busca novos eventos.
- Índice — especifique qual índice armazenará os dados de log. Para Logs de Conteúdo, é recomendado um índice separado devido ao maior volume e à sensibilidade dos dados.
Após configurado, o Splunk começará a coletar eventos de log da Miro.
Solução de problemas
- Certifique-se de que os tokens sejam gerados corretamente e mapeados para o tipo de entrada correto.
- Verifique se o ID da organização corresponde ao seu console de admin.
- Certifique-se de que os índices sejam criados corretamente e as permissões atribuídas no Splunk.
Como pesquisar logs no Splunk
Depois de configurar as entradas de dados, você pode buscar e analisar logs no Splunk usando os índices que atribuiu para Logs de Auditoria e Logs de Conteúdo.
-
Logs de auditoria:
index="your_audit_index" source="miro_audit_logs"
-
Logs de conteúdo:
Mantenha o conteúdo sincronizado com a fonte original: Mantenha o conteúdo sincronizado com a fonte original
Substitua your_audit_index
e your_content_index
pelos índices que você especificou durante a configuração de entrada. Você pode usar as funções padrão de pesquisa, filtragem e visualização do Splunk em ambos os tipos de log.
Visualização de dados no Splunk
O aplicativo Splunk para Miro inclui painéis pré-construídos para logs de auditoria para ajudar você a monitorar a atividade de usuários e do sistema. Depois de configurar os Logs de Conteúdo, você pode gerar painéis personalizados para visualizar as mudanças de conteúdo ao nível do board usando as ferramentas de visualização padrão do Splunk.
Use filtros, gráficos e gráficos baseados em tempo para analisar tendências como:
- Exclusões ou mudanças no conteúdo do board ao longo do tempo
- Detecção de picos para modificações massivas de conteúdo
- Atividade do usuário em boards sensíveis
✏️ Os painéis prontos para uso no Splunk App estão atualmente projetados para logs de auditoria. Logs de conteúdo podem ser analisados através de consultas de busca personalizadas e painéis de acordo com as necessidades da sua organização.
<dashboard theme="light" version="1.1">
<label>Atividade de usuário da Miro</label>
<description>Visão geral dos eventos do usuário em sua conta da Miro.</description>
<search id="basesearch">
<query>source=miro_audit_logs | fields * | eval context.team.name = if(isnull('context.team'), 'context.team.name', "None") | search context.organization.name = "$form.organization$" context.team.name = "$form.team$"</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
<fieldset submitButton="false">
<input type="time" token="time">
<label>Intervalo de tempo</label>
<default>
<earliest>-30d@d</earliest>
<latest>agora</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organização</label>
<fieldForLabel>context.organization.name</fieldForLabel>
<fieldForValue>context.organization.name</fieldForValue>
<search base="basesearch">
<query>| table context.organization.name | dedup context.organization.name</query>
</search>
<choice value="*">Tudo</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Time</label>
<choice value="*">Todos</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>context.team.name</fieldForLabel>
<fieldForValue>context.team.name</fieldForValue>
<search base="basesearch">
<query>| table context.team.name | dedup context.team.name</query>
</search>
</input>
</fieldset>
<row>
<panel>
<single>
<title>Total de eventos</title>
<search base="basesearch">
<query>| stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Eventos por data</title>
<search base="basesearch">
<query>| timechart count as Events</query>
</search>
<option name="charting.axisTitleX.visibility">collapsed</option>
<option name="charting.axisTitleY.visibility">visible</option>
<option name="charting.axisY2.enabled">0</option>
<option name="charting.chart">area</option>
<option name="charting.chart.nullValueMode">gaps</option>
<option name="charting.chart.stackMode">stacked</option>
<option name="charting.drilldown">none</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.mode">standard</option>
<option name="charting.legend.placement">none</option>
<option name="refresh.display">progressbar</option>
</chart>
</panel>
<panel>
<chart>
<title>Eventos por time</title>
<search base="basesearch">
<query>| rename context.team.name as Time | stats count as "Events" by Time | sort - "Events"</query>
</search>
<option name="charting.chart">pie</option>
<option name="charting.chart.sliceCollapsingThreshold">0.03</option>
<option name="charting.drilldown">all</option>
<option name="refresh.display">progressbar</option>
<drilldown>
<set token="form.team">$click.value$</set>
</drilldown>
</chart>
</panel>
</row>
<row>
<panel>
<single>
<title>Eventos do board</title>
<search base="basesearch">
<query>| search event = board_* | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Boards criados</title>
<search base="basesearch">
<query>| search event = board_created | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Boards abertos</title>
<search base="basesearch">
<query>| search event = board_opened | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Boards abertos ou criados</title>
<search base="basesearch">
<query>| search event = board_created OR event = board_opened | timechart count as "Boards created" by event</query>
</search>
<option name="charting.axisTitleX.visibility">collapsed</option>
<option name="charting.axisTitleY.visibility">visible</option>
<option name="charting.chart">column</option>
<option name="charting.chart.stackMode">stacked</option>
<option name="charting.drilldown">none</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.placement">right</option>
<option name="refresh.display">progressbar</option>
</chart>
</panel>
</row>
</dashboard>
<dashboard theme="light" version="1.1">
<label>Atividades de segurança da Miro</label>
<description>Visão geral dos eventos de segurança em sua conta da Miro.</description>
<search id="basesearch">
<query>source=miro_audit_logs | fields * | search context.organization.name = "$form.organization$"</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
<fieldset submitButton="false">
<input type="time" token="time">
<label>Intervalo de tempo</label>
<default>
<earliest>-30d@d</earliest>
<latest>agora</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organização</label>
<fieldForLabel>context.organization.name</fieldForLabel>
<fieldForValue>context.organization.name</fieldForValue>
<search base="basesearch">
<query>| table context.organization.name | dedup context.organization.name</query>
</search>
<choice value="*">Tudo</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Time</label>
<choice value="*">Todas</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>context.team.name</fieldForLabel>
<fieldForValue>context.team.name</fieldForValue>
<search base="basesearch">
<query>| table context.team.name | dedup context.team.name</query>
</search>
</input>
</fieldset>
<row>
<panel>
<single>
<title>Inícios de sessão bem-sucedidos</title>
<search base="basesearch">
<query>| search event = sign_in_succeeded | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Failed sign-ins</title>
<search base="basesearch">
<query>| search event = sign_in_failed | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Inícios de sessão por método de autenticação</title>
<search base="basesearch">
<query>| search event = sign_in_* | timechart count as Events by details.authType</query>
</search>
<option name="charting.axisTitleX.visibility">collapsed</option>
<option name="charting.axisTitleY.visibility">visible</option>
<option name="charting.axisY2.enabled">0</option>
<option name="charting.chart">column</option>
<option name="charting.chart.nullValueMode">gaps</option>
<option name="charting.chart.stackMode">stacked</option>
<option name="charting.drilldown">nenhum</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.mode">standard</option>
<option name="charting.legend.placement">right</option>
<option name="refresh.display">progressbar</option>
</chart>
</panel>
</row>
<row>
<panel>
<table>
<title>Eventos de compartilhamento</title>
<search base="basesearch">
<query>| search event = *public_link* OR event = *sharing* | rename context.team.name as Team createdBy.name as User object.name as Board details.role as Details event as Event | table id _time Event Team User Board Details</query>
</search>
<option name="count">10</option>
<option name="drilldown">cell</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
<row>
<panel>
<table>
<title>Eventos de arquivo</title>
<search base="basesearch">
<query>| search event = board_exported OR event = file_* | rename context.team.name as Team createdBy.name as User object.name as Board details.type as Type details.object as Object event as Event | table id _time Event Team User Board Type Object</query>
</search>
<option name="count">10</option>
<option name="drilldown">cell</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
</dashboard>
Figura 18: Editar painel
Atividade do usuário
A primeira visualização é Atividade do Usuário, onde você pode encontrar uma visão geral dos eventos do seu usuário na Miro. como:
- Número de eventos ao longo do tempo, por time e total.
-
Eventos de board: boards criados, boards abertos e total.
Figura 19: Atividade do usuário
<dashboard theme="light" version="1.1">
<label>Atividade de usuário da Miro</label>
<description>Visão geral dos eventos do usuário em sua conta da Miro.</description>
<search id="basesearch">
<query>source=miro_audit_logs | fields * | eval context.team.name = if(isnull('context.team'), 'context.team.name', "None") | search context.organization.name = "$form.organization$" context.team.name = "$form.team$"</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
<fieldset submitButton="false">
<input type="time" token="time">
<label>Intervalo de tempo</label>
<default>
<earliest>-30d@d</earliest>
<latest>agora</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organização</label>
<fieldForLabel>context.organization.name</fieldForLabel>
<fieldForValue>context.organization.name</fieldForValue>
<search base="basesearch">
<query>| table context.organization.name | dedup context.organization.name</query>
</search>
<choice value="*">Tudo</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Time</label>
<choice value="*">Tudo</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>context.team.name</fieldForLabel>
<fieldForValue>context.team.name</fieldForValue>
<search base="basesearch">
<query>| table context.team.name | dedup context.team.name</query>
</search>
</input>
</fieldset>
<row>
<panel>
<single>
<title>Total de eventos</title>
<search base="basesearch">
<query>| stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Eventos por data</title>
<search base="basesearch">
<query>| timechart count as Events</query>
</search>
<option name="charting.axisTitleX.visibility">collapsed</option>
<option name="charting.axisTitleY.visibility">visible</option>
<option name="charting.axisY2.enabled">0</option>
<option name="charting.chart">area</option>
<option name="charting.chart.nullValueMode">gaps</option>
<option name="charting.chart.stackMode">stacked</option>
<option name="charting.drilldown">none</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.mode">standard</option>
<option name="charting.legend.placement">none</option>
<option name="refresh.display">progressbar</option>
</chart>
</panel>
<panel>
<chart>
<title>Eventos por time</title>
<search base="basesearch">
<query>| rename context.team.name as Time | stats count as "Events" by Time | sort - "Events"</query>
</search>
<option name="charting.chart">pie</option>
<option name="charting.chart.sliceCollapsingThreshold">0.03</option>
<option name="charting.drilldown">all</option>
<option name="refresh.display">progressbar</option>
<drilldown>
<set token="form.team">$click.value$</set>
</drilldown>
</chart>
</panel>
</row>
<row>
<panel>
<single>
<title>Eventos do board</title>
<search base="basesearch">
<query>| search event = board_* | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Boards criados</title>
<search base="basesearch">
<query>| search event = board_created | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Boards abertos</title>
<search base="basesearch">
<query>| search event = board_opened | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Boards abertos ou criados</title>
<search base="basesearch">
<query>| search event = board_created OR event = board_opened | timechart count as "Boards created" by event</query>
</search>
<option name="charting.axisTitleX.visibility">collapsed</option>
<option name="charting.axisTitleY.visibility">visible</option>
<option name="charting.chart">column</option>
<option name="charting.chart.stackMode">stacked</option>
<option name="charting.drilldown">none</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.placement">right</option>
<option name="refresh.display">progressbar</option>
</chart>
</panel>
</row>
</dashboard>
Atividade de segurança
A segunda visualização é Security Activity (atividade de segurança), onde você pode encontrar uma visão geral dos eventos do usuário na Miro. Esses são:
- Atividade de login: a quantidade de logins bem-sucedidos e logins que falharam.
-
Compartilhamento de eventos: lista de eventos de usuários ao compartilhar boards.
Figura 20: Atividade de segurança
<dashboard theme="light" version="1.1">
<label>Atividades de segurança da Miro</label>
<description>Visão geral dos eventos de segurança em sua conta da Miro.</description>
<search id="basesearch">
<query>source=miro_audit_logs | fields * | search context.organization.name = "$form.organization$"</query>
<earliest>$time.earliest$</earliest>
<latest>$time.latest$</latest>
</search>
<fieldset submitButton="false">
<input type="time" token="time">
<label>Intervalo de tempo</label>
<default>
<earliest>-30d@d</earliest>
<latest>agora</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organização</label>
<fieldForLabel>context.organization.name</fieldForLabel>
<fieldForValue>context.organization.name</fieldForValue>
<search base="basesearch">
<query>| table context.organization.name | dedup context.organization.name</query>
</search>
<choice value="*">Tudo</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Time</label>
<choice value="*">Tudo</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>context.team.name</fieldForLabel>
<fieldForValue>context.team.name</fieldForValue>
<search base="basesearch">
<query>| table context.team.name | dedup context.team.name</query>
</search>
</input>
</fieldset>
<row>
<panel>
<single>
<title>Inícios de sessão bem-sucedidos</title>
<search base="basesearch">
<query>| search event = sign_in_succeeded | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Falhas ao iniciar sessão</title>
<search base="basesearch">
<query>| search event = sign_in_failed | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Inícios de sessão por método de autenticação</title>
<search base="basesearch">
<query>| search event = sign_in_* | timechart count as Events by details.authType</query>
</search>
<option name="charting.axisTitleX.visibility">collapsed</option>
<option name="charting.axisTitleY.visibility">visible</option>
<option name="charting.axisY2.enabled">0</option>
<option name="charting.chart">column</option>
<option name="charting.chart.nullValueMode">gaps</option>
<option name="charting.chart.stackMode">stacked</option>
<option name="charting.drilldown">none</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.mode">standard</option>
<option name="charting.legend.placement">right</option>
<option name="refresh.display">progressbar</option>
</chart>
</panel>
</row>
<row>
<panel>
<table>
<title>Eventos de compartilhamento</title>
<search base="basesearch">
<query>| search event = *public_link* OR event = *sharing* | rename context.time.name as Time createdBy.name as Usuário object.name as Board details.role as Details event as Event | table id _time Event Time Usuário Board Details</query>
</search>
<option name="count">10</option>
<option name="drilldown">cell</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
<row>
<panel>
<table>
<title>Eventos de arquivo</title>
<search base="basesearch">
<query>| search event = board_exported OR event = file_* | rename context.team.name as Team createdBy.name as User object.name as Board details.type as Type details.object as Object event as Event | table id _time Event Team User Board Type Object</query>
</search>
<option name="count">10</option>
<option name="drilldown">cell</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
</dashboard>