[Splunk]ユーザーによって参照可能データを絞るテクニック


やりたいこと

  • Splunkにログインするユーザー(及びロール)によって表示可能なデータとダッシュボードを制御したい
  • Splunkを使っていると、システム担当以外のメンバー、またはチームにも特定のダッシュボードと特定のデータのみにアクセスさせる要件が出てくる
  • 単純なものであればRoleに参照indexの指定だけですむのだが、ここではindex内の特定期間のデータに絞り込んで表示制限をかけてみました。
  • イメージはこちら。ポイントは利用デバイスに利用期間情報が含まれている点です。

How to Build

  1. アカウントとデバイスに関するlookupアセットの用意
  2. 基本となるダッシュボードApp(app4sysadm)の作成
  3. ユーザ向けの参照ロール(customer_user)の作成
  4. ユーザの作成
  5. ユーサ向けダッシュボードApp(app4user)の作成
  6. Appの権限設定

1. アカウントとデバイスに関するlookupアセットの用意

  • アカウントリストのlookupを用意
    • Splunk管理画面にログインするアカウント情報(会社名、ユーザ名)を用意します
  • デバイス利用リストのlookupを用意
    • デバイスの利用履歴(device、会社名、利用期間)を用意します。

2. 基本となるダッシュボードApp(app4sysadm)の作成

  • まずは全データにアクセスできるシステム管理者向けのApp(ダッシュボード)を用意します
  • クリックしたレコードに紐づく時間をtoken化して2段目以降のパネルにわたすようなパネルを用意しました

  • 1つ目のパネルのサーチは以下のようになっています。
    • アカウント情報とデバイス情報をマージするサーチです
spl
|inputlookup account
|lookup devicelist customer 
| eval index = lower(deviceid) 
|eval pack = mvzip(mvzip(index,from,","),to,",") 
|mvexpand pack
|table username customer pack 
|rex field=pack "(?<index>.*)\,(?<from>.*)\,(?<to>.*)" 
|eval from2 = strptime(from,"%Y-%m-%d")
|eval to2 = strptime(to,"%Y-%m-%d")
|fields - pack
|table index username customer from to from2 to2
|sort  index
|rename index as デバイス名, username as Account, customer as 顧客名, from as 利用開始日, to as 利用終了日
  • lookupでマージしただけだとキレイなリストにならないので、mvzip&mvexpandしたりして加工しています。
    • まずはlookupしてマッチング
    • 次にmvzipで1フィールドに束ねてpackフィールドを作成
    • そして、packを再び展開して必要なtableに絞る
    • 最後はpackをrexコマンドでフィールド抽出

3. ユーザ向けの参照ロール(customer_user)の作成

  • まず特定データにアクセスするための最小権限にしたロールを1つ作成します

4. ユーザの作成

  • 1で作成したロールを割り当てたユーザ(user_s)を用意します

5. ユーサ向けダッシュボードApp(app4user)の作成

  • 続いてシステム管理者向けのAppをコピーしてユーザ用Appを用意します。
    • app内のメニューをシンプルにする際は[設定]-[ユーザーインターフェイス]-[ナビゲーションメニュー]-[default]にて修正
    • 編集権限をなくす際には、「6. Appの権限設定」を参考に。

  • このユーザ用Appにエッセンスを加えることで、たちまち特定期間の参照可能なデータのみにアクセス可能な画面が用意できます

  • ポイント:REST APIを使ってログインユーザを確認

SPL
|rest /services/authentication/current-context splunk_server=local 
|fields + username
|lookup account username
  • |restでsplunkにログインしているアカウント名を表示できます

  • 上の3行を追加したもの

spl
|rest /services/authentication/current-context splunk_server=local 
|fields + username
|lookup account username
|lookup devicelist customer 
|eval index = lower(deviceid) 
|eval pack = mvzip(mvzip(index,from,","),to,",") 
|mvexpand pack
|table username customer pack 
|rex field=pack "(?<index>.*)\,(?<from>.*)\,(?<to>.*)" 
|eval from2 = strptime(from,"%Y-%m-%d")
|eval to2 = strptime(to,"%Y-%m-%d")
|fields - pack
|table index username customer from to from2 to2
|sort  index
|rename index as デバイス名, username as Account, customer as 顧客名, from as 利用開始日, to as 利用終了日
  • そうするとadminでアクセスすると、adminアカウントに紐づく利用実績がdeviceのlookupにないため何もデータが表示されません。

  • しかしSplunk管理画面をログアウトして今度はuser_sでログインすると、lookup内にuser_sに関連するレコードがあるため、user_sが参照可能なデータのみ閲覧ができるようになります。

6. Appの権限設定

  • app4userのcustomer_userロールはReadにしておくことでダッシュボードの編集を制限できます
  • app4sysadのcutomer_userロールはRead/Writeのどちらもチェックを外しておくことで不要なAppは参照できなくなります。

まとめ

  • ログインアカウント名をrestのSPLコマンドで表示することができる
  • lookupを使えばフィルタ条件としても利用できる
  • mvzip&mvexpandはデータを一時的にパックして持ち運ぶのに便利