L’application Miro pour Splunk permet d’accéder aux journaux d’audit Miro à partir de Splunk, facilitant ainsi la surveillance centralisée, les alertes en temps opportun et de solides capacités de visualisation des données. En tirant parti de cette configuration, vous obtenez une vue d’ensemble et des informations plus approfondies sur les journaux d’audit de Miro, notamment des informations sur l’activité des utilisateurs et les évènements de sécurité, ce qui permet de rationaliser les processus de surveillance et d’analyse. Cela permet non seulement de simplifier la gestion des logs, mais aussi d’améliorer le processus de prise de décision grâce à des informations plus précises basées sur des données.
Disponible pour : le forfait Enterprise
Installation par : les admins d’entreprise
Configuration Miro
Générer un jeton d’accès
1. Dans votre page de paramètres Miro Enterprise, accédez à Applications et intégrations > Intégrations d'entreprise.
Activer SIEM dans la console d'administration Enterprise
2. Cliquez pour activer la bascule SIEM.
Une fois l’option activée, vous pouvez copier le jeton d’accès ou en générer un nouveau.
⚠️ L’intégration est liée à l’équipe comptant le plus grand nombre d’utilisateurs. Il n’est pas possible de choisir une autre équipe ici, mais notez que l’intégration fonctionne pour toutes les équipes de votre forfait Enterprise et que les évènements liés à l’intégration sont affichés pour l’ensemble du plan dans vos journaux d’audit.
Si un autre admin a activé la bascule, vous ne pouvez pas copier le jeton d’accès. Cependant, vous pouvez toujours désactiver l’intégration.
Figure 3 : Message qui apparait si le bouton bascule est déjà activé/em>
Configuration de Splunk
Installer l’application Miro
1. Depuis votre tableau de bord Splunk, accédez à Gérer les apps en cliquant sur l’icône paramètres/gérer les apps (Figure 4).
Figure 4 : Icône Paramètres/Gestion des applications
2. Sur la page Apps, cliquez sur Parcourir plus d’applications.
Figure 5 : Bouton Browse more apps (Parcourir plus d’applications)
3. Recherchez l’application Miro pour Splunk, puis procédez à l’installation en cliquant sur Installer.
Figure 6 : Installation de l’application Miro pour Splunk
4. Saisissez vos identifiants, cochez la case pour accepter les conditions générales, puis cliquez sur Connexion et installation.
Figure 7 : Connexion et installation
5. Après l’installation de l’application, il se peut que vous deviez redémarrer Splunk. Cliquez sur Redémarrer maintenant.
Configurer l’application Miro
Une fois l’application Miro installée, vous pouvez la voir sur le tableau de bord Splunk. Pour configurer l’application, cliquez sur Miro App for Splunk (Figure 8).
Figure 8 : Application Miro pour Splunk
Naviguez vers Configuration > Journalisation > Niveau de journalisation et réglez le niveau de journalisation sur INFO (Figure 9).
Figure 2 : Niveau de journalisation
À partir de la version 3.0.0, vous pouvez également configurer un proxy pour l’application Miro Splunk en naviguant vers Configuration > Proxy.
Figure 10 : Mise en place d’un proxy
Créez une nouvelle entrée pour votre connecteur en accédant à l’onglet Entrées et en cliquant sur Créer une nouvelle entrée.
Création d’une nouvelle entrée
Saisissez un Nom représentatif pour votre nouvelle Entrée, définissez l’Intervalle auquel vous souhaitez que Splunk récupère les données de Miro (nous recommandons toutes les 60 secondes), ajoutez le Jeton d’accès que vous avez copié à partir de l’appli Miro, puis cliquez sur Ajouter:
Figure 11 : Ajouter des journaux d’audit Miro
Assurez-vous que l’entrée est activée. À partir de ce moment, Splunk commence à recevoir des journaux d’audit de Miro.
Figure 12 : Vérification de l’état
Comment utiliser la recherche
Si vous souhaitez découvrir quels sont les évènements envoyés à Splunk ou si vous souhaitez vérifier les journaux, vous pouvez vous rendre sur l’onglet Search (Recherche) :
- Pour les évènements liés aux journaux d’ audit, vous pouvez filtrer par source="miro_audit_logs" et vous obtiendrez une liste des journaux d’audit qui ont été extraits de Miro dans le créneau horaire spécifié :
Figure 13 : Journaux d’audit Miro dans Splunk - Pour les journaux, vous pouvez filtrer par index="_internal" sourcetype="miroappforsplunk:log" et vous verrez la liste des journaux dans le créneau horaire spécifié pour l’application Miro :
Figure 14 : Journaux Miro dans Splunk
Visualisation des données
L’application Miro Splunk peut être enrichie de deux visualisations de données prédéfinies qui montrent une vue d’ensemble de vos données. Vous pouvez créer des tableaux de bord en collant le code XML fourni ci-dessous pour les visualisations dans votre propre configuration Splunk, en suivant les étapes suivantes :
- Cliquez sur la section Visualiser vos données sur la page d’accueil de Splunk Admin.
Figure 15 : Visualisez vos données
-
Cliquez sur Créer un nouveau tableau de bord et remplissez les détails comme bon vous semble.
create_new_dashboard_1.png
Figure 16 : Créer un nouveau tableau de bordcreate_new_dashboard_2.png
Figure 17 : Créer un nouveau tableau de bord
-
Dans la nouvelle vue du tableau de bord, cliquez sur Source et collez le code XML.
Cliquez pour voir le code XML des visualisations de l’activité de l’utilisateur.<dashboard theme="light" version="1.1">
<label>Miro User Activity</label>
<description>Overview of user events in your Miro account.</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>Time range</label>
<default>
<earliest>-30d@d</earliest>
<latest>now</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organization</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>Team</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 events</title>
<search base="basesearch">
<query>| stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Events by date</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>Events by team</title>
<search base="basesearch">
<query>| rename context.team.name as Team | stats count as "Events" by Team | 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>Board events</title>
<search base="basesearch">
<query>| search event = board_* | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Boards created</title>
<search base="basesearch">
<query>| search event = board_created | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Boards opened</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 opened or created</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>
Cliquez pour voir le code XML des visualisations de l’activité de sécurité.<dashboard theme="light" version="1.1">
<label>Miro Security Activity</label>
<description>Overview of security events in your Miro account.</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>Time range</label>
<default>
<earliest>-30d@d</earliest>
<latest>now</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organization</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>Team</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>Inscriptions réussies</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>Sharing events</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>File events</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
Figure 18 : Modifier le tableau de bord
Activité de l’utilisateur
La première visualisation est l’activité de l’utilisateur, où vous trouverez un aperçu des évènements de votre utilisateur dans Miro. Ces évènements comprennent :
- Le nombre d’évènements au fil du temps, par équipe et au total.
- Évènements relatifs aux tableaux : tableaux créés, tableaux ouverts et total.
Figure 19 : Activité des utilisateurs
<dashboard theme="light" version="1.1">
<label>Miro User Activity</label>
<description>Overview of user events in your Miro account.</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>Time range</label>
<default>
<earliest>-30d@d</earliest>
<latest>now</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organization</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>Team</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 events</title>
<search base="basesearch">
<query>| stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Events by date</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>Events by team</title>
<search base="basesearch">
<query>| rename context.team.name as Team | stats count as "Events" by Team | 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>Board events</title>
<search base="basesearch">
<query>| search event = board_* | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Boards created</title>
<search base="basesearch">
<query>| search event = board_created | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>Boards opened</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 opened or created</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>
Activité de sécurité
La deuxième visualisation est l’activité de sécurité, où vous pouvez trouver un aperçu de vos évènements d’utilisateur dans Miro. Ces évènements comprennent :
- Login activity (Activité de connexion) : le nombre de connexions réussies et échouées.
-
Évènements de partage : liste des évènements des utilisateurs lors du partage des tableaux.
Figure 20 : Activité de sécurité
<dashboard theme="light" version="1.1">
<label>Miro Security Activity</label>
<description>Overview of security events in your Miro account.</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>Time range</label>
<default>
<earliest>-30d@d</earliest>
<latest>now</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organization</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>Team</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>Inscriptions réussies</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>Sharing events</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>File events</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>