Integracja Miro z Splunk pozwala klientom Enterprise eksportować dwa rodzaje danych logów do Splunk w celu zaawansowanego monitorowania bezpieczeństwa, raportowania zgodności i analizy operacyjnej w całej organizacji. Ta integracja wspiera:
- Dzienniki audytu: rejestrują działania użytkowników i systemowe na poziomie całej organizacji, takie jak dostęp użytkowników, udostępnianie tablic, zmiany uprawnień, instalacje aplikacji, logowania i działania administracyjne.
-
Rejestry treści (dodatek Enterprise Guard): rejestruj szczegółowe działania na poziomie treści w tablicach Miro, takie jak tworzenie, edycja i usuwanie obiektów tablicy (widżety, karteczki, obrazy, tekst, ramki), a także aktywność komentowania.
Najlepsze praktyki
- Użyj oddzielnych indeksów dla dzienników audytu i dzienników treści.
- Planuj okresy retencji na podstawie potrzeb zgodności.
- Przejrzyj oba typy logów razem dla kompleksowego monitorowania aktywności.
Wymagania wstępne
- Subskrypcja wersji Enterprise
- Aby włączyć dzienniki treści, wymagany jest dodatek Enterprise Guard.
- Dostęp administratora do obu:
- Konsola administracyjna Miro (aby włączyć SIEM i generować tokeny)
- Instancja Splunk (aby skonfigurować wejścia danych)
Generowanie tokenów dostępu w Miro
Tokeny dziennika audytu i dziennika zawartości można generować z tej samej lokalizacji w Miro:
- Przejdź do Integracje Enterprise → Aplikacje i integracje w konsoli administratora.
- Dla dzienników audytu: Włącz przełącznik SIEM.
Dzienniki treści: Włącz przełącznik eDiscovery.
Alternatywnie, możesz wygenerować tokeny, rejestrując niestandardową aplikację Miro z uprawnieniami: auditlogs:read, contentlogs:export.
⚠️ Dzienniki audytu i dzienniki treści używają oddzielnych tokenów. Wybierz poprawny token dla każdego typu wejściowego.
Będziesz także potrzebować identyfikatora organizacji — można go skopiować z adresu URL konsoli administratora:https://miro.com/app/org/{organization_id}/...
Instalowanie i konfigurowanie aplikacji Splunk dla Miro
- Zainstaluj aplikację Miro Splunk ze Splunkbase.
- W swojej instancji Splunk przejdź do aplikacja Miro → Wejścia.
- Kliknij Utwórz nowy wpis.
- Wybierz pożądany typ wejścia: Dzienniki audytu lub Dzienniki zawartości (dla klientów Enterprise Guard).
- Podaj następujące informacje:
- Token — wybierz odpowiedni token na podstawie typu wejściowego.
- Identyfikator organizacji.
- Przedział czasowy — określa, jak często Splunk pobiera nowe zdarzenia.
- Indeks — określ, w którym indeksie przechowywać dane dziennika. Dla dzienników treści zaleca się osobny indeks ze względu na większą ilość oraz wrażliwość danych.
Po skonfigurowaniu Splunk zacznie zbierać zdarzenia logów z Miro.
Rozwiązywanie problemów
- Upewnij się, że tokeny są poprawnie generowane i przypisywane do właściwego typu danych wejściowych.
- Upewnij się, że identyfikator organizacji pasuje do Twojej Konsoli administratora.
- Zweryfikuj, czy indeksy są poprawnie utworzone, a uprawnienia przypisane w Splunk.
Jak przeszukiwać logi w Splunk
Po skonfigurowaniu wejść danych możesz wyszukiwać i analizować dzienniki w Splunk, używając indeksów przypisanych do dziennika audytu i dziennika treści.
-
Dzienniki audytu:
index="your_audit_index" source="miro_audit_logs"
-
Dzienniki treści:
Keep content synced with original source: Synchronizuj treść z oryginalnym źródłem
Zastąp your_audit_index
i your_content_index
indeksami, które określiłeś podczas konfiguracji wejściowej. Możesz używać standardowych funkcji wyszukiwania, filtrowania i wizualizacji Splunk na obu typach logów.
Wizualizacja danych w Splunk
Aplikacja Splunk dla Miro zawiera gotowe pulpity do dzienników audytu, które pomagają monitorować aktywność użytkownika i systemu. Po skonfigurowaniu dzienników zawartości możesz tworzyć niestandardowe pulpity nawigacyjne do wizualizacji zmian zawartości na poziomie tablicy przy użyciu standardowych narzędzi wizualizacyjnych Splunk.
Użyj filtrów, wykresów oraz wykresów czasowych, aby analizować trendy takie jak:
- Usunięcia lub zmiany zawartości tablicy z biegiem czasu
- Wykrywanie anomalii w masowych modyfikacjach treści
- Aktywność użytkownika na wrażliwych tablicach
✏️ Gotowe pulpity w aplikacji Splunk są obecnie zaprojektowane dla dzienników audytu. Dzienniki zawartości można analizować za pomocą niestandardowych zapytań wyszukiwania i pulpitów w zależności od potrzeb Twojej organizacji.
<dashboard theme="light" version="1.1">
<label>Aktywność użytkownika Miro</label>
<description>Przegląd wydarzeń użytkownika na Twoim koncie 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.najwcześniejszy$</earliest>
<latest>$time.najnowszy$</latest>
</search>
<fieldset submitButton="false">
<input type="time" token="time">
<label>Zakres czasu</label>
<default>
<earliest>-30d@d</earliest>
<latest>teraz</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organizacja</label>
<fieldForLabel>context.organization.name</fieldForLabel>
<fieldForValue>context.organization.name</fieldForValue>
<search base="basesearch">
<query>| tabela context.organization.name | usuń powtórzenia context.organization.name</query>
</search>
<choice value="*">Wszystko</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Zespół</label>
<choice value="*">Wszystko</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>context.team.name</fieldForLabel>
<fieldForValue>context.team.name</fieldForValue>
<search base="basesearch">
<query>| tabela context.team.name | dedup context.team.name</query>
</search>
</input>
</fieldset>
<row>
<panel>
<single>Pojedynczy
<title>Liczba zdarzeń</title>
<search base="basesearch">
<query>| statystyka liczby</query>
</search>
<option name="drilldown">żaden</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Wydarzenia według daty</title>
<search base="basesearch">
<query>| wykresczasowy liczba jako Wydarzenia</query>
</search>
<option name="charting.axisTitleX.visibility">zwinięte</option>
<option name="charting.axisTitleY.visibility">widoczny</option>
<option name="charting.axisY2.enabled">0</option>
<option name="charting.chart">obszar</option>
<option name="charting.chart.nullValueMode">puste miejsca</option>
<option name="charting.chart.stackMode">warstwowy</option>
<option name="charting.drilldown">brak</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.mode">standardowy</option>
<option name="charting.legend.placement">brak</option>
<option name="refresh.display">pasek postępu</option>
</chart>
</panel>
<panel>
<chart>
<title>Wydarzenia według zespołu</title>
<search base="basesearch">
<query>| rename context.team.name as Zespół | stats count as "Wydarzenia" by Zespół | sort - "Wydarzenia"</query>
</search>
<option name="charting.chart">tort</option>
<option name="charting.chart.sliceCollapsingThreshold">0,03</option>
<option name="charting.drilldown">wszystko</option>
<option name="refresh.display">pasek postępu</option>
<drilldown>
<set token="form.team">$click.value$</set>
</drilldown>
</chart>
</panel>
</row>
<row>
<panel>
<single>
<title>Zdarzenia na tablicy</title>
<search base="basesearch">
<query>| wyszukaj zdarzenie = tablica_* | stats count</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
<panel>
<single>Pojedynczy
<title>Utworzone tablice</title>
<search base="basesearch">
<query>| znajdź zdarzenie = board_created | stats count</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
<panel>
<single>
<title>Otwarte tablice</title>
<search base="basesearch">
<query>| szukaj event = otwarcie_tablicy | statystyki liczby</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
</row>
<row>Wiersz
<panel>
<chart>
<title>Tablice otwarte lub utworzone</title>
<search base="basesearch">
<query>| search event = tablica_utworzona OR event = tablica_otwarta | timechart count as "Utworzone tablice" by event</query>
</search>
<option name="charting.axisTitleX.visibility">zwinięty</option>
<option name="charting.axisTitleY.visibility">widoczny</option>
<option name="charting.chart">kolumna</option>
<option name="charting.chart.stackMode">stosowany</option>
<option name="charting.drilldown">brak</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.placement">prawa</option>
<option name="refresh.display">pasek postępu</option>
</chart>
</panel>
</row>
</dashboard>
<dashboard theme="light" version="1.1">
<label>Aktywność w zakresie bezpieczeństwa Miro</label>
<description>Przegląd wydarzeń dotyczących bezpieczeństwa w Twoim koncie Miro.</description>
<search id="basesearch">
<query>source=miro_audit_logs | fields * | search context.organization.name = "$form.organization$"</query>
<earliest>$time.najwcześniejszy$</earliest>
<latest>najnowsze</latest>
</search>
<fieldset submitButton="false">
<input type="time" token="time">
<label>Zakres czasu</label>
<default>
<earliest>-30d@d</earliest>
<latest>teraz</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organizacja</label>
<fieldForLabel>context.organization.name</fieldForLabel>
<fieldForValue>context.organization.name</fieldForValue>
<search base="basesearch">
<query>| tabela kontekst.organizacji.nazwa | usuń duplikaty kontekst.organizacji.nazwa</query>
</search>
<choice value="*">Wszystkie</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Zespół</label>
<choice value="*">Wszystko</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>context.team.name</fieldForLabel>
<fieldForValue>context.team.name</fieldForValue>
<search base="basesearch">Wyszukaj
<query>| kontekst tablicy context.team.name | dedup context.team.name</query>
</search>
</input>
</fieldset>
<row>
<panel>
<single>
<title>Udane logowania</title>
<search base="basesearch">
<query>| szukaj event = sign_in_succeeded | stats liczba</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
<panel>
<single>
<title>Nieudane logowania</title>
<search base="basesearch">
<query>| search event = sign_in_failed | statystyka liczba</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Logowania według metody uwierzytelniania</title>
<search base="basesearch">
<query>| search event = sign_in_* | timechart count as Events by details.authType</query>
</search>
<option name="charting.axisTitleX.visibility">złożony</option>
<option name="charting.axisTitleY.visibility">widoczny</option>
<option name="charting.axisY2.enabled">0</option>
<option name="charting.chart">kolumna</option>
<option name="charting.chart.nullValueMode">pustki</option>
<option name="charting.chart.stackMode">zgrane</option>
<option name="charting.drilldown">brak</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.mode">standardowy</option>
<option name="charting.legend.placement">prawa</option>
<option name="refresh.display">pasek postępu</option>
</chart>
</panel>
</row>
<row>
<panel>
<table>
<title>Udostępnianie wydarzeń</title>
<search base="basesearch">
<query>| search event = *public_link* OR event = *udostępnianie* | rename context.team.name as Zespół createdBy.name as Użytkownik object.name as Tablica details.role as Szczegóły event as Wydarzenie | table id _time Wydarzenie Zespół Użytkownik Tablica Szczegóły</query>
</search>
<option name="count">10</option>
<option name="drilldown">komórka</option>
<option name="refresh.display">pasek postępu</option>
</table>
</panel>
</row>
<row>Wiersz
<panel>
<table>
<title>Zdarzenia plików</title>
<search base="basesearch">
<query>| search event = board_exported OR event = file_* | rename context.team.name as Zespół createdBy.name as Użytkownik object.name as Tablica details.type as Rodzaj details.object as Obiekt event as Wydarzenie | table id _time Wydarzenie Zespół Użytkownik Tablica Rodzaj Obiekt</query>
</search>
<option name="count">10</option>
<option name="drilldown">komórka</option>
<option name="refresh.display">pasek postępu</option>
</table>
</panel>
</row>
</dashboard>
Rysunek 18: Edycja pulpitu
Aktywność użytkownika
Pierwsza wizualizacja to Aktywność użytkownika, gdzie znajdziesz przegląd wydarzeń Twoich użytkowników w Miro. Są to:
- Liczba wydarzeń w czasie, według zespołu i łącznie.
-
Wydarzenia na tablicy: tablice utworzone, tablice otwarte i łączne.
Rysunek 19: Aktywność użytkownika
<dashboard theme="light" version="1.1">
<label>Aktywność użytkownika w Miro</label>
<description>Przegląd wydarzeń użytkownika w Twoim koncie 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>najnowszy $time.latest$</latest>
</search>
<fieldset submitButton="false">
<input type="time" token="time">
<label>Peryt zakres</label>
<default>
<earliest>-30 dni@d</earliest>
<latest>teraz</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organizacja</label>
<fieldForLabel>kontekst.organizacja.nazwa</fieldForLabel>
<fieldForValue>context.organization.name</fieldForValue>
<search base="basesearch">
<query>| tabela context.organization.name | dedup context.organization.name</query>
</search>
<choice value="*">Wszystko</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Zespół</label>
<choice value="*">Wszystko</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>context.zespół.nazwa</fieldForLabel>
<fieldForValue>nazwa.zespołu.context</fieldForValue>
<search base="basesearch">
<query>| tabela context.team.name | usuń duplikaty context.team.name</query>
</search>
</input>
</fieldset>
<row>
<panel>
<single>
<title>Łączna liczba zdarzeń</title>
<search base="basesearch">Wyszukaj bazę
<query>| stats count</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>Wydarzenia według daty</title>
<search base="basesearch">
<query>| wykres_szybkości zdarzeń</query>
</search>
<option name="charting.axisTitleX.visibility">zwiń</option>
<option name="charting.axisTitleY.visibility">widoczny</option>
<option name="charting.axisY2.enabled">0</option>
<option name="charting.chart">obszar</option>
<option name="charting.chart.nullValueMode">przerwy</option>
<option name="charting.chart.stackMode">warstwowy</option>
<option name="charting.drilldown">brak</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.mode">standardowy</option>
<option name="charting.legend.placement">brak</option>
<option name="refresh.display">pasek postępu</option>
</chart>
</panel>
<panel>
<chart>
<title>Wydarzenia według zespołu</title>
<search base="basesearch">Wyszukaj
<query>| rename context.zespół.name as Team | stats count as "Wydarzenia" by Zespół | sort - "Wydarzenia"</query>
</search>
<option name="charting.chart">słupkowy</option>
<option name="charting.chart.sliceCollapsingThreshold">0,03</option>
<option name="charting.drilldown">wszyscy</option>
<option name="refresh.display">pasek postępu</option>
<drilldown>
<set token="form.team">$click.value$</set>
</drilldown>
</chart>
</panel>
</row>
<row>
<panel>
<single>
<title>Zdarzenia na tablicy</title>
<search base="basesearch">
<query>| search zdarzenie = tablica_* | statystyki liczba</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
<panel>
<single>
<title>Utworzone tablice</title>
<search base="basesearch">
<query>| search event = board_created | stats liczba</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
<panel>
<single>Jeden
<title>Otwarte tablice</title>
<search base="basesearch">
<query>| search event = tablica_otwarta | stats count</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
</row>
<row>Wiersz
<panel>
<chart>
<title>Tablice otwarte lub utworzone</title>
<search base="basesearch">
<query>| wyszukaj event = board_created LUB event = board_opened | wykres_czasu liczba jako "Utworzone tablice" według event</query>
</search>
<option name="charting.axisTitleX.visibility">zwiń</option>
<option name="charting.axisTitleY.visibility">widoczny</option>
<option name="charting.chart">kolumna</option>
<option name="charting.chart.stackMode">stosowany</option>
<option name="charting.drilldown">brak</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.placement">right</option>
<option name="refresh.display">pasek postępu</option>
</chart>
</panel>
</row>
</dashboard>
Aktywność związana z bezpieczeństwem
Drugą wizualizacją jest Aktywność Zabezpieczeń, gdzie znajdziesz przegląd wydarzeń użytkowników w Miro. Te to:
- Aktywność logowania: liczba udanych i nieudanych prób logowania.
-
Udostępnianie zdarzeń: lista zdarzeń użytkowników podczas udostępniania tablic.
Rysunek 20: Aktywność dotycząca bezpieczeństwa
<dashboard theme="light" version="1.1">
<label>Aktywność dotycząca bezpieczeństwa Miro</label>
<description>Przegląd zdarzeń dotyczących bezpieczeństwa na Twoim koncie Miro.</description>
<search id="basesearch">
<query>source=miro_audit_logs | fields * | search context.organization.name = "$form.organization$"</query>
<earliest>$time.najwcześniejszy$</earliest>
<latest>Najnowsze $time.latest$</latest>
</search>
<fieldset submitButton="false">
<input type="time" token="time">
<label>Zakres czasu</label>
<default>
<earliest>-30d@d</earliest>
<latest>teraz</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>Organizacja</label>
<fieldForLabel>context.organization.name</fieldForLabel>
<fieldForValue>context.organization.name</fieldForValue>
<search base="basesearch">
<query>| tabela context.organization.name | dedup context.organization.name</query>
</search>
<choice value="*">Wszystko</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>Zespół</label>
<choice value="*">Wszystko</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>context.team.name</fieldForLabel>
<fieldForValue>context.team.name</fieldForValue>
<search base="basesearch">
<query>| table context.team.name | usuń duplikaty context.team.name</query>
</search>
</input>
</fieldset>
<row>Wiersz
<panel>
<single>
<title>Udane logowania</title>
<search base="basesearch">
<query>| search event = sign_in_succeeded | statystyki count</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
<panel>
<single>
<title>Nieudane logowania</title>
<search base="basesearch">
<query>| wyszukaj zdarzenie = sign_in_failed | statystyki liczba</query>
</search>
<option name="drilldown">brak</option>
</single>
</panel>
</row>
<row>Wiersz
<panel>
<chart>
<title>Logowania według metody uwierzytelniania</title>
<search base="basesearch">
<query>| search event = sign_in_* | timechart count as Events by details.authType</query>
</search>
<option name="charting.axisTitleX.visibility">ukryty</option>
<option name="charting.axisTitleY.visibility">widoczny</option>
<option name="charting.axisY2.enabled">0</option>
<option name="charting.chart">kolumna</option>
<option name="charting.chart.nullValueMode">luki</option>
<option name="charting.chart.stackMode">stos</option>
<option name="charting.drilldown">brak</option>
<option name="charting.layout.splitSeries">0</option>
<option name="charting.legend.mode">standardowy</option>
<option name="charting.legend.placement">prawa</option>
<option name="refresh.display">progressbar</option>
</chart>
</panel>
</row>
<row>Wiersz
<panel>
<table>
<title>Udostępnianie wydarzeń</title>
<search base="basesearch">
<query>| search event = *public_link* OR event = *sharing* | rename context.team.name as Zespół createdBy.name as Użytkownik object.name as Tablica details.role as Szczegóły event as Zdarzenie | table id _time Zdarzenie Zespół Użytkownik Tablica Szczegóły</query>
</search>
<option name="count">10</option>
<option name="drilldown">komórka</option>
<option name="refresh.display">pasek postępu</option>
</table>
</panel>
</row>
<row>Wiersz
<panel>
<table>
<title>Zdarzenia pliku</title>
<search base="basesearch">
<query>| search event = board_exported OR event = file_* | rename context.team.name as Zespół createdBy.name as Użytkownik object.name as Tablica details.type as Typ details.object as Obiekt event as Wydarzenie | table id _time Wydarzenie Zespół Użytkownik Tablica Typ Obiekt</query>
</search>
<option name="count">10</option>
<option name="drilldown">komórka</option>
<option name="refresh.display">pasek postępu</option>
</table>
</panel>
</row>
</dashboard>