こんにちは!たつみんです。
以前下記のブログ記事でOktaのシステムログからeventTypeを拾ってSlackへ通知するというFlowによってDevice Trustの状況つまりManagedになったかどうかを通知する仕組みを実装しました。この実装はイベント発生時に即時通知ができるという点ではよかったのですが、このFlowを導入する前の状況が掴めないという点と、現時点で見た時に全体がどうなっているかを把握したいというニーズにはマッチしませんでした。
そこで今回はWorkflows実行のタイミングでDeviceの情報を一覧として出力する方法を解説します。
幸いにも以下のドキュメントに記載のAPI /api/v1/devices/${deviceId}/users
を利用することでデバイスに紐づくユーザー一覧が取得できます。この時にユーザー毎にmanagementStatusという項目が取得できますのでこちらを活用します。
Okta Workflowsの設定
概要
今回作成したのは1個のTableと3個のFlowで構成されます。
- データ蓄積用テーブル
- Flow1:1日に1回実行し、Oktaに登録されているDevice一覧を取得しFlow2へDevice1件ずつ渡す
- Flow2:Flow 1の情報を受け取ってDeviceに紐づいているUser一覧を取得し、Flow3へUser1件ずつ渡す
- Flow3:Flow 2の情報を受け取ってUserに紐づいているmanagementStatus等の情報を取得し、テーブルへ格納
テーブル作成
Oktaに登録されたDevice情報とUser情報を格納するための下図のようなテーブルを作成します。
Flow1
全体図は以下のとおりです。
- トリガーにはScheduledカードを選択し日本時間で朝9時に毎日起動するように設定をしました。(カード解説)
- Clear Tableカードでテーブルの初期化を行います。(カード解説)
- ConstructカードでAcceptとContent-Typeを作成し、それぞれ
application/json
を指定してHeadersを作成します。(カード解説) - OktaアプリケーションのCustom API Actionカードでエンドポイント
/api/v1/devices
に対して、Headersに3.の出力を指定します。またOptionsではGETを指定しています。(カード解説)
今回はDevices APIを利用しますので、Okta Workflows OAuthでokta.devices.manage
とokta.devices.read
について権限付与し、Okta WorkflowsのConnectionsでReauthorizeを忘れずに行なっておきます。 - List側のFor Eachカードでlist部分に4.を実行した時のレスポンスのBodyを指定します。Helper Flowで次に紹介するFlow2を指定し、Flow2のHelper Flowカードで指定したフィールド
Record
にはItemを指定します。(カード解説)
Flow2
全体図は以下のとおりです。
- トリガーはHelper Flowカードを選択し、呼び出し元であるFlow1で渡された値を受け取れるようにフィールド
Record
を定義しておきます。(カード解説) - Get Multipleカードで1.で受け取った
Record
の中から必要な情報を取り出します。(カード解説) - Composeカードを使用し、APIを実行する際のURLを作成します。(カード解説)
今回実行するAPIが以下であるため、${deviceId}にあたる部分は2.で取り出したidをドラッグ&ドロップにて当てはめています。/api/v1/devices/${deviceId}/users
- ConstructカードでAcceptとContent-Typeを作成し、それぞれ
application/json
を指定してHeadersを作成します。(カード解説) - OktaアプリケーションのCustom API Actionカードでエンドポイントに対して、3.の出力を指定します。Headersに4.の出力を指定します。またOptionsではGETを指定しています。(カード解説)
- List側のFor Eachカードでlist部分に5.を実行した時のレスポンスのBodyを指定します。(カード解説)
Helper Flowで次に紹介するFlow3を指定し、Flow3のHelper Flowカードで指定したフィールドdeviceuserにはItemを指定します。その他の項目も指定し、Flow2からFlow3へ値を渡します。
Flow3
全体図は以下のとおりです。
- トリガーはHelper Flowカードを選択し、呼び出し元であるFlow2で渡された値を受け取れるようにフィールド
deviceid
やdeviceuser
などの項目を定義しておきます。(カード解説)
この時deviceuser
についてはオブジェクト側を選択する必要があります。その他の項目はテキスト型で問題ありません。 - Get Multipleカードで1.で受け取った
deviceuser
の中から必要な情報を取り出します。(カード解説) - OktaアプリケーションのRead Userカードで2.で取り出した
user.id
を利用しUsernameやFirstname,Lastnameを取得します。(カード解説) - Create Rowカードでテーブルに定義済みのカラムに対して1.2.3.で出力として取り出したデータを指定し、格納します。(カード解説)
実行結果
以下のようにテーブルにOkta上に登録されているDeviceの情報が一覧で格納されます。
このときStatusのカラムではNOT_MANAGEDもしくはMANAGEDと明記されます。また、ひとつのデバイスに複数のユーザーが紐づいている場合はレコード1件1件独立して記載されます。
2024.01.16追記
/api/v1/devices
の結果が200件以上ある場合のことを考慮したページネーション対応については以下をご参照ください。
まとめ
この仕組みでは毎日最新の情報を一覧として見ることができるのでManagedかどうかの全体把握に役立つかと思います。また、最終出力をOkta Workflowsのテーブルとしましたが、Googleスプレッドシートなどにすれば、あらかじめピボットテーブルを設定しておいて人単位やデバイス単位で集計することも容易にできそうですね。
それでは今日はこのへんで!また別の記事でお会いしましょう?