SaaS

Okta WorkflowsでDevice情報を一覧取得してManagedかどうかを可視化してみた

こんにちは!たつみんです。

以前下記のブログ記事で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

全体図は以下のとおりです。

  1. トリガーにはScheduledカードを選択し日本時間で朝9時に毎日起動するように設定をしました。(カード解説)
  2. Clear Tableカードでテーブルの初期化を行います。(カード解説)
  3. ConstructカードでAcceptとContent-Typeを作成し、それぞれapplication/jsonを指定してHeadersを作成します。(カード解説
  4. OktaアプリケーションのCustom API Actionカードでエンドポイント/api/v1/devicesに対して、Headersに3.の出力を指定します。またOptionsではGETを指定しています。(カード解説
    今回はDevices APIを利用しますので、Okta Workflows OAuthでokta.devices.manageokta.devices.readについて権限付与し、Okta WorkflowsのConnectionsでReauthorizeを忘れずに行なっておきます。
  5. List側のFor Eachカードでlist部分に4.を実行した時のレスポンスのBodyを指定します。Helper Flowで次に紹介するFlow2を指定し、Flow2のHelper Flowカードで指定したフィールドRecordにはItemを指定します。(カード解説

Flow2

全体図は以下のとおりです。

  1. トリガーはHelper Flowカードを選択し、呼び出し元であるFlow1で渡された値を受け取れるようにフィールドRecordを定義しておきます。(カード解説
  2. Get Multipleカードで1.で受け取ったRecordの中から必要な情報を取り出します。(カード解説
  3. Composeカードを使用し、APIを実行する際のURLを作成します。(カード解説)
    今回実行するAPIが以下であるため、${deviceId}にあたる部分は2.で取り出したidをドラッグ&ドロップにて当てはめています。
    /api/v1/devices/${deviceId}/users
  4. ConstructカードでAcceptとContent-Typeを作成し、それぞれapplication/jsonを指定してHeadersを作成します。(カード解説
  5. OktaアプリケーションのCustom API Actionカードでエンドポイントに対して、3.の出力を指定します。Headersに4.の出力を指定します。またOptionsではGETを指定しています。(カード解説
  6. List側のFor Eachカードでlist部分に5.を実行した時のレスポンスのBodyを指定します。(カード解説
    Helper Flowで次に紹介するFlow3を指定し、Flow3のHelper Flowカードで指定したフィールドdeviceuserにはItemを指定します。その他の項目も指定し、Flow2からFlow3へ値を渡します。

Flow3

全体図は以下のとおりです。

  1. トリガーはHelper Flowカードを選択し、呼び出し元であるFlow2で渡された値を受け取れるようにフィールドdeviceiddeviceuserなどの項目を定義しておきます。(カード解説
    この時deviceuserについてはオブジェクト側を選択する必要があります。その他の項目はテキスト型で問題ありません。
  2. Get Multipleカードで1.で受け取ったdeviceuserの中から必要な情報を取り出します。(カード解説
  3. OktaアプリケーションのRead Userカードで2.で取り出したuser.idを利用しUsernameやFirstname,Lastnameを取得します。(カード解説
  4. Create Rowカードでテーブルに定義済みのカラムに対して1.2.3.で出力として取り出したデータを指定し、格納します。(カード解説)

実行結果

以下のようにテーブルにOkta上に登録されているDeviceの情報が一覧で格納されます。

このときStatusのカラムではNOT_MANAGEDもしくはMANAGEDと明記されます。また、ひとつのデバイスに複数のユーザーが紐づいている場合はレコード1件1件独立して記載されます。

2024.01.16追記

/api/v1/devicesの結果が200件以上ある場合のことを考慮したページネーション対応については以下をご参照ください。

まとめ

この仕組みでは毎日最新の情報を一覧として見ることができるのでManagedかどうかの全体把握に役立つかと思います。また、最終出力をOkta Workflowsのテーブルとしましたが、Googleスプレッドシートなどにすれば、あらかじめピボットテーブルを設定しておいて人単位やデバイス単位で集計することも容易にできそうですね。

それでは今日はこのへんで!また別の記事でお会いしましょう?

たつみん

事業会社の情シスからクラウドネイティブにJoin!
好きなものはF1海外観戦とベルギービール!
集中力の質は深く長く遅い典型的なシングルタスクタイプです。