見出し画像

BoxのEventAPIのレスポンスを特定ユーザでフィルタしたい

BoxのAdventカレンダー5日目を担当します。だーはら(@daharatech)です。
BoxのEventAPIについて取り上げたいと思います。

要約

1.EventAPIをadmin_logsで叩くと全ユーザ分のログが返却される
2.インシデントやアノマリーの調査にあたって、特定ユーザのみのログが欲しいケースがあるが、BoxのEventAPIには特定のユーザを絞り込むフィルタのパラメータが存在しない
3.as-userヘッダーを使ってAPIを実行するユーザを変更し、該当ユーザのみのログを返却させればOK

どうしてフィルタリング?

Boxの管理者をしていると時折、こういった質問をユーザから受けることはありませんか?

昨日まであったファイルが見当たらない!誰が操作していたのか調べてほしい。
退職するユーザがBoxからデータを持ち出していないか調べることはできないか?

他にも、BoxShiled等を利用しているテナントでは、Box Shieldで示唆されたイベントに対して、特定ユーザのイベントを取得して調査する必要が生じるケースもあるでしょう。

もし、手動でBoxのレポートを出力したもので事足りるようでしたら問題ありません。なぜならBoxのレポートは2021年7月から特定のユーザに絞ったレポートを出力可能になっているからです。

他方、他のサーバに特定のユーザに絞ったログを送付したり、他のアプリケーションに特定ユーザのログを表示したりしたい時は、BoxのEvent APIを利用する必要があります。

BoxのEventAPIとは?

BoxはAPIを利用してユーザの操作ログを取得することができます。操作ログとは「ログイン」や「ダウンロード」「ファイル削除」等のユーザが行うアクションを記録したものです。

EventAPIによるログは最大1年前まで遡ることが可能です。
ちなみに、管理者アカウントが管理者コンソールからレポート出力をすることで操作ログ等を出力することも可能で、こちらは最大7年間保管されています。

Box EventAPIの詳細はコチラ。
https://ja.developer.box.com/reference/get-events/

画像1

Event APIを特定ユーザに絞って出力するパラメータは?

指定したユーザーまたは会社全体の過去のイベントを最大1年間遡って返します。

との記載がEventAPIのリファレンスありますので、きっとユーザを指定するパラメータが…

画像2

ユーザを指定するパラメータが…ない!!!

stream_typeというパラメータのユーザに関するオプションは「all」と「admin_logs」しかありません。
all:APIを認証したユーザのイベント(操作ログ)を出力するオプション
admin_logs:いまログインしているBoxすべてのイベント(操作ログ)を出力するオプション ※プライマリ管理者あるいは共同管理者の権限が必要です

つまり「自分のログ」か「会社全体のログ」しかオプションで選ぶことができません。困った。

Event APIを特定ユーザに絞って出力するには?

実はガイドのユーザイベントの取得ページに特定ユーザのイベントを出力させる方法が書かれています。

画像4

別のユーザーのイベントフィードを取得するには、as-userヘッダーか、そのユーザーの実際のアクセストークンを使用します。

なるほど。自分のログしか返却されないなら、「ログを取得したい人」としてAPIを叩けばよいということですね。

as-userヘッダーって何?

as-userヘッダーについて補足しておきたいと思います。
APIを実行しているユーザとは別のユーザとしてAPIを実行する際に、APIのHTTPリクエストヘッダーに付与するas-userパラメータのことをas-userヘッダーと呼びます。
as-userヘッダーについて詳しくはコチラ

以下はBox社提供のガイドから引用したas-userヘッダーを利用する際のリクエスト方法です。LinuxやMacであればこの通りに実行するだけで[USER_ID]で指定された人としてAPIを実行できます。
[USER_ID]を調べる方法はコチラを参照してください。リンク先のfilter_termパラメータ等を利用して該当ユーザの[USER_ID]を特定してください。

curl https://api.box.com/2.0/folders/0 \
 -H "as-user: [USER_ID]"
 -H "authorization: Bearer [ACCESS_TOKEN]"

Windows環境でPowerShellを利用してAPIを叩く場合、以下のような方法でas-userヘッダーを付与することができます。


$uri = 'https://api.box.com/2.0/folders/0'
$header = @{'Authorization'='Bearer [ACCESS_TOKEN]'; 'as-user'=[USER_ID]}
Invoke-RestMethod -Uri $uri -Method Get -Headers $header -ContentType 'application/json'

このas-userですが、単に叩けばよいというものではなく、Boxアプリ側でas-userとして実行可能とするか設定しておく必要があります。設定箇所はBoxアプリの「構成」タブを開いて「高度な設定」にあります。「as-userヘッダーを使用してAPI呼び出しを行う」にチェックを付けることで、as-userヘッダーを利用したAPIアクセスができるようになります。

画像4

★ 注意 ★

as-userヘッダーは本件のようなケースにおいて非常に有効ですが、言い換えれば誰にでも成り代わってAPIが実行できてしまう危うさも持ち合わせています。そのため、as-userヘッダーの使用を有効化できるのは、以下の条件を満たす場合のみに限られます。

1.JWTによるアプリ認証であること
2.「管理者」「共同管理者」「サービスアカウント」による認証ユーザによってAPIが実行されること
3.「共同管理者」によるAPI実行を行う場合、as-userヘッダーを利用するにはアプリケーションスコープの「ユーザーを管理する」も有効化する必要がある
(3は英語版のガイドには記載があるのに、日本語版のガイドには記載がない…)

ざっくりまとめると「管理者が認めない限りas-userでAPI叩くことは許さん」ということです。

APIを叩く具体的な方法は?

Powershellを利用してas-userを利用したEventAPIの叩く一連の流れを記載します。

1.まずはユーザのIDを特定します。
例としてメールアドレスに「dahara」の文字列が存在するユーザのIDを取得してみましょう。

$token = "abcd..."
$header = @{"Authorization"="Bearer $token"}
$request = "https://api.box.com/2.0/users?filter_term=dahara"
$result = Invoke-RestMethod -Uri $request -Method Get -Headers $header -ContentType "application/json"
Write-Host $result.entries

type               : user
id                 : 123456789
name               : dahara
login              : dahara.hrd@hogehoge.com
created_at         : 2018-10-24T10:40:19-07:00
modified_at        : 2021-11-29T04:40:00-08:00
language           : ja
timezone           : Asia/Tokyo
space_amount       : 107374182400
space_used         : 574223760
max_upload_size    : 2147483648
status             : active
job_title          : none
phone              : 
address            : 
avatar_url         : https://app.box.com/api/avatar/large/123456789
notification_email : {}

id : 123456789がユーザのIDですね。もし複数のユーザがヒットした場合、返却されるjsonのentriesに複数個の結果が配列として入ります。

2.ユーザIDを利用してas-userヘッダーを用意します。

$header = @{"Authorization"="Bearer $token"; "as-user"="123456789"}

3.EventAPIを叩きます。

$base_url = "https://api.box.com/2.0/events"
$request = $base_url + "?limit=500&stream_type=all"
$events = Invoke-RestMethod -Uri $request -Method Get -Headers $header -ContentType "application/json"
Write-Host $events.entries

type        : event
event_id    : 761db30a187be2cf0f3978ce4326fe3417117aa3
created_by  : @{type=user; id=123456789; name=dahara; login=dahara.hrd@hogehoge.com}
created_at  : 2021-11-27T06:01:34-08:00
recorded_at : 2021-11-27T06:01:35-08:00
event_type  : ITEM_PREVIEW
session_id  : w3z03mgwu2280bh9
source      : @{type=file; id=715042035050; file_version=; sequence_id=0; etag=0; sha1=296bb6e85a81bd54c10
             543af3e801caae3bc9b26; name=テスト.pdf; description=; size=206300; path_collection=; created_at
             =2020-09-03T03:16:31-07:00; modified_at=2020-09-03T03:16:31-07:00; trashed_at=; purged_at=; 
             content_created_at=2020-09-03T03:13:01-07:00; content_modified_at=2020-09-03T03:13:01-07:00;
              created_by=; modified_by=; owned_by=; shared_link=; parent=; item_status=active; synced=Fal
             se}

type        : event
event_id    : 772b7ac819d2c32f3cf05aabcf90f171a1995b8f
created_by  : @{type=user; id=123456789; name=dahara; login=dahara.hrd@hogehoge.com}
created_at  : 2021-11-27T06:02:00-08:00
recorded_at : 2021-11-27T06:02:00-08:00
event_type  : ITEM_CREATE
session_id  : 
source      : @{type=folder; id=151028323260; sequence_id=0; etag=0; name=testfolder; created_at=2021-11-2
             7T06:01:59-08:00; modified_at=2021-11-27T06:01:59-08:00; description=; size=0; path_collecti
             on=; created_by=; modified_by=; trashed_at=; purged_at=; content_created_at=2021-11-27T06:01
             :59-08:00; content_modified_at=2021-11-27T06:01:59-08:00; owned_by=; shared_link=; folder_up
             load_email=; parent=; item_status=active; synced=False}

これで指定したユーザの操作ログのみ出力することができました。

結論

特定のユーザの操作ログが欲しいときはas-userヘッダーを使ってEventAPIを叩こう!

以上。

ついでの宣伝

admin logs streaming
今回はEventAPIを叩きました。実は先日
admin_logs_streamingという新しいEventAPIが公開されました。これらは「別のAPI」として提供されるので、今回叩いたEventAPIが拡張されたり、変更されたりするわけではありません。

Box Japan Cloud Connections
Boxの日本ユーザコミュニティです。私がリーダーを務めています。
コミュニティに参加するとコミュニティSlackに参加でき、いろいろなBoxerたちと横のつながりを持つことができます。ご興味あれば参加してみてください。

画像5


この記事が気に入ったらサポートをしてみませんか?