Miro の Splunk インテグレーションにより、Enterprise のお客様は、組織全体での高度なセキュリティー監視、コンプライアンスレポート、運用分析のために、2 種類のログデータを Splunk にエクスポートできます。このインテグレーションはサポートします:
- 監査ログ: あなたの組織全体でユーザーやシステムレベルのアクティビティ、例えばユーザーアクセス、ボード共有、権限変更、アプリインストール、ログイン、管理アクションを記録します。
-
コンテンツログ (Enterprise Guard アドオン): Miro ボード内の詳細なコンテンツレベルのアクティビティを記録し、ボードオブジェクト(ウィジェット、付箋、画像、テキスト、フレーム)の作成、編集、削除、コメント活動などをキャプチャします。
ベストプラクティス
- 監査ログとコンテンツログに分けてインデックスを使用してください。
- コンプライアンスのニーズに基づいて強制保持期間をプランします。
- 両方のログタイプを一緒に確認して、包括的な活動監視を行いましょう。
前提条件
- Enterprise プランサブスクリプション
- Content Logs を有効にするには、Enterprise Guard アドオンが必要です。
- 両方への管理者アクセス:
- Miro 管理者コンソール(SIEM を有効にしてトークンを生成する)
- Splunk インスタンス (データ入力を設定する)
Miroでアクセストークンを生成する
監査ログとコンテンツログのトークンは、Miro 内の同じ場所から生成できます。
- 管理者コンソールでEnterprise インテグレーション → アプリとインテグレーションに移動します。
- 監査ログ用:SIEM トグルを有効化します。
コンテンツログについて:eDiscovery トグルを有効にします。
あるいは、カスタム Miro アプリをauditlogs:read、contentlogs:exportのスコープで登録してトークンを生成します。
⚠️ 監査ログとコンテンツログは別々のトークンを使用します。各入力タイプに対して正しいトークンを選択してください。
組織 IDも必要です。これは管理者コンソールの URL からコピーできます。https://miro.com/app/org/{organization_id}/...
Splunk 用 Miro アプリのインストールと設定
- Splunkbase からMiro Splunk アプリをインストールしてください。
- お使いの Splunk インスタンスで、Miro アプリ → 入力 に移動してください。
- 新しい入力を作成する をクリックします。
- 入力タイプを選択してください:監査ログ または コンテンツログ (Enterprise Guard 顧客向け)
- 以下の情報を提供してください:
- トークン — 入力タイプに基づいて適切なトークンを選択します。
- 組織 ID.
- 時間間隔 — Splunk が新しいイベントを取得する頻度を決定します。
- インデックス — ログデータを保存するインデックスを指定してください。コンテンツログについては、より大量のデータやデータの機密性に鑑みて、別のインデックスを用意することをお勧めします。
構成が完了すると、Splunk は Miro からログイベントの収集を開始します。
トラブルシューティング
- トークンが正しく生成され、適切な入力タイプにマップされていることを確認してください。
- 組織 ID が管理者コンソールと一致することを確認してください。
- インデックスが正しく作成され、権限が Splunk で割り当てられていることを確認してください。
Splunk でログを検索する方法
データ入力を設定した後、監査ログとコンテンツログ用に割り当てたインデックスを使用して、Splunk 内でログを検索および分析できます。
-
監査ログ:
index="your_audit_index" source="miro_audit_logs"
-
コンテンツログ:
インデックス="your_content_index" ソース="miro_content_logs"
your_audit_index
と your_content_index
を、入力セットアップ時に指定したインデックスに置き換えます。標準の Splunk 検索、フィルター、ビジュアライゼーション機能を両方のログタイプに使用できます。
Splunk でのデータ可視化
Miro 用 Splunk アプリには、ユーザーやシステムのアクティビティーを監視するのに役立つ、監査ログ用の事前構築されたダッシュボードが含まれています。コンテンツ ログを設定すると、Splunk の標準ビジュアル化ツールを使用してボードレベルのコンテンツ変更を視覚化するためのカスタム ダッシュボードを作成できます。
フィルター、チャート、および時間ベースのグラフを使用して、傾向を分析します。
- ボードコンテンツの削除または時間の経過による変更
- 大量コンテンツ修正のスパイク検出
- 機密ボードにおけるユーザー アクティビティー
Splunk アプリのすぐに使えるダッシュボードは、現在監査ログ用に設計されています。コンテンツログは、組織のニーズに応じてカスタム検索クエリやダッシュボードを通じて分析することができます。
<dashboard theme="light" version="1.1">
<label>Miro ユーザー アクティビティー</label>
<description>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>タイムレンジ</label>
<default>デフォルト
<earliest>-30d@d</earliest>
<latest>最新</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>組織</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="*">すべて</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>チーム</label>
<choice value="*">すべて</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>全イベント</title>
<search base="basesearch">
<query>| stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>日付別イベント</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>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>ボードイベント</title>
<search base="basesearch">
<query>| search event = board_* | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>作成されたボード</title>
<search base="basesearch">
<query>| search event = board_created | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>ボードが開かれました</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>開かれた、または作成されたボード</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>Miro セキュリティー アクティビティー</label>
<description>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>タイムレンジ</label>
<default>
<earliest>-30d@d</earliest>
<latest>今すぐ</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>組織</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="*">すべて</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>チーム</label>
<choice value="*">すべて</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>ログイン成功</title>
<search base="basesearch">
<query>| search event = sign_in_succeeded | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>ログインの失敗</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>認証方法によるログイン</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>イベントの共有</title>
<search base="basesearch">
<query>| search event = *public_link* OR event = *sharing* | rename context.team.name as Team createdBy.name as ユーザー object.name as ボード details.role as Details event as Event | table id _time Event Team ユーザー ボード 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>
図18:ダッシュボードを編集します
ユーザー アクティビティー
最初のビジュアライゼーションはユーザー アクティビティーで、Miro でのユーザーイベントの概要を見ることができます。これらは次の通りです。
- チーム別および合計の経時的なイベント数
-
ボードイベント:作成されたボード、開かれたボードと合計。
図19:ユーザー アクティビティー
<dashboard theme="light" version="1.1">
<label>Miro ユーザー アクティビティー</label>
<description>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>時間範囲</label>
<default>デフォルト
<earliest>-30d@d</earliest>
<latest>現在</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>組織</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="*">すべて</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>チーム</label>
<choice value="*">すべて</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>全イベント</title>
<search base="basesearch">
<query>| stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
</row>
<row>
<panel>
<chart>
<title>日付別イベント</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>チーム別イベント</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>ボード イベント</title>
<search base="basesearch">
<query>| search event = board_* | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>作成されたボード</title>
<search base="basesearch">
<query>| search event = board_created | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>
<title>ボードを開く</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>開かれたボードまたは作成されたボード</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>
セキュリティー アクティビティー
2 つ目のビジュアライゼーションはセキュリティー アクティビティーで、Miro のユーザーイベントの概要を見ることができます。これらは以下の通りです:
- ログインアクティビティー:成功および失敗したログイン数。
-
共有イベント: ボードを共有する際のユーザーイベントのリスト。
図20:セキュリティー アクティビティー
<dashboard theme="light" version="1.1">
<label>Miro セキュリティー アクティビティー</label>
<description>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>時間範囲</label>
<default>
<earliest>-30d@d</earliest>
<latest>最新</latest>
</default>
</input>
<input type="dropdown" token="organization">
<label>組織</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="*">すべて</choice>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="dropdown" token="team">
<label>チーム</label>
<choice value="*">すべて</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>ログイン成功</title>
<search base="basesearch">
<query>| search event = sign_in_succeeded | stats count</query>
</search>
<option name="drilldown">none</option>
</single>
</panel>
<panel>
<single>シングル
<title>ログインの失敗</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>認証方法ごとのログイン</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>共有イベント</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">セル</option>
<option name="refresh.display">progressbar</option>
</table>
</panel>
</row>
<row>
<panel>
<table>
<title>ファイルイベント</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>