Cloudflare Zero Trust の Device UUID デバイスポスチャを Microsoft Intune を使って iOS に実装する

# デバイスポスチャとは
NISTによるゼロトラストの考え方④にあるように、要求する資産の状態によって動的にアクセスが決定されることが望ましいです。

- [NIST SP800-207 「ゼロトラスト・アーキテクチャ」の解説と日本語訳 | PwC Japanグループ](https://www.pwc.com/jp/ja/knowledge/column/awareness-cyber-security/zero-trust-architecture-jp.html)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5cb66473-51f8-a175-16a9-573ac4f887a7.png)

そのためには、デバイスにエージェントを導入することでポリシー評価に使える選択肢が増え、ポリシーをより強固なものにできます。

- [Device posture · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/devices/)

例えば、Cloudflare WARP エージェント導入によって確認可能な属性のうちの一つに Device UUID があります。

- [WARP client checks · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/devices/warp-client-checks/)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/1261845d-9f27-a123-b03b-3bc0173e9017.png)

# Device UUID とは
iOS, Android, ChromeOS 向けにモバイルデバイス管理 (MDM) ソリューションでパラメータとして埋め込み利用可能なユニークなデバイス識別子です。

- [Device UUID · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/devices/warp-client-checks/device-uuid/)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/78cce12c-0d1c-8e20-71da-c78d59b0a05f.png)
> Cloudflare Zero Trust は、MDMファイルに提供されたデバイスUUIDに基づいてZero Trustルールを構築することができます。これらのルールを作成して、企業のデバイスから接続するユーザーだけがアプリケーションへのアクセスを許可されるようにすることができます。

例えば macOS では `uuidgen` コマンドにより、任意の UUID を生成可能です。

```
% uuidgen
EDB56A9E-060C-43CE-95AA-F1A1A76647CA
```

# Microsoft Intune を使う場合

Microsoft Intune のようなモバイルデバイス管理 (MDM) ソリューションで、Device UUID を管理パラメータとして利用するには、MDM 構成ファイル内でパラメータ定義を共通化しつつも、デバイスごとにユニークな識別子として動的に付与される必要があります。

Microsoft Intune を使う場合には、`{{deviceid}}` を使って実現が可能です。

- [プロパティ リストで使用されるトークン - 管理対象の iOS/iPadOS デバイスのアプリ構成ポリシーを追加する - Microsoft Intune | Microsoft Learn](https://learn.microsoft.com/ja-jp/mem/intune/apps/app-configuration-policies-use-ios#tokens-used-in-the-property-list)
> さらに、Intuneでは、プロパティ リストで次のトークンの種類がサポートされています。
{{userprincipalname}} — たとえば、 John@contoso.com
{{mail}}—たとえば、 John@contoso.com
{{partialupn}}—たとえば、 John
{{accountid}} — たとえば、 fc0dc142-71d8-4b12-bbea-bae2a8514c81
{{deviceid}} — たとえば、 b9841cd9-9843-405f-be28-b2265c59ef97
{{userid}} — たとえば、 3ec2c00f-b125-4519-acf0-302ac3761822
{{username}}—たとえば、 John Doe
{{serialnumber}} — たとえば、F4KN99ZUG5V2 (iOS/iPadOS デバイスの場合)
{{serialnumberlast4digits}} — たとえば、G5V2 (iOS/iPadOS デバイスの場合)
{{aaddeviceid}} — たとえば、 ab0dc123-45d6-7e89-aabb-cde0a1234b56
{{issupervised}} — たとえば、 True (iOS/iPadOS デバイスの場合)


# 実装手順

- [Device UUID · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/devices/warp-client-checks/device-uuid/)

## Cloudflare WARP の iOS アプリを Microsoft Intune に追加
こちらの手順に沿って進めます。

- [iOS ストア アプリを Microsoft Intune に追加する | Microsoft Learn](https://learn.microsoft.com/ja-jp/mem/intune/apps/store-apps-ios)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e9db2551-4b83-f192-bfaa-7ea0eeaec5c1.png)

割り当てに関しては「Available with or without enrollment  - Included - All users」のようにしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/f1a83acd-b275-05d6-1b5e-a0465c62232e.png)

## iOS デバイスのアプリ構成ポリシーを追加
こちらの手順に沿って進めます。

- [管理対象の iOS/iPadOS デバイスのアプリ構成ポリシーを追加する - Microsoft Intune | Microsoft Learn](https://learn.microsoft.com/ja-jp/mem/intune/apps/app-configuration-policies-use-ios)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e2f9a9ab-5d20-c05e-1b8e-da55d84fd2b5.png)

Cloudflare WARP アプリで構成可能なのパラメータドキュメントを参考にしつつ、以下のような XML コードを設定します。

- [Parameters · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/parameters/)
- `unique_client_id` は `{{deviceid}}` としてください。
- サービストークンでの認証を想定しているため、 `auth_client_id`, `auth_client_secret` を使いますが、こちらはあくまで任意です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/58de48b6-9a7e-d69d-3a53-bb6d14a5cb29.png)

```xml:
<dict>
    <key>organization</key>
    <string>YOUR_TEAM_NAME</string>
    <key>service_mode</key>
    <string>warp</string>
    <key>onboarding</key> 
    <false />
    <key>switch_locked</key> 
    <false />
    <key>auto_connect</key> 
    <integer>0</integer> 
    <key>unique_client_id</key>
    <string>{{deviceid}}</string>
    <key>auth_client_id</key>
    <string>xxxxx.access</string>
    <key>auth_client_secret</key>
    <string>xxxxx</string>
</dict>
```

割り当てに関しては「Included groups - All users」のようにしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/1dd3ce79-e72b-5244-c548-6e13acf9667a.png)

## Intune で iOS デバイスの管理設定と登録
こちらの手順を参照して進めます。

- [組織で利用する iOS/iPadOS デバイスを Microsoft Intune で管理する | 株式会社イルミネート・ジャパン](https://www.illuminate-j.jp/blog/m365_security09_iosintune)

iOS デバイスに Microsoft Intune ポータルサイトがインストールでき、デバイス登録されると Intune 管理画面でも iOS デバイスの登録が確認できます。

`{{deviceid}}` は URL やハードウェア情報から `b046d188-587c-4780-a4f4-af308b8483d2` と確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/408c4ade-9dc3-4ee8-dc2f-8ad1792c19dd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/d9bba054-c51d-2a4f-0918-cbce862c2986.png)

## iOS デバイスに Cloudflare WARP アプリをインストール

Microsoft Intune ポータルサイトから、Cloudflare WARP アプリをインストールします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/f250d4ae-e7f7-9559-77c6-05af091a2fe4.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/3c937314-7b25-8803-6613-cd1791a0a260.png" width=50%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2d6909c8-1820-4bd5-0ede-03b35425808f.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5e071a2f-5181-be75-70b3-6c65c7dd7d13.png" width=50%>

すると、iOS デバイスのアプリ構成ポリシーが適用され、

`unique_client_id` が `b046d188-587c-4780-a4f4-af308b8483d2` と確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/49898e43-0ea1-9372-6b54-dca216ec4493.png)

## Cloudflare Zero Trust で Device UUID リストを作成
Microsoft Intune の画面から Device ID を CSV で Export します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/fd281c60-de06-2a22-4203-2446dbbc7144.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/48baf5b6-870c-7723-b99d-b64d41e2ac34.png)

Cloudflare Zero Trust にアップロードする際には、以下のような形式にします。

```csv:intune_device_ids.csv
b046d188-587c-4780-a4f4-af308b8483d2
4AAB72DD-DB05-4F2D-8754-815B17B43123
...
```

以下の手順で Cloudflare Zero Trust で Device UUID リストを作成します。

- [Lists · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/policies/filtering/lists/#create-a-list-from-a-csv-file)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e92f452f-45dd-a65c-2e92-74a36d4cec25.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b84e6c2b-6e1c-0384-1c52-1c6ef73e1c98.png)


## Cloudflare Zero Trust で Device UUID デバイスポスチャチェックを作成
以下の手順で Device UUID デバイスポスチャチェックを作成します。

- [Enable the posture check · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/devices/warp-client-checks/device-uuid/#3-enable-the-posture-check)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/c7bda33f-66da-ff4b-ccb8-757f815660a6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/bf2349f1-1926-6d36-94ff-605bc7451571.png)

# 確認

## デバイス情報
以下のように Device UUID デバイスポスチャチェックが `PASSED` になっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/13ea2988-f5b8-9cab-b7f5-cae15199f409.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/add89551-c103-1ddf-d1df-0773a57eac23.png)

## ポスチャログ
以下のように確認できます。

- [Posture logs · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/insights/logs/posture-logs/#posture-logs)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/a1260c32-4361-2111-de51-13e856565d52.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b7fe68ae-84ec-6988-4298-64b0e885087f.png)

# デバイスポスチャに関する留意点

- [Policy enforcement rate · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/devices/#policy-enforcement-rate)
> - デフォルトでは、WARPクライアントは5分ごとにデバイスの状態変化をポーリングします。何らかの理由で新しい姿勢結果がCloudflareエッジ上で更新されない場合、前回の結果は24時間有効です。ポーリング頻度を変更するには、APIを使用してスケジュールパラメーターを更新してください。
> - デフォルトでは、ポスチャチェックの結果は新しいデータによって上書きされるまで有効です。APIを使用して有効期限を指定することができます。ポーリング頻度よりも長い有効期間を設定することをお勧めします。
> - アクセスは、姿勢チェックのポーリング頻度と同じ速度でデバイスの姿勢変更を検出します。
> - ゲートウェイはすべてのリクエストに対してネットワークおよびHTTPポリシーを評価するため、ポスチャ結果のローカルキャッシュを5分ごとに更新します。そのため、ゲートウェイポリシーは追加の5分間遅れが発生します。例えば、10分間隔でポーリング頻度を設定した場合、デバイス上での姿勢変更を検出するまで最大15分かかる可能性があります。

- [List Device Posture Rules · Cloudflare API Documentation](https://developers.cloudflare.com/api/operations/device-posture-rules-list-device-posture-rules)

```shell:
export ACCOUNT_ID='YOUR_ACCOUNT_ID'

curl -s --request GET \
  --url https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/devices/posture \
  --header 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" | jq
```

```json:result.json
{
      "input": {
        "id": "1b6f414f-797e-4dbe-8c22-81aaf19e94ea"
      },
      "match": [
        {
          "platform": "ios"
        }
      ],
      "schedule": "5m",
      "id": "66249458-a588-46dd-b270-3dbe170c9df3",
      "type": "unique_client_id",
      "description": "",
      "name": "Intune Device ID Check",
      "expiration": null
    },
```