Cloudflare ダッシュボードユーザを SCIM 連携で Okta から追加・削除する

# SCIM (System for Cross-domain Identity Management) とは
- [SCIM: System for Cross-domain Identity Management](https://scim.cloud/)

ユーザ情報を一元管理しつつ、それを他のアプリケーションに同期するための使用です。
自動化されることにより、運用管理工数の削減や権限管理の品質向上が期待できます。

>System for Cross-domain Identity Management（SCIM）仕様は、クラウドベースのアプリケーショ ンとサービスにおけるユーザ ID の管理を容易にするために設計されている。この仕様一式は、既存の認証、認可、およびプライバシー・モデルを適用しながら、 開発と統合の簡素化に特に重点を置き、既存のスキーマと展開の経験を基に構築することを 目指している。その意図は、共通のユーザスキーマと拡張モデル、および標準プロトコルを使用してこのスキーマを交換するためのパターンを提供するバインディングドキュメントを提供することによって、ユーザ管理操作のコストと複雑さを軽減することです。要するに、ユーザーをクラウドへ、クラウドから、そしてクラウド周辺へ、速く、安く、簡単に移動させることである。

# Cloudflare ダッシュボードユーザの SCIM 対応
Enterprise アカウントでは、Okta・Microsoft Entra ID と SCIM 連携できます。

- [Provision with SCIM · Cloudflare Fundamentals docs](https://developers.cloudflare.com/fundamentals/setup/account/account-security/scim-setup/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7a6be2fd-2464-0c3c-a2bf-f10d966edcb9.png)

# Okta との SCIM 連携
以下のような構成を設定します。

```mermaid:
flowchart LR
subgraph Okta
Group1[Minimal Access<br>Group]
Group2[Role Based<br>Group]
Group1 --> |Assign|SCIM[SCIM<br>Provisioning<br>App]
Group2 --> |Push Group|SCIM[SCIM<br>Provisioning<br>App]
User --> |Assign|Group1 & Group2
end
SCIM --> |Create Users<br>Deactivate Users<br>Grant Roles|CF[Cloudflare<br>SCIM API<br>Endpoint]
```

## Cloudflare API トークン作成
Cloudflare SCIM API エンドポイントとの連携に必要な API トークンを発行します。

以下のようなパーミッションが必要です。

https://dash.cloudflare.com/profile/api-tokens

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5399cc40-f4c9-e2ea-7bda-31efe7437e81.png)

## Okta アプリケーション作成
SCIM 連携で Cloudflare ダッシュボードユーザをプロビジョニングするためのアプリケーションを作成します。

カタログのテンプレートから `SCIM 2.0 Test App (OAuth Bearer Token)` を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/0226d2b2-24a7-9903-4890-c4aa333be488.png)

`Application Visibility` の2カ所にチェックがあり、`Browser plugin auto-submit` のチェックが外れていることを確認して進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e5b95b9c-aa56-6916-d7dc-c5a8ecbbe05f.png)

## Okta API Integration 設定
作成したアプリの `Provisioning > Integration` から `Configure API Integration` に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/0a863288-b441-02ca-6fbc-d06f08376270.png)

`https://api.cloudflare.com/client/v4/accounts/<your_account_ID>/scim/v2` と先ほど作成した API トークンを入力し、 `Test API Credentials` が正常に完了することを確認して保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/bda61fe2-41c3-0fa2-ef88-5b5681a29ddb.png)

:::note info
以下のエラーが出た場合には、担当の Customer Success Manager に機能有効化をご相談ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/72f2b7b7-654f-d751-df12-dcab45787f64.png)
:::

## Minimal Access グループの作成
Cloudflare ダッシュボードユーザとして作成されるための Okta グループを作成します。

このグループにアサインされたユーザーは `Minimal Account Access` ユーザとして Cloudflare ダッシュボードアカウントメンバーに追加・削除されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/bd4a61fc-32e9-a808-2639-ce0865649b01.png)

## Minimal Access グループへのアプリケーション割り当て
ユーザ作成・削除を許可するため、`Provisioning > Settings > To App` から `Create Users` と `Deactivate Users` にチェックを入れて保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/57df4364-3650-14ce-2b3f-2eff6f01de25.png)

先ほど作成した Minimal Access グループにアプリケーションをアサインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/fd6673dd-56d1-f5c3-5503-3b867176a38c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/858c9e11-ed9e-4a4e-4c46-e80296f444b2.png)

以下の `Extra info` については特に何も入力せずにそのまま `Save and Go Back` できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5816fada-4863-7efe-96ff-fcf1c1fd3c9c.png)

## Role ベースグループの作成
同様に Cloudflare ダッシュボードユーザにロールを割り当てるための Okta グループを作成します。

割り当てたいロールごとに `CF-<your_account_ID> - <Role_Name>` という形式で複数作成します。

例えば `CF-xxx - Adminitrator` グループにアサインされたユーザーには、Cloudflare ダッシュボードアカウントメンバー権限に `Administrator` ロールが割り当てられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e88fa0dd-be42-d7bf-8880-bcd517f13e90.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5dc0cd15-2286-83a3-23ec-d32b3d089c9f.png)

## Role ベースグループをアプリケーションで Push Groups に設定
`Push Groups > 歯車マーク` から `Rename groups` のチェックを外して保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/f3a5b9f8-d75b-d799-1a65-9a5b25013085.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7aa5066b-f1df-cff4-160a-985a15cd886a.png)

次に `Push Groups > Find groups by name` から、先ほど作成した `CF-xxx - Adminitrator` を指定して、同名の `Match found` した `Link Group` に紐付けて保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/91406b68-16f2-6ada-1694-56a573dd2a78.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/a32c3bd6-b993-8910-4f02-74862e817109.png)

その後、`Push Status` が `Active` になったことを確認します。

この Push Groups 設定により、ロールが割り当て設定が実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b0de0c8d-cc78-30e4-b27e-3ef84902313e.png)

# SCIM 連携の動作確認
## ユーザ追加
Okta ユーザを Minimal Access グループにアサインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/9c7411e9-6438-07d8-7d2e-da689dfe38c1.png)

Cloudflare ダッシュボードを見ると、 `Minimal Account Access` なユーザとしてすぐに作成されることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/23d913fb-2b78-69be-b488-babe57a4c1d3.png)

Audit Log でも以下のように確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/870ad101-bcdf-aaf8-332a-cb85835c81b8.png)

## ロール割り当て
Okta ユーザを `CF-xxx - Adminitrator` グループにアサインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/0165ad11-c699-f21c-9a51-951929cfc698.png)

Cloudflare ダッシュボードを見ると、 `Administrator` 権限がすぐに割り当てられることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/9ffffc4d-694a-d854-29f1-14c86c6f20f3.png)

Audit Log でも以下のように確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/fa255ea7-137c-1164-6be8-057782411f03.png)

## ユーザ削除

Okta ユーザを Minimal Access グループから削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/80247b58-de1b-3579-d558-62096ec270a4.png)

Cloudflare ダッシュボードを見ると、 ユーザがすぐに削除されることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/aa6cf44e-8f91-e3df-324c-fdaf5f60a473.png)

Audit Log でも以下のように確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/f6079812-ba29-a057-cc72-38b64950cac3.png)

# まとめ

SCIM 連携を使えば、Okta 側での Group 追加・削除により、Cloudflare ダッシュボードユーザ権限と同期して管理できることが確認しました。

他のアプリケーションも含めて、自動で反映できる仕組みは非常に便利なため、ユーザ数が多いエンタープライズ企業では特に欠かせないところかなと思います。