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

やりたいこと
----
- **Splunkにログインするユーザー（及びロール）によって表示可能なデータとダッシュボードを制御したい**
- Splunkを使っていると、システム担当以外のメンバー、またはチームにも**特定のダッシュボードと特定のデータ**のみにアクセスさせる要件が出てくる
- 単純なものであればRoleに参照indexの指定だけですむのだが、ここではindex内の**特定期間のデータ**に絞り込んで表示制限をかけてみました。
- イメージはこちら。ポイントは利用デバイスに利用期間情報が含まれている点です。
<img width="1071" alt="スクリーンショット 2020-06-01 18.31.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/a71ed508-5379-1732-de60-f29a4ce64aea.png">

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


### 1. アカウントとデバイスに関するlookupアセットの用意
- アカウントリストのlookupを用意
    - Splunk管理画面にログインするアカウント情報（会社名、ユーザ名）を用意します
- デバイス利用リストのlookupを用意
    - デバイスの利用履歴（device、会社名、利用期間）を用意します。
    
<img width="1283" alt="スクリーンショット 2020-06-01 18.32.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/c6178d1b-42e2-726a-f1cf-65fbef987911.png">


### 2. 基本となるダッシュボードApp（app4sysadm）の作成

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

![スクリーンショット 2020-06-01 19.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/31e1bbe7-4693-7f96-3b5d-c76c0a28cd03.png)

- 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してマッチング
     <img width="1031" alt="スクリーンショット 2020-06-01 21.29.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/f84f2a40-cff4-8935-0e43-ad34f10a3cbc.png">
    - 次にmvzipで1フィールドに束ねてpackフィールドを作成
    <img width="1025" alt="スクリーンショット 2020-06-01 21.29.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/e32b089a-b00a-6663-738d-4162b074b873.png">
    - そして、packを再び展開して必要なtableに絞る
    <img width="1034" alt="スクリーンショット 2020-06-01 21.30.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/689e919a-52cb-f2b9-1b9b-79d656e434e3.png">
    - 最後はpackをrexコマンドでフィールド抽出
    <img width="1026" alt="スクリーンショット 2020-06-01 21.30.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/044e4c3e-5174-90ca-b680-b26401e76217.png">



### 3. ユーザ向けの参照ロール(customer_user)の作成
- まず特定データにアクセスするための最小権限にしたロールを１つ作成します
<img width="1066" alt="スクリーンショット 2020-06-01 18.39.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/d118cb86-6f3b-bf99-bf55-7caf424282ca.png">


### 4. ユーザの作成
- 1で作成したロールを割り当てたユーザ（user_s）を用意します

<img width="847" alt="スクリーンショット 2020-06-01 18.39.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/197b7181-a1e5-29b0-fffa-f400712dcfde.png">

### 5. ユーサ向けダッシュボードApp（app4user）の作成

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

<img width="975" alt="スクリーンショット 2020-06-02 9.06.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/c3e0c7a3-2040-a591-419c-97d1abb68c18.png">

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

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

```:SPL
|rest /services/authentication/current-context splunk_server=local 
|fields + username
|lookup account username
```

- |restでsplunkにログインしているアカウント名を表示できます
![スクリーンショット 2020-05-25 13.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/90dcf016-4898-e0f6-8c37-12f16573868a.png)

- 上の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にないため何もデータが表示されません。

![スクリーンショット 2020-06-01 20.18.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/6fe6e4b6-f7f7-ba08-c482-b2f1c53175d0.png)

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

<img width="1207" alt="Untitled.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/bb971cf4-386e-f902-4450-31acedf51cc3.png">


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

<img width="965" alt="スクリーンショット 2020-06-01 18.37.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/cb12a200-ba64-ebcf-6591-58ebb48bb138.png">


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