Die Miro-App für Splunk bietet Zugriff auf Miro-Audit-Protokolle über Splunk und ermöglicht so eine zentrale Überwachung, zeitnahe Warnmeldungen und umfassende Funktionen zur Datenvisualisierung. Mit dieser Einrichtung erhältst du einen umfassenden Überblick und detaillierte Einblicke in die Audit-Protokolle von Miro, einschließlich Informationen über Nutzeraktivitäten und Sicherheitsereignisse, was die Überwachungs- und Analyseprozesse erleichtert. Das vereinfacht nicht nur die Verwaltung der Protokolle, sondern verbessert auch den Entscheidungsprozess durch fundierte datengestützte Erkenntnisse.
Erhältlich für: Enterprise-Preisplan
Einrichtung durch: Unternehmens-Admin
Miro-Konfiguration
Zugriffstoken generieren
1. Gehe auf deiner Miro Enterprise Einstellungsseite zu Apps und Integrationen > Enterprise Integrationen.
SIEM in der Enterprise-Admin-Konsole aktivieren
2. Klicke auf den Umschalter, um SIEM zu aktivieren.
Sobald du den Schalter aktiviert hast, kannst du den Zugriffstoken kopieren oder einen neuen generieren.
⚠️ Die Integration wird mit dem Team mit der größten Anzahl von Nutzern verbunden. Es ist nicht möglich, hier ein anderes Team auszuwählen. Beachte aber, dass die Integration für alle Teams in deinem Enterprise-Preisplan funktioniert und die integrationsrelevanten Ereignisse für den gesamten Preisplan in deinen Audit-Protokollen angezeigt werden.
Wenn ein anderer Admin die Umschaltfunktion aktiviert hat, kannst du das Zugriffstoken nicht kopieren. Du kannst die Integration aber immer noch deaktivieren.
Abbildung 3: Meldung, die erscheint, wenn die Umschaltfunktion bereits aktiviert ist
Splunk-Konfiguration
Die Miro-App installieren
1. Gehe in deinem Splunk-Dashboard zu Manage apps, indem du auf das Zahnradsymbol für Einstellungen/Verwaltung von Apps klickst (Abbildung 4).
Abbildung 4: Zahnradsymbol für Einstellungen/Verwaltung von Apps
2. Auf der Seite Apps klickst du dann auf Browse more apps.
Abbildung 5: Die Schaltfläche, um nach mehr Apps zu suchen
3. Suche nach Miro App for Splunk und fahre mit der Installation fort, indem du auf Install klickst.
Abbildung 6: Installation der Miro-App für Splunk
4. Gib deine Anmeldeinformationen ein, klicke auf das Kästchen, um den Allgemeinen Geschäftsbedingungen zuzustimmen, und dann auf Login and Install.
Abbildung 7: Anmelden und installieren
5. Nachdem die App installiert wurde, musst du Splunk möglicherweise neu starten. Klicke auf Restart now.
Die Miro-App konfigurieren
Sobald die Miro-App installiert ist, kannst du sie auf dem Splunk-Dashboard sehen. Um die App zu konfigurieren, klicke auf Miro App for Splunk (Abbildung 8).
Abbildung 8: Miro-App für Splunk
Gehe zu Configuration > Logging > Log level und setze „Log level“ auf INFO (Abbildung 9).
Abbildung 2: Log Level
Ab Version 3.0.0 kannst du auch einen Proxy für die Miro Splunk App konfigurieren, indem du zu Konfiguration > Proxy navigierst .
Abbildung 10: Einrichten eines Proxys
Erstelle einen neuen Eingang für deinen Connector, indem du zum Tab Inputs gehst und auf Create New Input klickst.
Erstellung eines neuen Eingangs
Gib einen aussagekräftigen Namen für deinen neuen Eingang ein, lege das Interval fest, in dem Splunk Daten von Miro abrufen soll (wir empfehlen alle 60 Sekunden), füge das Access token hinzu, das du aus der Miro-App kopiert hast, und klicke dann auf Add:
Abbildung 11: Hinzufügen von Audit-Protokollen
Vergewissere dich, dass der Eingang den Status Enabled hat. Ab diesem Moment beginnt Splunk, Audit-Protokolle von Miro zu empfangen.
Abbildung 12: Den Status prüfen
Wie man die Suche benutzt
Wenn du erfahren möchtest, welche Ereignisse an Splunk gesendet werden, oder du die Protokolle überprüfen möchtest, kannst du zum Tab Search gehen:
- Bei Audit logskannst du nach source="miro_audit_logs" filtern und erhältst eine Liste der Audit-Protokolle, die im angegebenen Zeitraum von Miro abgerufen wurden:
Abbildung 13: Audit-Protokolle von Miro in Splunk - Bei Logs kannst du nach index="_internal" sourcetype="miroappforsplunk:log" filtern und du bekommst die Liste der Protokolle im angegebenen Zeitraum für die Miro-App angezeigt:
Abbildung 14: Miro-Protokolle in Splunk
Datenvisualisierung
Die Miro Splunk-App kann mit zwei vordefinierten Datenvisualisierungen erweitert werden, die einen Überblick über deine Dateneinblicke geben. Du kannst Dashboards erstellen, indem du den unten angegebenen XML-Code für die Visualisierungen in deine eigene Splunk-Einrichtung einfügst. Gehe dazu wie folgt vor:
- Klicke auf der Splunk Admin-Startseite auf den Abschnitt Visualize your data.
Abbildung 15: Visualisiere deine Daten
-
Klicke auf Neues Dashboard erstellen und fülle die Details nach deinen Vorstellungen aus.
Abbildung 16: Neues Dashboard erstellen
Abbildung 17: Neues Dashboard erstellen
-
In der neuen Dashboard-Ansicht klickst du auf Quelle und fügst den XML-Code ein.
Klicke, um den XML-Code für die Visualisierung der Nutzeraktivitäten anzusehen.<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>
Klicke, um den XML-Code für die Visualisierung der Sicherheitsaktivitäten anzusehen.<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>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>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>
Abbildung 18: Dashboard bearbeiten
Aktivitäten des Nutzers
Die erste Visualisierung ist User Activity, in der du einen Überblick über die Ereignisse deiner Nutzer in Miro findest. Dies sind:
- Die Anzahl der Ereignisse im Laufe der Zeit, pro Team und insgesamt.
- Board-Ereignisse: erstellte Boards, geöffnete Boards und Boards insgesamt.
Abbildung 19: Aktivitäten des Nutzers
<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>
Sicherheitsaktivitäten
Die zweite Visualisierung ist „Security Activity“, in der du einen Überblick über Nutzerereignisse in Miro findest. Dies sind:
- Aktivitäten bei der Anmeldung: die Anzahl der erfolgreichen und fehlgeschlagenen Anmeldungen.
-
Ereignisse zum Freigeben: Liste der Ereignisse der Nutzer beim Freigeben von Boards.
Abbildung 20: Sicherheitsaktivitäten
<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>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>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>