O aplicativo da Miro para Splunk permite acesso aos logs de auditoria da Miro a partir do Splunk, oferecendo um monitoramento centralizado, alertas no momento certo e funcionalidades para visualização de dados. Com esse conjunto, você obtém uma visão geral abrangente e insights mais profundos sobre os logs de auditoria da Miro, incluindo informações sobre atividades do usuário e eventos de segurança, o que ajuda a agilizar os processos de monitoramento e análise. Isso não apenas simplifica o gerenciamento de logs, mas também aprimora o processo de tomada de decisão com insights baseados em dados.
Disponível para: plano Enterprise
Configurado por: Admins da empresa
Configuração da Miro
Como gerar um token de acesso
1. Na página de configurações do Miro Enterprise , acesse Aplicativos e integrações > Integrações Enterprise.
Habilitar SIEM no console de admin Enterprise
2. Clique para ativar o botão SIEM.
Depois de ativá-lo, você pode copiar o token de acesso ou gerar um novo.
⚠️ A integração será vinculada ao time com o maior número de usuários. Não é possível escolher um time diferente, mas observe que a integração funciona para todas os times do seu plano Enterprise. Os eventos relevantes para a integração são exibidos para todo o plano nos seus logs de auditoria.
Se outro admin tiver ativado a alternância, você não poderá copiar o token de acesso. No entanto, você ainda pode desativar a integração.
Figura 3: mensagem que aparece caso a opção tenha sido habilitada/em>
Configuração do Splunk
Instale o aplicativo da Miro
1. No painel do Splunk, navegue até Gerenciar aplicativos clicando no ícone configurações/gerenciar aplicativos (Figura 4).
Figura 4: ícone de Configurações/Gerenciamento de aplicativos
2. Na página Apps, clique em Browse more apps para procurar mais aplicativos.
Figura 5: botão Procurar mais aplicativos
3. Procure por Miro App for Splunk e prossiga com a instalação clicando em Instalar.
Figura 6: como instalar o aplicativo da Miro para o Splunk
4. Insira suas credenciais, clique na caixa de seleção para concordar com os termos e condições e clique em Login e instalação.
Figura 7: inicie a sessão e instale
5. Após a instalação do aplicativo, pode ser necessário reiniciar o Splunk. Clique em Reiniciar agora.
Configurar o aplicativo da Miro
Depois que o aplicativo da Miro estiver instalado, você poderá vê-lo no painel do Splunk. Para configurar o aplicativo, clique em Miro App for Splunk (Figura 8).
Figura 8: aplicativo da Miro para Splunk
Navegue até Configuration > Logging > Log level e defina o nível de log como INFO (Figura 9).
Figura 2: log level
A partir da versão 3.0.0 você também pode configurar um proxy para o aplicativo da Miro para o Splunk navegando até Configuration > Proxy.
Figura 10: como configurar um proxy
Crie uma nova entrada para seu conector navegando até a guia Inputs e clicando em Create New Input para criar uma nova entrada.
Como criar uma nova entrada
Insira um nome representativo para sua nova entrada, defina o intervalo que você deseja que o Splunk busque dados da Miro (recomendamos a cada 60 segundos), adicione o token de acesso que você copiou do aplicativo da Miro e clique em Add para adicionar:
Figura 11: como adicionar logs de auditoria da Miro
Certifique-se de que a entrada esteja habilitada. A partir deste momento, o Splunk passará a receber logs de auditoria da Miro.
Figura 12: como verificar o status
Como usar a Pesquisa
Se quiser saber quais eventos estão sendo enviados para o Splunk ou quiser verificar os logs, acesse a aba Search para pesquisar:
- Para eventos de logs de auditoria, você pode filtrar por source="miro_audit_logs" para ver uma lista de logs de auditoria obtidos da Miro no intervalo de tempo especificado:
Figura 13: logs de auditoria da Miro no Splunk - Para Logs, você pode filtrar por index="_internal" sourcetype="miroappforsplunk:log" e verá a lista de logs no intervalo de tempo especificado para o aplicativo da Miro:
Figura 14: logs da Miro no Splunk
Visualização de dados
O aplicativo da Miro para o Splunk pode ser enriquecido com duas visualizações de dados predefinidas que mostram uma visão geral dos insights de seus dados. Você pode criar painéis colando o código XML fornecido abaixo para as visualizações em sua própria configuração do Splunk, seguindo estas etapas:
- Clique na seção Visualize your data para visualizar seus dados na página inicial do Splunk admin .
Figura 15: como visualizar seus dados
-
Clique em Create New Dashboard (criar novo painel) e preencha os detalhes conforme achar necessário.
create_new_dashboard_1.png
Figura 16: como criar um novo painelcreate_new_dashboard_2.png
Figura 17: como criar um novo painel
-
Na nova visualização do painel, clique em Source (fonte) e cole o código XML.
Clique para visualizar o código XML das visualizações da 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>now</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="*">All</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Time</label>
<choice value="*">All</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>
Clique para visualizar o código XML das visualizações da 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>now</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="*">All</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Time</label>
<choice value="*">All</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>Successful sign-ins</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>Sign-ins by authentication method</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.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>
xml_new_dashboard.png
Figura 18: Como editar o painel
Atividade do usuário
A primeira visualização é User Activity (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>now</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="*">All</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Time</label>
<choice value="*">All</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, como:
- 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>now</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="*">All</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Time</label>
<choice value="*">All</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>Successful sign-ins</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>Sign-ins by authentication method</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.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>