Okta Access Requests & Okta Workflowsで使いたいときにだけ使えるWi-Fiを用意する話

# はじめに

この記事は[株式会社ビットキー 情シス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/bitkey-corp-eng) の21日目の投稿です。

はじめまして。@y_okeです。情シス内で色々な社内システムを内製しています。

登板3回目、今週も木曜日の投稿となりました。好きなタイプはくさタイプです。

# 記事の要約

- 社内でユーザーや時間を限定してWi-Fiを使わせたいニーズがあるよ
- MerakiはAPI経由でWi-Fiの制御ができるよ
- Okta Access Requests & Okta Workflowsで制御してみよう！

# 課題

- 製品やアプリの検証等でWi-Fiを使いたいという要望がたまにある
- 検証用のWi-Fiを常時吹いていると、用途外の使用をされてしまい、本来使いたい業務PC用の帯域も圧迫してしまう
- 一定時間だけ使える、かつ申請者以外は使えないWi-Fiを用意したらいいんじゃないか？

# 要件と解決策

- Okta Access Requestsで申請したら、Meraki Dashboard APIを実行するようにしたい
    - Okta Workflowsを使えば繋げられそう
- Wi-Fiの不適切な申請や利用は防止したい
    - [12/12の記事](https://qiita.com/h_r_w_t_r/items/181518fa2c3fe6694cfa#case2%E7%89%B9%E5%AE%9A%E3%81%AEsaas%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AF%E4%B8%80%E6%99%82%E7%9A%84%E6%9C%89%E5%8A%B9%E6%9C%9F%E9%99%90%E4%BB%98%E3%81%8D%E3%81%AB%E3%81%97%E3%81%9F%E3%81%84)の内容で行けるよ
        - 今回はCase2を使うよ
        - 上の記事と同じ内容はここでは割愛

# メリット

- 申請・承認業務は残すものの、ユーザーが使いたいときに申請すればほぼ自動で、かつ時限付きで特定のWi-Fiを使用可能状態にすることが出来る
- いつ誰が申請し承認したのかがログに残るため、不適切な利用等の確認・防止につながる

# やってみた

:::note warn
### 前提
- 今回は、任意のパスワードでWi-Fiを有効化し、一定時間経過後、もしくは任意のタイミングで無効化するユースケースを想定
- 実運用時はステークホルダーの意見を聞いて機能・UI共にアップデートする予定
:::

## 1. Meraki Dashboard APIキーの取得

- `Organization`→`API & webhooks`

    ![Untitled (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/5d917901-7222-6c11-ee03-8504c928c99f.png)
    
- `API keys and access`→`Generate API Key`を選択してAPI Keyを発行
    
    ![Untitled (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/30d3661f-9961-a1db-6e89-ec780d635303.png)

- コピーできるのはこの瞬間だけなので、安全な場所へ保存しておくこと

    ![Untitled (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/2557ca1e-d3e8-e8b4-8dd2-ea25c41774b7.png)

## 2. Okta Workflowsの設定

- Okta Workflowsを作成
    - Okta Workflowsへログインし、New Flowを押す
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/33457baa-4e57-fb5a-73a0-5a22db392241.png)

    - イベントを作成する
        - `Add event`を押して`Delegated Flow`を選択

            ![Untitled (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/1eb04be3-6d1f-12c0-2121-96efd56bf24e.png)

            ![スクリーンショット 2023-12-21 10.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/170b64a1-ae33-5e18-7264-f6a8540d4c00.png)

        - 入力変数として`有効/無効を示す値`と`パスワード`を用意
            - `Click or drag to create`をクリックして変数名を入力
            ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/53312dd0-e867-50e9-a838-fc73979a51ec.png)

    - アクションを作成する
        - [Meraki Dashboard API公式ドキュメント](https://developer.cisco.com/meraki/api-v1/)を参考にしてAPIコネクタを作る
            - 今回は[update-network-wireless-ssid](https://developer.cisco.com/meraki/api-v1/update-network-wireless-ssid/)を実行する
                - headerは公式の通りに設定
                    - 先程取得したAPI Keyを入力
                - bodyは`enabled`と`psk`の2つ
                    - 入力変数から加工する
        - 二重で有効化してパスワードが上書きされるのを防ぐ処理も入れてある
            - 一度[get-network-wireless-ssid](https://developer.cisco.com/meraki/api-v1/get-network-wireless-ssid/)を実行して、状態が`enalbed`かつ入力変数が`有効化する`ならば止める
    - フローの全体イメージ
            
        ![スクリーンショット 2023-12-21 13.24.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/ae8846f4-ae0c-c401-54db-c5c57903a9f0.png)

- 作成したOkta WorkflowsをOkta Access Requestsに表示させる
    - Okta Access Requestsの`Setting`→`Resource`を開き、`Update now`を押して同期させる
これをすることで、`Run a workflow`で選択できるようになる

        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/4b53fc62-3b38-74dc-9b57-60eacc712350.png)

    :::note
    本当はOkta Access Requests上にOkta Workflowsのフローを表示するためには、この他にも色々と設定が必要だったそうです。その作業はこっそりと他の人(@h_r_w_t_r)がやってくれていたのですが、当時は知りませんでした。
    その部分の説明について聞きたい方は、本人にX(旧Twitter)で聞いてみてください。

## 3. Okta Access Requestsの設定
:::note warn
- 今回は前提条件からUIとして以下を用意
    - Wi-FIの有効化・無効化を指示するためのセレクトメニュー
    - 任意のパスワードを入れるためのテキストボックス
:::

- 基本的な作成方法は[12/12の記事](https://qiita.com/h_r_w_t_r/items/181518fa2c3fe6694cfa)を参照
- Questionsの入力欄は2つ
    - `Wi-Fiを有効にしますか？`はドロップダウンリストにして固定値を選択してもらう
    - `パスワードを〜`はテキストフィールドで任意の文字を入れてもらう

        ![スクリーンショット 2023-12-21 13.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/1c0ea087-fbde-3926-5d2c-cb6c3993f9c5.png)

- Actionでは`Run a workflow`を選択
    - ユーザーが入力した値をOkta Workflowsに渡す

        ![スクリーンショット 2023-12-21 13.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/d7a61c3c-2e13-a40f-8e1c-df2f816cf447.png)

    - 記事公開(2023/12)時点ではWorkflowに任意の固定値は渡せないので、無効化するときは仕方なくメールアドレスを渡している

        ![スクリーンショット 2023-12-21 13.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/b6cd562b-d01b-0956-a7dc-4c021c8ad6ad.png)


## 4. 実践

- 申請前のMeraki Dashboardの状態

    ![Untitled (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/d31dc263-f4d0-157d-f539-0e60f4397d0f.png)
    
- 申請(Slackから行った場合)

    ![image_slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/8beb9a05-fb91-b780-9b72-f85e366baa6a.png)
    
- Okta Access Requests承認後、Wi-Fiが有効化され、パスワードが変更される
    
    ![Untitled (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/4b031bf9-5aaa-74b3-a3b9-8ea4bdc76d22.png)
    
- Meraki管理画面にはAPIで変更した旨のログが残る
    
    ![スクリーンショット 2023-12-20 20.31.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495455/8d929b5e-5854-d467-4502-f3798adb73a6.png)    

# 継続課題

- 申請後に他の人から申請があった場合も時間延長はされない
    - Okta Access Requestsのタイマーは途中で終了できないため、必ず指定時間後に無効化処理が走る
        - うまいやり方が無いか考え中
- Okta Access Requestsのタイマー時間にユーザー入力変数は使えず、固定値しか扱えない
    - 現時点では仕様なのでしょうがない
- Okta Access RequestsのAudienceを編集していると、偶にワークフロー自体が消えてしまう
    - 権限上見えないところにいる気はするが、何か手立てはないだろうか
- 有効化するAPを限定したい
    - 入力の選択肢を増やして、選択肢に応じてAPを割り当てるようにする、とかはAPIをうまく使えばできるはず

# 最後に

- Okta Access Requestsは簡単に承認WFが作れる良いノーコードワークフローツール
- Okta Workflowsは任意のAPIを実行できる、高機能なノーコードワークフローツール
- Okta Access RequestsとOkta Workflowsを組み合わせることで、様々なサービスを申請・承認行為付きで連携できる可能性が示せた